Security

Weak password or weak hash function

A new tragedy

Dario Ragno Novembre, 2020
Weak password or weak hash function
Durante un'attività di penetration test, quando si ottiene l'accesso agli hash delle password, si è già a metà dell'opera, ad un passo dall'ottenere un accesso al sistema.
Viene quindi spontaneo domandarsi: ma quanto impattano gli algoritmi utilizzati per memorizzare le password, rispetto all'utilizzo di password deboli o facilmente indovinabili?
 

Getting the hashes

Siamo partiti con una richiesta di penetration test blackbox su un'applicazione web pubblicamente esposta, nessuna credenziale o informazioni sul sistema oggetto di test. Già durante le prime fasi di reconnaissance, scanning ed enumeration era stato però possibile individuare un entry point da sfuttare per ottenere un accesso valido. Infatti, complice un errore nella configurazione dell'application server, è stato possibile scaricare, tra le altre informazioni, un dump del database contenente le tabelle e il loro contenuto, compresa la tabella users; all'interno del campo password (giustamente!) non sono salvate le password in chiaro, ma il loro hash. Di seguito un estratto della tabella opportunamente anonimizzato.
 
Estratto del file database.sql

Il passo successivo è stato quindi provare a craccare questi hash al fine di ottenere credenziali valide per accedere al sistema.
 

Cracking the hashes

Da un'analisi veloce si può notare che questi hash non sono tutti uguali, ma si tratta di un "mix" di lunghezze e formati, in particolare di MD5 (caratterizzati dalla loro lunghezza di 32 caratteri) e di bcrypt (con il loro tipico prefisso $2*$).

L'MD5 è considerato ormai un algoritmo debole per l'hashing delle password per diversi motivi:
  • è pensato per essere veloce da calcolare, con passaggi dell'algoritmo molto semplici
  • è soggetto a collisioni
  • un eventuale sale (o salt) deve essere implementato a livello applicativo

A differenza dell'MD5, il bcrypt è pensato per essere:
  • resistente a collisioni
  • dotato di meccanismi di salting "automatici"
  • con un work factor variabile, che incrementa ulteriormente la potenza computazionale necessaria per generare un hash (e di conseguenza craccarlo)

Con queste premesse la scelta di quali hash provare a craccare è scontata: gli hash obsoleti in formato MD5. Una volta caricato un dizionario di password comuni, all'interno del software per il cracking delle password preferito (in questo caso abbiamo usato Hashcat), si può partire con l'attacco di forza bruta.

Dopo qualche minuto, il risultato è stato il seguente:
 
Hashcat - session exhausted - No results

Nessuna delle quasi 2 miliardi di password testate nel giro di 5 minuti ha un match con gli hash presenti nel database.

Poco male, può essere che la password non sia una parola appartenente a qualche dizionario ma magari è stata usata una sua permutazione o una sua versione in alfabeto leet (ad esempio: Password -> P4ssw0rd!) per essere conforme a qualche password policy, o nel tentativo di essere più difficile da indovinare. Per venire incontro a questi casi gli strumenti cracking mettono a disposizione delle "rules" che consentono, a partire da una parola base, di ottenere una lista di parole derivate ma con aggiunte, sostituzioni, rimozioni e manipolazioni tipiche delle password, per garantire un bilanciamento tra sicurezza e facilità di memorizzazione. Di seguito un esempio di regola applicata alla parola "password".
 
Password permutation rule sample

Quindi configuriamo Hashcat per utilizzare una rule di permutazione di media complessità e riavviamo:
 
Hashcat - Session exhausted on permutation rule

Anche in questo caso, dopo 20 minuti e più di 128 miliardi di password testate (2B*64, utilizzando 64 permutazioni) ancora nessun risultato.

Esaurite anche le altre wordlist tipiche e provate un po' di regole di permutazione senza alcun successo, rimane da provare con l'attacco di brute force "puro". Il successo è garantito ma il tempo necessario cresce esponenzialmente in funzione della lunghezza e del tipo di caratteri utilizzati... potenzialmente non basterà una vita intera per vedere le password craccate.
 
Tempe necessario al cracking in funzione della complessità

A questo punto tentare di craccare gli hash in formato bcrypt era poco più che una formalità, quasi sicuri che fosse impossibile ottenere una password da utilizzare in quest'era geologica.

Stessa configurazione usata per l'MD5, nessuna regola di permutazione. Una volta cliccato invio con una poco promettente frequenza 580H/s (hash al secondo, contro gli oltre 100 milioni di hash al secondo dell'MD5) ecco che a poco a poco le password vengono craccate, una dopo l'altra:
 
 
Hashcat - first bcrypt hashed password cracked
 
Dopo soltanto 4 minuti sono state già ottenute 4 password su 5, a smentire il tempo previsto di 77 giorni soltanto per provare tutte le parole della wordlist!

Le prime 3 password si sono rivelate inutili in quanto associate ad utenze disabilitate ma l'ultima è stata quella che ci ha consentito di accedere al sistema come amministratore dell'applicazione, arrivando all'obiettivo più ambito.
 
Hashcat - Bcrypt admin password cracked
 

Conclusioni

L'utilizzo di password deboli o facilmente indovinabili mette ancora una volta in evidenza come l'essere umano rimane l'anello debole di un sistema informatico, anche se vengono utilizzati sistemi di sicurezza e algoritmi all'avanguardia.

Per proteggere i nostri sistemi è quindi importante imporre l'utilizzo di password complesse, dall'adeguata lunghezza e complessità, che non derivino da parole di uso comune o da altre informazioni note o, ancora meglio, incentivare l'utilizzo di passphrase.

Ma quindi utilizzare algoritmi di hashing "forti" e specifici per le password è inutile? Al contrario! L'uso di questi algoritmi, associato a password sicure, rende estremamente complesso (se non impossibile) ottenere una password in chiaro in tempi ragionevoli.
 

Riferimenti

Articoli correlati

Security

Articoli in evidenza

Approfondimenti

UNISCITI A NOI. INVIA LA TUA CANDIDATURA

Certimeter Group crede nei valori, nella passione e nella professionalità delle persone.