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:
- Wissen, wie man Websites öffnet
- Sie haben Zugriff auf die Befehlszeile
- 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