Bruteforce with python

Bruteforce: il metodo infallibile per scoprire una password. Sì proprio così! In pratica è una tecnica che consiste nel risolvere un problema tentando tutte le possibili soluzioni. Nel nostro caso scoprire una password provando tutte le possibili combinazioni di lettere, numeri e caratteri speciali. In questo articolo/guida spiego come creare un programma bruteforce con il linguaggio Python.
Requisiti per continuare a leggere questo post:

Conoscenza minima del linguaggio di programmazione Python


Bene. Apriamo il blocco note o l'IDLE di Python dove andare a scrivere il codice. Iniziamo:
Ecco un prima bozza del bruteforce : BruteForce.py - Esempio 01 (il codice è molto commentato)
Ecco il risultato:

[Come Creare Un Bruteforce In Python]
Come si può notare, se viene avviate il file vengono stampate a schermo tutte le possibili combinazioni (in matematica vengono chiamate permutazioni) composte dai caratteri nella lista.

Per ora il nostro programma non fa altro che stampare tutte le password possibili, ma come veniamo a conoscenza di quella corretta? Per fare questo bisogna implementare (modificare) la funzione testaPassword che per ora stampa solo la stringa passatagli come parametro.

Ora non ci tocca che provare ad effettuare un accesso testando ogni singola combinazione di password. Modifichiamo la funzione testaPassword() che per ora stampa solo la stringa che gli passiamo come parametro.

Cosa dovrà fare la funzione testaPassword()? Ipotizziamo che vogliamo tentare l'accesso ad un server via FTP (ad esempio ftp.sitodiprova.it) conoscendo l'username di login (ad esempio admin). Ferma, ferma! Cos'è l'accesso via FTP? Non è altro che l'accesso ad un sito in modo che possiamo scaricare da esso le pagine del sito stesso (ed esempio vogliamo scaricare la paginasitodiprova.it/registrazione.php), oppure possiamo aggiungere noi pagine al sito. Per accedere via FTP abbiamo bisogno di un username (spesso è admin) e una password (che andremo a scoprire). Per capire meglio il concetto di FTP consiglio di documentarsi su internet e scaricare programmi come FileZilla.

Il codice finale sarà il seguente: BruteForce.py - Esempio 02. Come si può notare viene tentato l'accesso provando ogni singola combinazione di password, se la password non è quella esatta allora il programma va avanti generando la prossima, se la password è esatta allora viene stampato un messaggio che avvisa l'utente che è stato trovata la password corretta, il programma terminata una volta che l'ha trovata.

 Fino ad ora abbiamo preso in esame la tecnica bruteforce per quanto riguarda il login FTP. Ora, invece, vedremo come usare questa tecnica per un login di un sito web (quindi non più FTP bensì HTTP). Ricordo e sottolineo che i contenuti di questa guida sono a solo scopo informativo e non sono di incoraggiamento a compiere reati informatici quali il bruteforcing.

Premetto, che il metodo utilizzato in questo articolo potrebbe non funzionare su siti di massima protezione.

Occorre, innanzitutto, precisare che verrà utilizzata la libreria python urllib che serve per leggere il codice di una pagina web.

Descriviamo le operazioni che andranno compiute per creare un bruteforce utilizzando la urllib:

1. Aprire la pagina di action del form (con la funzione urlopen) che è settata dall'attributo action del form, la chiameremo quindi pagina di action. Per comprendere meglio consiglio di studiare un po' di HTML. Se già lo masticate, meglio ancora. La pagina di action, dunque, verrà aperta ma con i campi già compilati, il campo username (o email, dipende dal form), ad esempio, già sappiamo che sarà compilato con l'username (o email) della vittima, ovvero l'username di cui vogliamo scoprire la password. Il campo password sarà compilato dalla password da testare. Ad ogni combinazione di password, dunque, viene tentato il login fin quando non sarà effettuato l'accesso e quindi la password sarà trovata.

Analizziamo il form. La pagina di action è login.php. Per ottenere l'url completo della pagina di action la dobbiamo far precedere dall'indirizzo su cui ci troviamo, se ci trovassimo, ad esempio, su http://www.miosito.it l'url completo della pagina di action sarà http://www.miosito.it/login.php. Il primo input è il campo username, il secondo è il campo password e l'ultimo input è il pulsante di accesso. A volte, possono esistere più input, ma dobbiamo considerare solo questi 3 input fondamentali. Segniamoci i parametri name degli input, ovvero, username, password e submit. Possiamo ora passare al secondo passaggio.

