mercoledì 17 novembre 2010

Cracking delle password in linux

Nei sistemi linux le password per i vari utenti non sono conservate in chiaro in un file, ovviamente questo sarebbe veramente troppo pericoloso, quindi prima di memorizzarle, si utilizza una funzione hash non invertibile. La più nota e utilizzata si basa sul DES, ed è chiamata dal comando di sistema crypt().Detta funzione ha come input una password in chiaro, ed un valore di salt, e restituisce come output un hash avente come prefisso il valore di salt. Da un punto di vista matematico è impossibile risalire alla password partendo dall' hash, il valore di salt è utilizzato per perturbare l' algoritmo di generazione dell'hash, in tal modo è possibile avere hash differenti per password uguali, ad esempio crypt(prova, ju) risulterà differente da crypt(prova, ki). Quando un utente intende autenticarsi, viene invitato ad inserire la password che insieme al valore di salt(estratto dal file delle password) viene elaborata dalla funzione crypt(), se l'hash ottenuto corrisponde a quello contenuto nel file delle password l' utente sarà autenticato, è da notare che questo sistema funziona senza che la password in chiaro venga memorizzata. Ora se è vero che da un punto di vista matematico è impossibile dall' hash risalire alla password, nulla vieta di procedere per tentativi, cioè si potrebbe provare ad utilizzare un dizionario, ed estraendo dal file delle password il salt di un particolare hash , provare e riprovare finchè una parola del dizionario e il salt ,passando per la funziona crypt(), diano come risultato l'hash memorizzato nel file delle password. Implementando questo procedimento in perl :

#!/usr/bin/perl
$hash=shift;
$salt=substr($hash,0,2);
while(defined($pass =<STDIN>))
{
chomp $pass;
if(crypt($pass,$salt) eq $hash)
{
print "la password è $pass\n";
exit;
}
}
print "non è stata trovata nessuna password\n";

Oppure si può utilizzare un tool come "John the ripper" che potete scaricare a questo indirizzo http://www.openwall.com/john/, con esso è anche possibile implementare attacchi a "forza bruta esaustivi" non utilizzando dizionari ma permutando in tutti i modi possibili un set di caratteri di input. Ovviamente per password relativamente lunghe, questo tipo di attacco diventa impraticabile a causa del troppo tempo necessario. John ha un file dizionario di base nella directory usr/share/john/password.lst , che volendo si può cambiare o modificare, per il resto basta copiare il contenuto dei file /etc/shadow ed /etc/passwd diamo quindi il seguente comando:

./unshadow /etc/passwd /etc/shadow > passwd1

e successivamente lanciare john

./john –single passwd1

Nessun commento:

Posta un commento