Attacco dizionario e forza bruta di hash MD5 in Python

Dopo il piccolo successo ottenuto dallo script che effettuava tutte le combinazioni possibili del codice ASCII per ritrovare il corrispondente testo in chiaro di un hash MD5 (vedi articolo http://www.guizzardi.net/?p=209), articolo che un sito di pseuso-hacker mi ha pure copiato, mha! , ho voluto fare la stessa cosa in Python 2.6 (con piccole modifiche si adatta anche alla versione 3.x).

In questa versione ho inserito la possibilità di eseguire prima un attacco dizionario e solo in un successivo tempo, se il primo non porta risultati, quello a forza bruta. L’attacco dizionario si basa sull’uso di un file di testo contenente l’elenco delle password più comuni (il file è disponibile liberamente in rete e potete integrarlo con nuove password).

Il Python si presta a questo genere di script poiché è molto versatile e facile da strutturare. Ovviamente ci sono online altri script di questo genere, per esempio alcuni interrogano i database online di parole già codificate ed evitano così di usare l’attacco a forza bruta, molto dispendioso in termini di tempo. Inoltre, nel mio codice non ho preso in considerazione il multi-threaded, cosa che invece sarebbe fondamentale per velocizzare i calcoli. Si potrebbe per esempio creare diversi thread assegnando a ciascuno solo un range di calcoli, per far questo Python mette a disposizione:

Il programma è molto semplice, basta leggerlo per capire come funziona. E’ diviso in due parti, la prima parte nella funzione “Main” cerca nel file di testo il corrispondente testo in chiaro dell’hash passato, la seconda parte è la funzione “Combinazioni” che crea tutte le combinazioni dei caratteri ASCII (lo vedete chiaramente nella stringa), ne calcola l’MD5 e lo compara con quello da trovare.

Come sempre il codice lo trovate nella sezione Download.

Stampante PDF    Invia l'articolo in formato PDF   

Password “salate” usando il PHP

Lo sapevate che le password “lisce” non vanno più di moda? Creare un cocktail di informazioni è sicuramente un metodo più sicuro per proteggere i dati. Vi sono vari modi per fare questo cocktail, quelli che esamineremo in questo articolo si dicono “salted” (aggiunta di sale).

Tutto nasce dal concetto (sensato) che se le password salvate in un qualsiasi sistema, online oppure offline, sono molto semplici, tipo “1234″ oppure “31051969″ (la mia data di nascita), sarà semplice poterle ricavare da parte di criminali informatici (sempre a rompere le scatole questi truffaldini!).
Anche partendo dal presupposto che non si archiviano password in chiaro (se lo fate non me lo dite, per carità, mi viene da starnutire!) ma crittografate in qualche modo, non si è abbastanza certi che in caso di furto del database oppure di attacchi SQL Injection non si rischi di far sapere a malintenzionati le password dei propri utenti o della propria azienda.

Per cercare di migliorare il livello di sicurezza e contemporaneamente aiutare gli utenti sprovveduti che utilizzano password molto semplici (vi ricordo che una password di buon livello è almeno 12 caratteri misti tra numeri, lettere maiuscole e minuscole e simboli), sono state pensate nel tempo diverse vie, vediamone alcune.

Password salate fisse:

Quando si archivia una password, la si memorizza solitamente come hash usando funzioni come MD5, SHA1, ecc. Gli hash vengono poi salvati nel database. Questo modo di procedere è ormai considerato semplicistico e pericoloso. Come abbiamo visto negli articoli precedenti e come vedremo in quelli futuri, ricavare il testo in chiaro da una hash non è poi così complicato.

Per rendere il “reverse” delle password complesso, è possibile aggiungere alle stesse, un valore arbitrario, di tipo misto (lettere + numeri + simboli) prima di archiviarle.  Le password così generare risulteranno un misto tra la propria password e quella arbitraria. Ecco cosa intendo:

Verranno visualizzati due hash, il primo è quello calcolato in modo classico con MD5, il secondo viene “salato” o aggiunta una stringa arbitraria $salt e calcolato per 10 volte. Questo tipo di calcolo è particolarmente efficace contro gli attacchi dizionario e le rainbow tables.

Inoltre, rubare il database non ha comunque effetto sul recupero delle password, è necessario sapere il valore di $salt che risiede all’interno del codice PHP anch’esso da “aprire” in modo fraudolento. Quindi, si tratta di due azioni di hackeraggio distinte e non una sola.

Avrete però notato come $salt sia una costante e questo la penalizza dal punto di vista matematico. Anche se però lo rendiamo dinamico non vuol dire che la situazione migliori.

Password salate dinamiche:

Cambiando il valore di $salt in modo dinamico sarà possibile rendere ancora più lungo e complesso il processo di “reverse” della passwod, ecco un primo esempio:

In questo caso, il “salt”, è aggiunto direttamente dalla concatenazione di funzioni MD5 ed SHA1. Se ne possono mettere diverse in diverse combinazioni, senza conoscerne la sequenza diventa molto arduo recuperare la password originale.

Il consiglio però è che sarebbe meglio evitare questo genere di concatenazione, quando si passa attraverso una di queste funzioni, il numero di caratteri viene troncato per adeguarlo al calcolo, il passaggio successivo fà uguale e così via. Teoricamente, si aumenta la possibilità di collisione dei termini usati per la password originale.

Oppure possiamo utilizzare una vera variabile pseudo-random tipo:

$salt = microtime();

Da aggiungere alla password. Purtroppo, se si sceglie questa strada, si dovrà memorizzare il valore di $salt da qualche parte. Se si salva nello stesso database e questo viene “aperto” allora questa forma di sicurezza cade.

A questo punto si aprono infinite possibilità, per esempio si potrebbe “salare” le password con la data di registrazione dell’utente oppure con il suo stesso login, sono valori salvati comunque nel database ma non espressamente indicati per il calcolo del’hash. A chi verrebbe in mente di usare un altro campo del database che non riporta indicazioni specifiche relative alla password?

La cosa divertente è che se trovate un bel metodo per “salare” le password, anche utilizzare “1234″ potrebbe diventare una password sicura!

Free PDF    Invia l'articolo in formato PDF   

Crack di hash MD5 con PHP

Nel titolo uso la parola “crack” ma vorrei chiarire subito che NON SI PUO’ craccare un hash MD5 (ho usato “crack” perché sarebbe stato troppo lungo mettere una cosa simile a “trovare la corrispondente stringa in chiaro di un hash MD5″). Craccare prevede il reverse della funzione e con MD5 questo non è possibile. Ho letto in rete molti articoli di “esperti” informatici che in modo disinvolto usano la parola crack o addirittura indicano come reversibile un hash MD5. Questo è falso!

s

Quello che è possibile fare è usare metodi “forza bruta” per trovare la corrispondente stringa in chiaro già precedentemente calcolata. Questo è possibile facendo un match tra due hash, quando l’hash sconosciuto è uguale all’hash archiviato si va a vedere il corrispondente testo in chiaro. Per far questo è necessario avere un database contenente anche solo due informazioni per record: l’hash e il testo in chiaro.

Partiamo dalla base, consideriamo la parola “password” e calcoliamone l’hash MD5, otterremo la stringa “5f4dcc3b5aa765d61d8327deb882cf99″. Archiviando questa informazione avremi un record che associa la parola all’hash. Se facessimo questa operazione su tutti i vocabolari del mondo e aggiungessimo tutte le combinazioni di lettere e numeri usate principalmente dalle persone quando scrivono una password o uno username ecco che potremmo ragionevolmente dire che avremmo in mano uno strumento potente per recuperare il testo in chiaro di un hash MD5 (questo vale anche per altre codifiche come SHA1).

Ho scritto quindi un programmino a riga di comando in linguaggio PHP per calcolare l’hash delle combinazioni di caratteri ASCII e compararlo con l’hash sconosciuto, oggetto della ricerca. L’utente quindi, lanciando il programma, deve indicare l’hash di cui cerca la corrispondenza in chiaro ed il numero di caratteri di cui pensa sia fatto il testo corrispondente all’hash sconosciuto. Facciamo un esempio pratico:

Nella pratica:

Notate che come parametri vengono passati l’hash sconosciuto ed il numero di caratteri di cui pensiamo sia lunga la parola corrispondente all’hash sconosciuto (in questo caso la parola è “test”).
crackmd5
E’ bene fare ora alcune pratiche considerazioni. Essendo un sistema a forza bruta, più alto è il numero di caratteri di cui pensiamo sia fatto il testo in chiaro, più aumenta considerevolmente il tempo di calcolo. Per darvi un’idea, su un PC con un Intel Core 2 Duo e 2Gb di RAM per calcolare tutte le combinazioni ASCII fino a 4 caratteri ed arrivare a scoprire che si tratta della parola “test” è stato necessario 1h di tempo circa. Già un testo lungo 5 caratteri necessita di circa 16/17h… e così via.

Il codice del programma potete scaricarlo dalla pagina dei Downloads.

PDF Creator    Invia l'articolo in formato PDF