2. Memorizzare il messaggio di avvenuto login inserendo username e password corretti. Consiglio di farlo con la funzione urlopen da linea di comando Python (dalla Shell Python) per velocizzare il tutto. Scriveremo dunque:
>>> import urllib
>>> parametriCorretti = { "username" : "mioUsername", "password" : "mia Password", "submit" : "1" }
>>> p = urllib.urlencode(parametriCorretti)
>>> paginaDiAction = urllib.urlopen("http://www.miosito.it/login.php", p)
>>> paginaDiAction.read()

Ovviamente, invece di mioUsername e miaPassword inseriremo username e password corretti. Submit lo rimarremo impostato a 1. Con la riga paginaDiAction.read() apparirà il codice HTML restituito dalla pagina da cui prenderemo e ci segneremo il messaggio di avvenuto login (ad esempio "Login effettuato!").

 in questa parte vedremo come modificare la funzione testaPassword() in modo da testare la password via http.


Innanzitutto bisogna importare il modulo (o libreria) urllib:

 import urllib

Poi settiamo la variabile username che è l'username di cui si vuole scovare la password (ad esempio admin). Oltre all'username settiamo anche la variabile paginaLogin che è l'url della pagina di action (nel caso nostro èhttp://www.miosito.it/login.php, leggi la parte 3 di questa serie di articoli se ancora non l'hai letta).

 username = "admin"
paginaLogin = "http://www.miosito.it/login.php"

Creiamo anche un'altra variabile (messaggioDiAvvenutoLogin) che conterrà il messaggio di avvenuto login che nel nostro caso è "Login effettuato!".

 messaggioDiAvvenutoLogin = "Login effettuato!"

Il codice che testa la password è essenzialmente il seguente:

 parametriDaTestare = { "username" : username, "password" : password, "submit" : "1" }
p= urllib.urlencode(parametriDaTestare)
paginaDiAction = urllib.urlopen(paginaLogin, p)
risultato = paginaDiAction.read()
if messaggioDiAvvenutoLogin in risultato:
    print "Password trovata: ", password
    exit()
else:
    return

Ovviamente, invece di mioUsername e miaPassword inseriremo username e password corretti. Submit lo rimarremo impostato a 1. Con la riga paginaDiAction.read() apparirà il codice HTML restituito dalla pagina da cui prenderemo e ci segneremo il messaggio di avvenuto login (ad esempio "Login effettuato!").

Innanzitutto bisogna importare il modulo (o libreria) urllib:

import urllib

Poi settiamo la variabile username che è l'username di cui si vuole scovare la password (ad esempio admin). Oltre all'username settiamo anche la variabile paginaLogin che è l'url della pagina di action (nel caso nostro è http://www.miosito.it/login.php, leggi la parte 3 di questa serie di articoli se ancora non l'hai letta).

username = "admin"
paginaLogin = "http://www.miosito.it/login.php"

Creiamo anche un'altra variabile (messaggioDiAvvenutoLogin) che conterrà il messaggio di avvenuto login che nel nostro caso è "Login effettuato!".

messaggioDiAvvenutoLogin = "Login effettuato!"

Il codice che testa la password è essenzialmente il seguente:

parametriDaTestare = { "username" : username, "password" : password, "submit" : "1" }
p= urllib.urlencode(parametriDaTestare)
paginaDiAction = urllib.urlopen(paginaLogin, p)
risultato = paginaDiAction.read()
if messaggioDiAvvenutoLogin in risultato:
    print "Password trovata: ", password
    exit()
else:
    return

Nei parametri da testare l'username è fisso e l'abbiamo settato all'inizio, è uguale a "admin" nel nostro caso. La password da testare cambia ogni volta, ovvero viene testata ogni combinazione di caratteri. Il parametro submit sarà sempre uguale a "1". Con la seconda istruzione vengono codificati i parametri (non ci soffermeremo su questa istruzione). La terza istruzione invia il form alla pagina di login (http://www.miosito.it/login.php) con i parametri da testare. Con la quarta riga viene memorizzato il risultato in una variabile apposita, ovvero viene memorizzato ciò che la pagina ha restituito. Con il blocco if si controlla se il messaggio di avvenuto login è contenuto nel risultato, ovvero se i parametri sono corretti e di conseguenza il risultato contiene il messaggio di avvenuto login. Se esso lo contiene allora significa che la password è corretta (e che quindi è stata trovata) e il programma si chiude altrimenti continuerebbe a testare password inutilmente. Se esso non lo contiene allora si prosegue con l'esecuzione del bruteforce testando la prossima combinazione di caratteri.

Il codice finale che ne risulterà sarà: BruteForce.py - HTTP.
 

Conclusioni

Spero di essere stato abbastanza chiaro. C'è da dire, inoltre, che questo bruteforce via HTTP non funziona con tutti i siti web, soprattutto con siti importanti come Google o Hotmail ma per utilizzare bruteforce per tali siti occorre creare un bruteforce per email che magari vedremo come crearlo nella prossima parte.