Hei Habr!
Am urmărit recent o versiune descărcată a fluxului de programare „Cum să vă creați propria aplicație web în Flask”. Și am decis să-mi consolidez cunoștințele într-un proiect. Multă vreme nu am știut ce să scriu și mi-a venit ideea: „De ce să nu faci un mini-backdoor în Flask?”
Primele opțiuni pentru implementări și capabilități ale ușii din spate au apărut imediat în capul meu. Dar am decis să fac imediat o listă de capabilități backdoor:
- Aflați cum să deschideți site-uri web
- Au acces la linia de comandă
- Să poată deschide programe, fotografii, videoclipuri
Deci, primul punct este extrem de ușor de implementat folosind modulul browser web. Am decis să implementez al doilea punct folosind modulul os. Și al treilea este, de asemenea, prin modulul os, dar voi folosi „linkuri” (mai multe despre asta mai târziu).
Scrierea unui server
Deci, *drumroll* 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 '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')
Am aruncat deja tot codul, este timpul să explic esența.
Tot codul rulează pe computerul local pe portul 5000. Pentru a interacționa cu serverul, trebuie să trimitem o solicitare JSON POST.
Structura cererii JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}
Ei bine, are sens ca „comandă” să fie comanda pe care vrem să o executăm. Iar „date” sunt argumentele comenzii.
Puteți scrie și trimite solicitări JSON pentru a interacționa cu serverul manual (solicitările vă vor ajuta). Sau puteți scrie un client de consolă.
Scrierea unui client
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('Комманда не содержит аргументов!')
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
Explicatii:
În primul rând, se importă modulul de solicitări (pentru interacțiunea cu serverul). Mai jos sunt descrieri ale funcțiilor de pornire și de testare. Și apoi ciclul în care se întâmplă magia. Ai citit codul? Deci înțelegi sensul magiei care se întâmplă în ciclu. Introduceți comanda - este executată. Shell – comenzi pentru linia de comandă (logica este off scale).
Testare – verificați dacă serverul rulează (backdoor)
Link – utilizarea unei „comandări rapide”
Openweb – deschiderea unui site web
Ieșire – părăsiți clientul
Setați – setați ip-ul computerului dvs. în rețeaua locală
Și acum mai multe despre link.
Există un fișier link.txt lângă server. Conține linkuri (calea completă) către fișiere (videoclipuri, fotografii, programe).
Structura este astfel:
полный_путь>описание
полный_путь>описание
Total
Avem un server backdoor pentru controlul unui computer într-o rețea locală (în cadrul unei rețele wi-fi). Din punct de vedere tehnic, putem rula clientul de pe orice dispozitiv care are un interpret Python.
PS Am adăugat comanda set, astfel încât dacă unui computer din rețeaua locală i se atribuie un alt IP, acesta poate fi schimbat direct în client.
Sursa: www.habr.com