En liten bakdörr på Flask eller hur man styr en dator i ett lokalt nätverk

Hej Habr!

Jag såg nyligen en nedladdad version av programmeringsströmmen "Hur man skapar din egen webbapplikation i Flask." Och jag bestämde mig för att konsolidera mina kunskaper i något projekt. Under en lång tid visste jag inte vad jag skulle skriva och idén kom till mig: "Varför inte göra en mini-bakdörr i Flask?"

De första alternativen för implementeringar och funktioner för bakdörren dök genast upp i mitt huvud. Men jag bestämde mig för att omedelbart göra en lista över bakdörrsfunktioner:

  1. Vet hur man öppnar webbplatser
  2. Har kommandoradsåtkomst
  3. Kunna öppna program, bilder, videor

Så den första punkten är extremt enkel att implementera med hjälp av webbläsarmodulen. Jag bestämde mig för att implementera den andra punkten med OS-modulen. Och den tredje är också via OS-modulen, men jag kommer att använda "länkar" (mer om det senare).

Att skriva en server

Så, *drumroll* all serverkod:

from flask import Flask, request
import webbrowser
import os
import re

app = Flask(__name__)
@app.route('/mycomp', methods=['POST'])
def hell():
    json_string = request.json
    if json_string['command'] == 'test':
        return 'The server is running and waiting for commands...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Site opening ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Command execution ' + json_string['data'] + '...'
    if json_string['command'] == 'link':
        links = open('links.txt', 'r')
        for i in range(int(json_string['data'])):
            link = links.readline()
        os.system(link.split('>')[0])
        return 'Launch ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Jag har redan dumpat all kod, det är dags att förklara essensen.

All kod körs på den lokala datorn på port 5000. För att interagera med servern måste vi skicka en JSON POST-förfrågan.

JSON begäran struktur:

{‘command’:  ‘comecommand’, ‘data’: ‘somedata’}

Tja, det är logiskt att "kommando" är kommandot vi vill köra. Och 'data' är kommandoargumenten.

Du kan skriva och skicka JSON-förfrågningar för att interagera med servern manuellt (förfrågningar hjälper dig). Eller så kan du skriva en konsolklient.

Att skriva en klient

Kod:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Written on Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Author: ROBOTD4',
        '**     **   **     **',
        '**     **   **     **',
        '********    *********',
        '*******     ********',
        'nn']

p = ''
iport = '192.168.1.2:5000'
host = 'http://' + iport + '/mycomp'

def test():
    dict = {'command': 'test', 'data': 0}
    r = requests.post(host, json=dict)
    if r.status_code == 200:
        print (r.content.decode('utf-8'))

def start():
    for i in logo:
        print(i)

start()
test()

while True:
    command = input('>')
    if command == '':
        continue
    a = command.split()
    if command == 'test':
        dict = {'command': 'test', 'data': 0}
        r = requests.post(host, json=dict)
        if r.status_code == 200:
            print (r.content.decode('utf-8'))
    if a[0] == 'shell':
        for i in range(1, len(a)):
            p = p + a[i] + ' '
        dict = {'command': 'shell', 'data': p}
        r = requests.post(host, json=dict)
        if r.status_code == 200:
            print (r.content.decode('utf-8'))
        p = ''
    if a[0] == 'link':
        if len(a) > 1:
            dict = {'command': 'link', 'data': int(a[1])}
            r = requests.post(host, json=dict)
            if r.status_code == 200:
                print (r.content.decode('utf-8'))
        else:
            print('Комманда не содержит аргументов!')
    if a[0] == 'openweb':
            if len(a) > 1:
                dict = {'command': 'openweb', 'data': a[1]}
                r = requests.post(host, json=dict)
                if r.status_code == 200:
                    print (r.content.decode('utf-8'))
            else:
                print('Комманда не содержит аргументов!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Förklaringar:

Först och främst importeras modulen för förfrågningar (för att interagera med servern). Nedan finns beskrivningar av start- och testfunktionerna. Och sedan cykeln där magin händer. Har du läst koden? Så du förstår innebörden av magin som händer i cykeln. Ange kommandot - det körs. Shell – kommandon för kommandoraden (logiken är inte skala).

Testa – kontrollera om servern är igång (bakdörr)
Länk – använd en "genväg"
Openweb – öppna en webbplats
Avsluta – lämna klienten
Set – ställ in din dators ip på det lokala nätverket

Och nu mer om länk.

Det finns en link.txt-fil bredvid servern. Den innehåller länkar (fullständig sökväg) till filer (videor, foton, program).

Strukturen är så här:

полный_путь>описание
полный_путь>описание

Totalt

Vi har en bakdörrsserver för att styra en dator på ett lokalt nätverk (inom ett wi-fi-nätverk). Tekniskt sett kan vi köra klienten från vilken enhet som helst som har en python-tolk.

PS Jag lade till kommandot set så att om en dator i det lokala nätverket tilldelas en annan IP kan den ändras direkt i klienten.

Källa: will.com

Lägg en kommentar