Salut, Habr!
Recent am vizionat o versiune descărcată a unui stream de programare „Cum să-ți creezi propria aplicație web pe Flask”. Și am decis să îmi consolidez cunoștințele într-un proiect. Am ezitat mult să aleg ce să scriu și mi-a venit ideea: „De ce să nu fac un mini-backdoor pe Flask?”.
În minte mi-au apărut imediat primele variante de realizare și posibilități ale backdoor-ului. Dar am decis să fac mai întâi o listă a posibilităților backdoor-ului:
- Să poată deschide site-uri
- Să aibă acces la linia de comandă
- Să poată deschide programe, fotografii, videoclipuri
Așadar, primul punct este extrem de ușor de realizat cu ajutorul modulului webbrowser. Al doilea punct l-am decis să-l implementez cu ajutorul modulului os. Iar al treilea – tot prin modulul os, dar voi folosi „link-uri” (despre asta mai târziu).
Scrierea server
Deci, *tămbălău* tot codul serverului:
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 ''Serverul rulează și așteaptă comenzi...''
if json_string[''command''] == ''openweb'':
webbrowser.open(url=''https://www.''+json_string[''data''], new=0)
return ''Deschid site-ul '' + json_string[''data''] + ''...''
if json_string[''command''] == ''shell'':
os.system(json_string[''data''])
return ''Executarea comenzii '' + 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 ''Lansare '' + link.split(''>'')[1]
if __name__ == ''__main__'':
app.run(host=''0.0.0.0'')
Am expus deja tot codul, acum este vremea să explic esența.
Întregul cod rulează pe computerul local pe portul 5000. Pentru a interacționa cu serverul trebuie să trimitem o cerere JSON POST.
Structura cererii JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}Ei bine, este logic că ‘command’ este comanda pe care vrem să o executăm. Iar ‘data’ sunt argumentele comenzii.
Se pot scrie și trimite cereri JSON pentru a interacționa cu serverul manual (aveți la dispoziție requests). Sau se poate scrie un client de linie de comandă.
Scrierea clientului
Cod:
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('Comanda nu conține 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('Comanda nu conține argumente!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Explicații:
În primul rând, se importă modulul requests (pentru interacțiunea cu serverul). Apoi, sunt descrise funcțiile start și test. Apoi urmează un ciclu în care are loc magia. Ați citit codul? Atunci pentru voi este clar sensul magiei care se petrece în ciclu. Introduceți o comandă – aceasta se execută. Shell – comenzi pentru linia de comandă (logica este peste măsură).
Test – verificarea, funcționează serverul (backdoor)
Link – utilizarea unui „shortcut”
Openweb – deschiderea unui site
Quit – ieșirea din client
Set – setarea IP-ului calculatorului vostru în rețeaua locală
Și acum, mai în detaliu despre link.
Lângă server se află un fișier link.txt. În el se află linkuri (cale completă) către fișiere (video, foto, programe).
Structura este următoarea:
calea_completă>descriere
calea_completă>descriere
Rezultatul
Avem un server-backdoor pentru a controla un computer în rețeaua locală (în interiorul rețelei Wi-Fi). Tehnic, putem rula clientul de pe orice dispozitiv care are un interpret Python.
P.S. Am adăugat comanda set pentru a putea schimba direct în client IP-ul dacă unui computer din rețeaua locală i se atribuie un alt IP.
Sursa: habr.com
