Craccare gli Hash di WordPress

Sebbene le password di una web application vengano memorizzate nel database in formato cifrato, la loro sicurezza può essere comunque violata. Questa affermazione è ancora più valida nel caso in cui le password vengano cifrate utilizzando una “semplice” funzione md5.

Ricordo che le funzioni di hashing, come appunto md5, sono funzioni non reversibili, ovvero dal risultato non si può risalire ai dati di origine; ma il cracking di queste funzioni è oggi relativemente semplice, per esempio avvalendosi dell’ausilio delle ormai celebri rainbow-tables, gigantesche raccolte di hash precalcolati che possono garantire il cracking in pochi secondi.

Contromisura a questo tipo di attacco è l’utilizzo di “salt”, codice pesudo-casuale da aggiungere alla password stessa prima dell’operazione di cifratura. Utilizzando questo stratagemma, l’operazione di cifratura di una password darà come risultato valori sempre diversi, pur partendo dalla stessa password; o meglio, il range di valori aumenterà in maniera tale da metter fuori gioco un semplice dicitionary attack basato su rainbow-tables.

Dalla versione 2.5 WordPress non utilizza più l’md5 per cifrare le password degli utenti, bensì PHpass (Portable PHP hashing framework). La funzione di questo framework utilizzata da WordPress effettua esattamente quanto prima descritto: prende la password, aggiunge un valore pseudo-casuale (salt), e la cifra in modo irreversibile.

E’ possibile sperimentare questo algoritmo sul WordPress Password Hasher. Immetendo diverse volte la stessa parola, si otterranno tre risultati diversi. Per esempio, la parola ‘pippo’ inserita tre volte di seguito ha dato i seguenti risultati:

$P$9JmG4rSRpKy8dMDlBZIS9EbbQL.4hG0
$P$9KBRt4BmTd8Nr6/E1Sqkr1SUk1K04t0
$P$9ugzNerdeoDyFcPmxc.wshdWQxKFLI.

C’’è una contromossa: lo script che presento oggi è in grado di attaccare gli hash di WordPress (ovvero quelli generati da PHpass),  con un dictionary attack. L’utilizzo è semplice.

Bisogna invocare lo script da linea di comando passando tramite l’opzione -w il file dizionario contenente le parole da testare; una volta avviato, il programma chiederà di incollare l’hash:

Usage: C:\PH\phpasscracker.py [-w wordlist] [-p prefix] [-v]
 
Options:
--version      show program version number and exit
-h, --help     show this help message and exit
-w WORDLIST    wordlist to run against hash
-p PREFIX      hash prefix (default: $P$)
-v, --verbose  verbose
-l, --license  license
 
C:\PH>phpasscracker.py -w dict.txt
[*] phpass hash brute force tool (by thebug)
[*] hash prefix: $P$
[*] paste hash here: $P$9fVkv/wPYCIx0K8TOycOPYlFeTYoSQ.
[*] 3 word(s) loaded.
[*] brute force started.
 
[*] got it!
[*] password is: pippo

Naturalmente per ottenere gli hash è necessario prima riuscire ad accedere al database della vittima, cosa che si potrebbe fare per esempio tramite un attacco SQL-Injection.

Lo script (realizzato in python) lo potete trovare qui

9 Commenti

  1. Angelo se un malintenzionato avesse accesso diretto al db, non gli basterebbe inserire una password in chiaro su phpmyadmin, selezionare sha5 e dare ok? Mi è capitato di modificare così una password di wordpress recente (credo fosse un 2.9) ottenendo così il login (era una mia installazione, intendiamoci, in locale per altro). Non è un’operazione stealth come quella di recuperare la psw originale, ma per un cracker è più che sufficiente, non credi?

  2. si, mettendo una password in phpmyadmin e cifrando con md5 (con sha1 non sono sicuro) crei manualmente una nuova password valida. Però quelle generate da WP, a partire dalla versione 2.5, sono quelle generate con la libreria di cui parla il post (vedi wp-includes/class-phpass.php).
    Naturalmente se l’attacker recupera gli hash dal db ha già un qualche tipo di accesso, forse anche profondo, al sistema. In un altro articolo mostravo come, partendo da una “semplice” sql-injection, sia possibile dilagare nel sistema fino a diventare root (e oltre).
    In alcuni casì però potrebbe essere necessario risalire alla password precisa di un particolare utente. In questo caso l’unica via è quella di craccare l’hash.

  3. Direi che l’accesso che otterrebbe è certamente profondo. Una volta dentro WordPress si può utilizzare l’uploader integrato oppure installare un plugin ad hoc per caricare codice eseguibile sull’hosting. Quanto meno quell’account è compromesso, risalire al controllo di tutta la macchina ovviamente è un altro paio di maniche e si incorrerebbe alle limitazioni poste allo stesso account di cui ci si è impossessati. Se è un servizio di hosting serio dovrebbe essere difficile…

  4. Chiaro ma l’azienda non dovrebbe aver preso (più o meno tutte) le contromisure necessarie per evitare che ciò avvenga? Ovviamente tutto è possibile, ma quantomeno dovrebbe essere più difficile di craccare una psw di wordpress, no?

  5. il cracking della password di wordpress e la privilege escalation appartengono a fasi diverse dell’attacco; le strategie dipendono anche dagli scopi. Ovviamente i servizi di hosting dovrebbero prendere tutte le contromisure, cosa che non sempre succede, e non sempre è sufficiente

  6. Ciao Angelo, bell’articolo… purtroppo però un attacco dizionario non credo sia il massimo… nel 90% dei casi credo fallirà.. Non esistono metodi alternativi?

  7. Ciao Angelo, interessante l’articolo.
    Sto cercando di creare uno script per modificare le password degli utenti del mio WordPress da applicazione esterna a WP.
    Da quel che dici le password non vengono criptate con MD5 ma con PHPass: qual è la funzione PHP che devo richiamare per criptarle in tal maniera?

    Grazie mille

1 Trackback / Pingback

  1. upnews.it

I commenti sono bloccati.