Hash Cracking con Hashcat

Per quanto possa sembrare strano, il cracking delle password, o meglio l’hash cracking, viene effettuato dall’attacker dopo aver ottenuto l’accesso al sistema, non prima. Semmai, come tentativo d’accesso si può utilizzare un login cracking, tecnica simile a quelle descritte in questo articolo ma che fa riferimento ad un contesto diverso.

L’hash cracking viene effettuato soprattutto come tecnica di privilege escalation, per mantenere l’accesso dopo un attacco, ma anche per il riutilizzo delle password in altri contesti (account cracking).

In questo articolo parlerò delle principali tecniche di password cracking, anzi, per la precisione di hash cracking. Questa operazione entra di solito in scena nella fase di post-exploitation, ovvero quando l’attacker è riuscito in qualche modo e penetrare un sistema e ad esfiltrare informazioni, come appunto il fie delle password, per esempio il SAM database in Windows, il file shadow nei sistemi Linux, il database di una web application dove le password vengono memorizzate in MD5.

Per approfondire come prelevare le password di Windows da remoto, può dare uno sguardo a questo vecchio post.

Teoria dell’Hash Cracking

Le password non dovrebbero mai essere memorizzate in chiaro, ma cifrate. Questo è quello che fanno i sistemi operativi e le principali web application in giro per Internet. Inoltre, non dovrebbero essere codificate tramite algoritmi reversibili, ma tramite algoritmi “a senso unico”, ovvero algoritmi di hashing.

Da un codice hash non si può risalire alla password che lo ha generato; l’unica cosa che si può fare è confrontarlo con il risultato di un’operazione di hashing effettuata partendo da un valore noto. Questo è proprio quello che fa un programma per garantire al legittimo utente l’accesso al sistema: l’utente digita la password, quest’ultima viene codificata con l’algoritmo di hashing e il risultato viene confrontato con l’hash memorizzato. Se i due valori corrispondono, la password immessa è valida, altrimenti no.

Ovviamente l’attacker non conosce la password, quindi per “craccarla” deve generare una quantità di candidati, dove per candidato intendo una parola in chiaro codificata con l’algoritmo utilizzato per generare la password ignota,  da confrontare con l’hash; quando il candidato corrisponde, la password è stata trovata.

Un  esempio concreto. Se prendiamo la parola ‘pippo’ e la codifichiamo tramite MD5, otteniamo:

pippo -> MD5 -> 0c88028bf3aa6a6a143ed846f2be1ea4

ma se prendiamo il codice hash 0c88028bf3aa6a6a143ed846f2be1ea4, non siamo un grado di risalire al messaggio originale:

0c88028bf3aa6a6a143ed846f2be1ea4 -> ???

L’unica cosa da fare è prendere delle parole, codificarle e confrontare il risultato con l’hash ignoto:

pluto -> MD5 -> c6009f08fc5fc6385f1ea1f5840e179f = 0c88028bf3aa6a6a143ed846f2be1ea4? NO
paperino -> MD5 -> b54b45b19ca1f1ddc424e6b878a53f2d = 0c88028bf3aa6a6a143ed846f2be1ea4? NO
pippo -> MD5 -> 0c88028bf3aa6a6a143ed846f2be1ea4 = 0c88028bf3aa6a6a143ed846f2be1ea4 SI!!!
La password è pippo!

Strategie di Cracking

Per fare questo esistono diverse strategie, fondamentalmente tre: l’attacco a dizionario, dove vengono utilizzate corpose raccolte di parole utilizzatre come candidati; quando dico “corpose raccolte”, intendo dire alcuni miliardi; l’attacco brute-force, ovvero forza bruta, dove viene specificato un  charset, ovvero una serie di caratteri (per esempio, tutti i caratteri alfabetici minuscoli), la lunghezza minima e quella massima, e vengono quindi generati i candidati in tempo reale, testando tutte le combinazioni possibili del charset specificato; inutile dire che questo attacco può durare anche molto a lungo. la terza strategia è quella dell’attacco ibrido, dove viene utilizzato un  dizionario come base portante dell’attacco, e per ogni parola del dizionario vengono effettuate permutazioni, trasformazioni o  manipolazioni, come l’aggiunta all’inizio e/o alla fine di numeri.

Negli esempi che porto in questo articolo, utilizzo Hashcat, potente e veloce hashcracker, strumento assai diffuso nel mondo ethical e non ethical hacking:

http://hashcat.net/hashcat/

Inoltre, per poter effettuare attacchi dictionary attack (che vedremo tra poco) è necessario disporre di grossi file di dizionari; di seguito potete trovare due dei dizionari più utilizzati:

Crackstation

Rockyou

Dictionary Attack

Il primo tipo di attacco agli hash è sicuramente il dictionary attack. In questo tipo di attacco, i candidati vengono generati elaborando tramite l’algoritmo di hashing target una serie di parole in chiaro, confrontando il risultato di questa operazione con l’hash da craccare. E’ superfluo precisare che questo tipo di attacco è particolarmente efficace quando si hanno a disposizione dizionari corposi (qualche miliardo di parole).

L’attacco a dizionario contro un hash MD5 può essere eseguito tramite hashcat con i seguenti parametri:

hashcat-cli64.exe -a 0 -m 0 hashtocrack.txt dictionary.txt

Dove  -a 0 indica l’attacco (dictionary), -m 0 è l’algoritmo MD5, hashtocrack.txt il file che contiene l’hash da craccare e dictionary.txt ovviamente è il file che contiene le parole da codificare e confrontare con l’hash..

Brute-force Attack

Nel brute force attack, i candidati vengono generati dal programma in base a regole specificate. Bisogna istruire l’hashcracker specificando la lungheza della password che stiamo cercando di craccare e di quali caratteri si presume sia composta la password. Nell’esempio seguente, hashcat genera tutte le combinazioni di lettere (minuscole) e numeri, della lunghezza compresa tra 7 e 8 caratteri:

hashcat-cli64.exe -m 0 -a 3 hashtocrack.txt -1 ?d?l ?1?1?1?1?1?1?1?1 --pw-min 7 --pwd-max 8

Dove -a 3 indica l’attacco brute-force, -m 0 (come prima) indica l’hash md5, –pw-min e –pw-max indicano in modo abbastanza intuitivo la presunta lunghezza minima e massima della password da craccare. L’opzione -1 è un po’ più complessa: significa che possiamo specificare un charset personalizzato, combinando due charset standard (?d e ?l). Il nostro charset sarà quindi formato da tutte le cifre decimali (?d indica tutti i numeri da 0 a 9) e da tutti i caratteri alfabetici minuscoli (?l significa appunto tutte i caratteri alfabetici minuscoli, lowercase).

L’opzione seguente (?1?1?1?1?1?1?1?1) indica il numero di posizioni del nostro charset da combinare. Questa regola, genera tutte le combinazioni (lunghe fino a 8 caratteri) di caratteri alfanumerici (numeri e lettere dell’alfabeto minuscole).

In questo articolo ho presentato le tecniche base dell’hash cracking, ho spiegato le necessarie basi teoriche e ho indicato alcune risorse per poter iniziare a praticare l’arte.

One comment to “Hash Cracking con Hashcat”
  1. Pingback: Diventare Esperto in Web App Security | PillolHacking.Net

Comments are closed.