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

Hallo, Habr!

Vor kurzem habe ich mir die heruntergeladene Version des Streams ĂŒber Programmierung «Wie man seine eigene Webanwendung mit Flask erstellt» angesehen. Ich wollte mein Wissen in einem Projekt festigen. Ich wusste lange nicht, was ich schreiben sollte, bis mir die Idee kam: „Warum nicht ein Mini-Backdoor mit Flask erstellen?“

Sofort kamen mir erste Umsetzungsideen und Möglichkeiten fĂŒr das Backdoor in den Sinn. Aber ich beschloss, sofort eine Liste der Möglichkeiten fĂŒr das Backdoor zu erstellen:

  1. Webseiten aufrufen können
  2. Zugriff auf die Kommandozeile haben
  3. Programme, Fotos, Videos öffnen können

Der erste Punkt lĂ€sst sich ganz einfach mit dem Modul webbrowser umsetzen. Den zweiten Punkt wollte ich mit dem Modul os realisieren. Und den dritten ebenfalls ĂŒber das Modul os, aber ich werde "Links" verwenden (darĂŒber spĂ€ter mehr).

Programmierung Server

Also, *Trommelwirbel* hier ist der gesamte 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 'Der Server lÀuft und wartet auf Befehle...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Öffne die Seite ' + 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 bereitgestellt, jetzt ist es an der Zeit, die Essenz zu erklÀren.

Der gesamte Code lĂ€uft auf dem lokalen Computer am Port 5000. Um mit dem Server durch zu interagieren, mĂŒssen wir eine JSON-POST-Anfrage senden.

Die Struktur der JSON-Anfrage ist:

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

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 erstellen und senden, um mit dem Server zu interagieren (hierfĂŒr helfen Ihnen die Requests). Alternativ kann man einen Konsolen-Client schreiben.

Das Schreiben eines 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 importiert (fĂŒr die Interaktion mit dem Server). Danach folgen die Beschreibungen der Funktionen start und test. Anschließend gibt es eine Schleife, in der das Wunder passiert. Haben Sie den Code gelesen? Dann ist Ihnen der Sinn des Wunders in der Schleife klar. Geben Sie einen Befehl ein – er wird ausgefĂŒhrt. Shell – Befehle fĂŒr die Eingabeaufforderung (die Logik ist kaum zu fassen).

Test – ÜberprĂŒfung, ob der Server (Backdoor) funktioniert.
Link – Verwendung eines „Links“
Openweb – Öffnen einer Website
Quit – Beenden des Clients
Set – Festlegen der IP Ihres Computers im lokalen Netzwerk

Jetzt etwas genauer zu link.

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

Die Struktur ist wie folgt:

voller_Pfad>Beschreibung
voller_Pfad>Beschreibung

Zusammenfassung

Wir haben einen Backdoor-Server zur Verwaltung des Computers im lokalen Netzwerk (innerhalb des WLANs). Technisch gesehen können wir den Client von jedem GerĂ€t aus starten, das ĂŒber einen Python-Interpreter verfĂŒgt.

P.S. Den Befehl set habe ich hinzugefĂŒgt, damit, falls einem Computer im lokalen Netzwerk eine andere IP zugewiesen wird, diese direkt im Client geĂ€ndert werden kann.

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster