Le password sono uno strumento fondamentale per proteggere l’accesso a dispositivi, account e dati sensibili. Tuttavia, memorizzare le password in chiaro, cioè senza protezione, è estremamente rischioso poiché un attaccante potrebbe accedere a tutte le credenziali in caso di violazioni di sicurezza. Per ovviare a tale rischio, le password vengono cifrate o, più comunemente, hashate prima di essere salvate.

Cos’è l’hashing?

L’hashing è un processo crittografico che trasforma un dato di input (come una password) in una stringa di lunghezza fissa chiamata hash. Le principali proprietà di una funzione di hash crittografico sono:

  • Deterministico: lo stesso input genera sempre lo stesso hash.
  • Rapido da calcolare: il calcolo dell’hash deve essere efficiente.
  • Lunghezza fissa: l’output ha una lunghezza predefinita, indipendentemente dalla dimensione dell’input.
  • Resistenza alla pre-immagine: dato un hash, deve essere computazionalmente impossibile risalire al valore originale.
  • Resistenza alla seconda pre-immagine: dato un input e il suo hash, deve essere difficile trovare un altro input con lo stesso hash.
  • Resistenza alle collisioni: deve essere difficile trovare due input distinti che generano lo stesso hash.

Alcuni degli algoritmi di hashing più utilizzati sono SHA-256/SHA-512, BCrypt, PBKDF2 e Argon2. Ad esempio, il calcolo dell’hash SHA-256 per la password “Password123” è:

SHA-256(“Password123”) = 008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601

Nonostante l’hashing delle password sia un metodo più sicuro rispetto al salvataggio delle credenziali in chiaro, nel caso in cui non vengano utilizzate password sufficientemente forti, l’hashing non previene un attaccante nell’ottenere le credenziali iniziali. Il processo di recupero di password da dati memorizzati o trasmessi viene definito password cracking. Come verrà dimostrato in questo articolo, dato un hash è infatti possibile fare uso di tool ad-hoc per ottenere la stringa iniziale (i.e., la password) da cui l’hash è stato generato. Alcuni di questi tool sono: John the Ripper, Hashcat, Wfuzz, Medusa.

A fini dimostrativi, mostreremo come utilizzare “John the Ripper” su una macchina Kali Linux per ottenere le password in chiaro dati degli hash ottenuti in ambiente Linux e Windows.

Questo articolo è stato scritto a scopo puramente educativo e informativo. L’autore non approva l’uso di queste tecniche per attività illegali o non etiche. L’uso delle informazioni contenute in questo articolo è a tuo rischio e responsabilità. Ti incoraggiamo a utilizzare queste tecniche solo in ambienti di test autorizzati e in conformità con le leggi locali e le normative sulla sicurezza informatica.

Linux Password Cracking

Linux offre molti meccanismi di sicurezza. Uno dei più elementari è il file /etc/shadow, che contiene gli hash delle password degli utenti presenti nel file /etc/passwd. Il file /etc/shadow può essere letto solo dall’utente root o dai processi con privilegi adeguati, al fine di impedire attacchi di brute-force o rainbow table. Nel file /etc/shadow è presente una riga per ogni utente nel file /etc/passwd. Ogni riga è costituita da 9 campi separati da due punti (“:”):

  1. Username: nome utente dell’account.
  2. Password cifrata: la password è nel formato $tipo$salt$hash. Il salt è una stringa casuale aggiunta alla password prima di essere hashata mentre $tipo identifica l’algoritmo crittografico usato per l’hashing della password:
    • $1$: Message Digest 5 (MD5)
    • $2a$: Blowfish
    • $2y$: Eksblowfish
    • $5$: 256-bit Secure Hash Algorithm (SHA-256)
    • $6$: 512-bit Secure Hash Algorithm (SHA-512)
    • $y$ (o $7$): yescrypt
    • Nessuno dei precedenti: Data Encryption Standard (DES)
  3. Data ultimo cambio password: giorno in cui è stata cambiata la password l’ultima volta (espresso in numero di giorni dal 1/1/1970).
  4. Tempo minimo cambio password: numero di giorni che devono trascorrere prima che la password dell’utente possa essere modificata. In genere è impostato a 0, il che significa che l’utente può cambiare la password quando desidera.
  5. Tempo massimo cambio password: numero di giorni dopo i quali la password dell’utente deve essere modificata. Questo numero è impostato su 99999 di default.
  6. Periodo d’avviso: numero di giorni precedenti quello di scadenza della password in cui l’utente viene avvisato che la sua password deve essere cambiata.
  7. Periodo d’inattività: numero dei giorni successivi a quello di scadenza della password dopo i quali l’utente viene disabilitato. Solitamente questo campo è vuoto.
  8. Data di scadenza: giorno in cui l’utente è stato disabilitato (espresso in numero di giorni dal 1/1/1970).
  9. Inutilizzato: campo riservato per futuri utilizzi

Ipotizziamo di aver accesso al file /etc/shadow e che al suo interno siano presenti le seguenti righe (per semplicità riportiamo solamente i campi “username” e “password cifrata”):

In particolare, notiamo la presenza di 2 tipi di hash: yescrypt ($y) e SHA-512 ($6). L’obbiettivo sarà quello di ricavare le password in chiaro da cui sono stati calcolati gli hash sopra riportati. Pronti?

