Per studi puramente accademici (giuro!), ho voluto testare le condizioni di sicurezza dei miei server FTP. Uno dei test più semplici è attaccare il server con “forza bruta” e/o altri attacchi simili. In questo articolo scriverò come realizzare un “attacco a dizionario” con una sola riga di comando, senza linguaggi di programmazione o tecnologie particolari.
Iniziamo ad analizzare il problema. Dobbiamo realizzare uno script che legga un file di testo contenente una serie di username e password che poi andremo a passare ad un comando di connessione FTP. Per risolvere questo passaggio per prima cosa ho preso in considerazione un piccolo linguaggio interpretato chiamato BPL del quale ho trovato anche il sorgente in C++. Pensavo che modificando opportunamente il sorgente del compilatore avrei potuto risolvere tutto in poche istruzioni. Mentre ci lavoravo sopra però mi sono reso conto che alla fine non sarebbe stata una soluzione alla portata di tutti, solo altri programmatori avrebbero potuto camprendere a fondo tale soluzione e così ho cercato meglio tra i comandi di Windows e ho trovato FOR.
Ammetto di aver sempre poco preso in considerazione la linea di comando di Windows e non conoscevo bene il funzionamento di questa utility. Tuttavia, con il solo utilizzo di FOR è possibile risolvere il problema sopra descritto:
C:\>for /f “tokens=1-2″ %%A in (dizionario.txt) do (c:\curl -u %%A:%%B -ftp ftp://111.222.333.444:21)
La illustro rapidamente. FOR è l’istruzione Windows per eseguire un certo compito in base al parametro indicato, in questo caso /f che indica la lettura di un file (parsing). Dopodichè è necessario indicare cosa ci troveremo nel file, due stringhe, quindi l’informazione “token=1-2″ specifica proprio cosa deve essere letto dal file (2 stringhe consecutive) per poi passarle alle variabili %%A e %%B. Il nome del file da leggere è “dizionario.txt”, che dovremo popolare con due stringhe separate da uno spazio per ogni riga, username e password, come l’esempio qui di seguito:
admin admin
admin password
user password
user user
user123 password
user123 user123
demo demo
eccetera eccetera ….
Altro passo necessario è trovare un’utility FTP che permetta la connessione al server con una sola riga di comando. In questo caso, per esempio, l’utility nativa di Windows non è utilizzabile poiché nella sua sintassi accetta username e password da file esterno oppure dopo la connessione al server. Per questo motivo ho cercato e trovato CURL che permette di connettersi specificando tutti i parametri sulla stessa riga di comando. Ecco quindi che possiamo comprendere anche l’ultima parte dello script. Con -u passiamo a curl lo username e la password lette dalle righe del file dizionario (variabili A e B) e con il comando -ftp gli passiamo l’indirizzo del server. La porta 21 che indica la porta di default dell’FTP può essere omessa oppure cambiata a seconda della necessità.
Si può fare di meglio
Come possiamo vedere, a differenza di alcuni anni fà, oggi è possibile affrontare operazioni che richiedevano una base di programmazione con semplici utility e comandi per batch file. E’ chiaro che il mio esempio è ridotto all’osso, si può fare di meglio, sempre comunque usando l’istruzione sopra indicata. Per esempio si potrebbe passare l’indirizzo IP dalla linea che richiama lo script all’interno del parametro -ftp di cURL. Per far questo possiamo usare il passaggio dell’IP come variabile al lancio del batch file:
C:\>attacco.bat 192.168.1.4
e poi leggere l’IP usando la variabile %1. Oppure ancora possiamo intercettare l’output dei tentativi di cURL reindirizzandolo in un file di testo e analizzandolo successivamente con calma.