giovedì 7 aprile 2016

Basi Di Crittografia #6 - Decriptare Una Stringa Hash (Bruteforce MD5 In Python)

Dopo aver appreso e approfondito cosa sono le funzioni di hash, in questo articolo (pratico) vediamo come decriptare una stringa hash (ovvero una stringa criptata con una funzione di hash). Ma non avevamo detto, nei precedenti articoli, che una stringa hash non è decriptabile? No, abbiamo detto che è difficile ma non è impossibile, continua a leggere per scoprire alcuni modi per decriptarla (o crackarla, che come termine suona più figo).

MD5 Decrypter

Nella parte precedente ho parlato di un sito che permette di criptare una stringa in MD5. Ora vediamo come fare per decriptare.

Ci viene in aiuto il sito dello scorso articolo, ovvero: MD5 Online (questo è il link per poter decriptare una stringa).

Funziona il 100% delle volte? Assolutamente no.

Come funziona allora? Innanzitutto il sito ha un suo database che contiene tantissime stringhe hash con le corrispettive stringhe in chiaro che le hanno generate.

Esempio:
[...]
ciao               6e6bc4e49dd477ebc98ef4046c067b5f
casa               202447d5d44ce12531f7207cb33b6bf7
albero           338a96591f778e7af4cce7b601d785d2
giardino       2993f3e403f33ab24c72de67921a7102
[...]
Quindi, la stringa ciao criptata in MD5 genera l'hash 6e6bc4e49dd477ebc98ef4046c067b5f.
La stringa casa genera 202447d5d44ce12531f7207cb33b6bf7, e così via.

Tieni in considerazione che il database contiene una grande quantità di hash con le rispettive stringhe che le hanno generate.

Quando vai sul sito MD5 Online e inserisci una stringa criptata in MD5 nel box e premi il pulsante "Decrypt", il sito cerca nel suo database quale stringa in chiaro (decriptata) corrisponde alla stringa criptata che hai inserito. Se la trova, sei fortunato, e te la mostra. Se non la trova, pazienza... dovrai provare qualche altro metodo, che ora ti presenterò...

Bruteforce MD5 In Python

Prima di andare avanti è essenziale che tu legga questa serie di articoli che spiegano cos'è un bruteforce e come scriverne uno in Python.

Una volta letti gli articoli, puoi continuare a leggere questa guida.

Bene. Utilizzeremo questo codice. Non ci resta che modificare la funziona testaPassword(). Ma prima di fare ciò, ricordati di importare le librerie (scrivendo questo codice in alto prima di tutto il resto):
import hashlib
Inoltre, dobbiamo impostare l'hash che vogliamo decriptare (inserendo questo codice appena dopo il codice per importare le hashlib):
hashDaDecriptare = "74efb8aac68e37c289dfcf260e19ab25"
In questo caso l'hash che vogliamo decriptare è 74efb8aac68e37c289dfcf260e19ab25, naturalmente tu puoi inserire qualsiasi hash. In questo esempio, la stringa in chiaro che ha generato l'hash è "alba", ovviamente tu non lo saprai a priori (infatti sarà il bruteforce a trovare la stringa in chiaro generatrice), te lo dico giusto per farti vedere che il codice funziona.

Ora non ci resta che modificare la funzione testaPassword(), che in questo caso dovrebbe chiamarsi testaStringa() se proprio vogliamo essere super-precisi ma lasciamogli il nome così com'è (tanto non cambia nulla). La funzione testaPassword() prova ogni combinazione di lettere (nel nostro codice ogni stringa da testare va dai 4 ai 12 caratteri) e controlla quale sia quella corretta.

Ecco come risulterà la funzione:
def testaPassword(password):
    m = hashlib.md5()
    m.update(password)
    if (m.hexdigest() == hashDaDecriptare):
        print "Password trovata:", password
        exit()
Cosa fa questa funzione per controllare se la combinazione di lettere che sta testando è corretta, ovvero quella che ha generato l'hash? Non fa altro che criptarla in MD5 e confrontarla con l'hash, se sono uguali allora è quella corretta (stampa la password sullo schermo e il programma termina), se invece sono diverse significa che non è quella corretta e il programma va avanti testando la prossima combinazione.

Ecco il codice completo, testato e funzionante.

Ottimizzazioni

Come puoi notare, avviando questo script Python, esso è molto lento perchè testa qualsiasi combinazione di lettere (e caratteri speciali). Un metodo per "velocizzarlo" e ottimizzarlo è quello di realizzare un bruteforce a dizionario che spiego in maniera dettagliata in questo articolo (+ video).

Lascio a te come esercizio realizzare un bruteforce MD5 a dizionario.

Conclusioni

Questa parte della serie sulla crittografia è stata molto pratica e intensa. Se hai qualche dubbio, curiosità o proposta non esitare a scrivere nei commenti.

< Parte 5  |  Parte 7 (non ancora disponibile) >

6 commenti:

  1. Ma allora chiunque può decriptare il tuo codice gli basterebbe andare su http://www.md5online.org/

    RispondiElimina
    Risposte
    1. Sicuro di aver letto bene l'articolo?

      Perchè c'è scritto:

      "Funziona il 100% delle volte? Assolutamente no.

      [...]

      Quando vai sul sito MD5 Online e inserisci una stringa criptata in MD5 nel box e premi il pulsante "Decrypt", il sito cerca nel suo database quale stringa in chiaro (decriptata) corrisponde alla stringa criptata che hai inserito. Se la trova, sei fortunato, e te la mostra. Se non la trova, pazienza... dovrai provare qualche altro metodo, che ora ti presenterò..."

      Decriptare hash MD5, soprattutto quelli generati da stringhe contenenti caratteri speciali, può richiedere molto tempo anche con un buon bruteforce (nonostante l'MD5 non sia il miglior algoritmo per criptare stringhe oggigiorno).

      Elimina
  2. Ok grazie
    Perché non riprendi la serie overthewire|wargames

    RispondiElimina
    Risposte
    1. La riprenderò non appena avrò un briciolo di tempo.

      Elimina
  3. esiste una guida per scoprire la password di qualsiasi sito,che funzioni al 100% (per esempio come scoprire la password di un account Gmail) senza lasciare tracce?

    RispondiElimina