Per cominciare, eseguiamo “John the Ripper” da linea di comando fornendo solo il percorso del file in cui abbiamo salvato il contenuto di /etc/shadow. Salvando il contenuto nel file “pass.txt”, il comando da eseguire è “john pass.txt”:

Output comando “john pass.txt”

Il tool riconosce i due hash SHA-512 presenti nel file “pass.txt” e ricava immediatamente le password in chiaro “querty” e “123456” utilizzate, rispettivamente, dagli utenti bob e mary. In particolare, il tool ha utilizzato la modalità wordlist (dizionario) che consiste nel testare password comuni salvate all’interno di un file (nell’esempio il file “password.lst”).

Per specificare il tipo di hash che si sta cercando di crackare è possibile utilizzare il parametro “–format”. Di conseguenza, aggiungiamo “–format=crypt” al comando eseguito in precedenza per specificare che l’hash da crackare è yescrypt:

Output comando “john pass.txt –format=crypt”

Il tool riesce a trovare la password “kali” utilizzata dall’utente kali. Tuttavia fallisce nel ricavare le due password rimanenti utilizzando il metodo wordlist con il file “password.lst” e prosegue con il metodo brute-force incremental:ASCII”. Dato che il metodo brute-force consiste nel testare tutte le combinazioni di caratteri possibili, risulta essere computazionalmente costoso ed è quindi consigliato utilizzarlo come ultima spiaggia.

Come ulteriore tentativo, possiamo utilizzare nuovamente il metodo wordlist specificando esplicitamente quale file utilizzare come dizionario. “John the Ripper” fornisce quest’opzione tramite il parametro “–wordlist=<percorso_file>”. Uno dei file più famosi utilizzati come dizionario per il cracking delle password è “rockyou.txt”, il quale contiene milioni di password reali ottenute a seguito di una violazione di sicurezza che ha colpito nel 2009 la società RockYou. Per utilizzare questo file, aggiungiamo il comando “wordlist=/usr/share/wordlists/rockyou.txt” a quello eseguito in precedenza:

Output comando “john pass.txt –format=crypt –wordlist=/usr/share/wordlists/rockyou.txt”

In questo modo siamo riusciti a ricavare le ultime due password in chiaro: “P@ssw0rd!” e “Milan123” utilizzate, rispettivamente, dagli utenti jack e test.

Windows Password Cracking

In Windows, le password sono memorizzate in un file database denominato Security Accounts Manager (SAM), utilizzando il formato hash LM/NTLM. Il formato generale di una riga contenuta nel file SAM è:

username:RID:LM_hash:NT_hash:::

  1. username: nome utente dell’account.
  2. RID (Relative ID): valore del codice relativo che identifica l’utente all’interno del sistema.
  3. LM_hash: valore hash LM. È un hash più vecchio e più debole usato per l’autenticazione (spesso disabilitato nelle moderne versioni Windows).
  4. NT_hash: È l’hash più sicuro e ampiamente utilizzato nei moderni sistemi Windows. Può essere generato utilizzando l’algoritmo di hashing MD4.

Dato che ottenere le password dal database SAM non rientra tra gli scopi di questo articolo, supponiamo di aver copiato il contenuto di tale database in un file locale denominato “win_pass.txt”. Di seguito riportiamo il contenuto del file “win_pass.txt” che useremo per la nostra dimostrazione:

Si noti che l’hash LM “aad3b435b51404eeaad3b435b51404ee” corrisponde a “NO PASSWORD”, il che significa che gli hash LM sono disabilitati. Inoltre, l’hash NT “31d6cfe0d16ae931b73c59d7e0c089c0” (utente Administrator) rappresenta una password vuota.

Anche in questo caso possiamo utilizzare “John the Ripper” per ricavare le password in chiaro. Rispetto agli esempi precedenti, utilizzeremo il parametro “–format=nt” per specificare l’hash di tipo NTLM ed il file “win_pass.txt” dove abbiamo salvato il contenuto del file database SAM. Utilizzando la modalità wordlist e fornendo il file “rockyou.txt” come dizionario, il tool è in grado di ricavare immediatamente 4 delle 5 password in chiaro:

Output comando “john win_pass.txt –format=nt –wordlist=/usr/share/wordlists/rockyou.txt”

Per ricavare l’ultima password in chiaro, è sufficiente la modalità single, la quale utilizza informazioni derivate dal nome utente per creare password probabili. Questa modalità è utilizzata di default dal tool, senza la necessità di fornire dei parametri specifici:

Output comando “john win_pass.txt –format=nt”

Conclusione

Nel corso di quest’articolo abbiamo mostrato come sia semplice e rapido recuperare le password in chiaro dagli hash. Ciò evidenzia la pericolosità di utilizzare algoritmi di hashing deboli o mal implementati. Tuttavia, è importante notare che, sebbene questi attacchi siano efficaci contro hash deboli, l’adozione di algoritmi robusti come Argon2, unitamente all’uso di salting, può drasticamente aumentare la difficoltà nel decifrare le password. Inoltre, politiche di sicurezza più avanzate come l’autenticazione multi-fattore (MFA) risultano indispensabili per proteggere gli accessi. In un panorama di minacce in continua evoluzione, la sicurezza delle password non può essere sottovalutata. Proteggere gli hash significa proteggere l’accesso ai dati, garantendo una difesa efficace contro compromissioni e attacchi informatici.

Ti è piaciuto l’articolo? Seguici su Linkedin per sostenerci!

consigliati