Ciao, Habr!
Recentemente ho guardato la versione scaricata dello streaming sulla programmazione "Come creare la tua web app in Flask". Ho deciso di consolidare le mie conoscenze in un progetto. Non sapevo cosa scrivere e mi è venuta un'idea: "E perché non creare un mini backdoor in Flask?".
Nella mia mente sono subito emerse le prime idee su come implementare e sfruttare il backdoor. Ma ho deciso di redigere subito un elenco delle funzionalità del backdoor:
- Essere in grado di aprire siti web
- Avere accesso al terminale
- Essere in grado di aprire programmi, foto, video
Quindi, il primo punto è estremamente facile da realizzare utilizzando il modulo webbrowser. Il secondo punto ho deciso di implementarlo tramite il modulo os. E il terzo – anch'esso attraverso il modulo os, ma userò "collegamenti" (di questo parlerò più avanti).
Scrittura server
Quindi, *rullo di tamburi* ecco il codice completo del server:
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 'Il server è in esecuzione e in attesa di comandi...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.'+json_string['data'], new=0)
return 'Apertura del sito ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Esecuzione del comando ' + 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('')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Ho già condiviso tutto il codice, è ora di spiegare il concetto.
Tutto il codice viene eseguito sul computer locale sulla porta 5000. Per interagire con server dobbiamo inviare una richiesta JSON POST.
La struttura della richiesta JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}Beh, è logico che ‘command’ sia il comando che vogliamo eseguire. E ‘data’ sono gli argomenti del comando.
È possibile scrivere e inviare richieste JSON per interagire con il server manualmente (può aiutarti requests). Oppure puoi scrivere un client da console.
Scrivere un client
Codice:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Scritto in Python',
'******* ** **',
'******** ** **',
'** ** ** ** Autore: 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('Il comando non contiene argomenti!')
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('Il comando non contiene argomenti!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Spiegazioni:
Per prima cosa, viene importato il modulo requests (per interagire con il server). Poi vengono descritte le funzioni start e test. Successivamente, un ciclo in cui avviene la magia. Hai letto il codice? Allora ti è chiaro il senso della magia che si svolge nel ciclo. Inserisci un comando – esso viene eseguito. Shell – comandi per la riga di comando (la logica supera i limiti).
Test – verifica se il server (backdoor) funziona
Link – utilizzo di un "collegamento"
Openweb – apertura del sito
Quit – uscita dal client
Set – impostazione dell'IP del tuo computer nella rete locale
Ora approfondiamo il link.
Accanto al server c'è un file link.txt. Al suo interno si trovano i collegamenti (percorso completo) ai file (video, foto, programmi).
La struttura è la seguente:
percorso_completo>descrizione
percorso_completo>descrizione
Risultato
Abbiamo un server backdoor per gestire il computer nella rete locale (all’interno della rete wi-fi). Tecnologicamente, possiamo avviare il client da qualsiasi dispositivo che abbia un interprete python.
P.S. Ho aggiunto il comando set in modo che se al computer nella rete locale viene assegnato un altro IP, sia possibile modificarlo direttamente nel client.
Fonte: habr.com
