¿Puedo descifrar este hash?
Credenciales en caché de dominio:
MD4(MD4(($pass)).(strtolower($username)))
¿Puedo descifrar este hash?
Credenciales en caché de dominio:
MD4(MD4(($pass)).(strtolower($username)))
hash son no esquemas de compresión. La contraseña que está buscando no está almacenada en el hash, aunque en teoría es posible que alguien tenga un diccionario que lo asigne a su contenido original.
Dado el conocimiento del esquema,
MD4(MD4(($pass)).(strtolower($username)))
Puedes adivinarlo. MD4 es decentemente rápido de calcular, así que si tienes $username
, todo lo que queda es $pass
.
Usted puede construir una cosa así, o usar algo como John the Ripper , que supongo que puede configurarse para atacar este esquema.
En cuanto a qué tipo de hash es, la mayoría de las veces ha respondido a la pregunta nombrando cómo se compone. MD4 es un algoritmo de resumen bastante antiguo pero rápido. Este esquema usa ese algoritmo dos veces; En primer lugar, la contraseña se descifra y concatena el hash con la forma en minúscula del nombre de usuario, luego se escribe la cadena resultante.
Implementación de muestra en perl:
#!/usr/bin/perl
use Digest::MD4 "md4_hex";
my $username = shift;
my $pass = shift;
print md4_hex( md4_hex($pass) . lc($username) ) . "\n";
Algunas salidas:
$ perl sample.pl user password
200677efff76ec27e716b319b611e217
$ perl sample.pl AzureDiamond hunter2
8ff17c78faf27083670a7423a90a964c
Ejemplo de cracker de contraseñas de fuerza bruta (mudo):
#!/usr/bin/perl use Digest::MD4 "md4_hex"; my $username = shift; my $pw_hash = shift; my $i = 0; sub hash_check { shift; if (md4_hex( md4_hex($_) . lc($username) ) eq $pw_hash) { print "\r$i\nPassword found: '$_'\n"; exit; } } LINE: while() { chomp; my @variants = ($_); my $v = $_; $v =~ s/\W//g; # strip non-word chars push(@variants, $v) if ($_ ne $v); $v = lc($_); # all lowercase push(@variants, $v) if ($_ ne $v); $v =~ s/\W//g; # all lowercase AND strip non-word chars push(@variants, $v) if ($_ ne $v); $v = uc(substr($_,0,1)).substr($_,1); # uppercase 1st char push(@variants, $v) if ($_ ne $v); $v =~ s/\W//g; # uppercase 1st char AND strip non-word chars push(@variants, $v) if ($_ ne $v); for my $pw (@variants) { # try followed by nothing or 1-2 digits for my $j ("", 0..99, qw/00 01 02 03 04 05 06 07 08 09/) { $i++; print "\r$i" if $i % 111 == 0; # only print every 111 (this is FAST) $_ = $pw . $j; last LINE if hash_check($_); } } } print "\r$i\n";
Algunas salidas:
$ echo password |perl sample.pl user 200677efff76ec27e716b319b611e217
1
Password found: 'password'
$ perl /tmp/sample.pl user a3c705c458e12e2f9982ae2682b437f8 american-english
26955905
Password found: 'password07'
$ perl sample.pl admin 4ef6c6a21c0172c8cd322dd8f78ba6c1 american-english-huge
126764776
$
Mi computadora portátil (que funcionó a 650k pw / seg) no encontró su contraseña dadas estas iteraciones simples (palabra del diccionario con algunas conjeturas sobre el caso, 0-2 dígitos después de ella). / usr / share / dict / american-english-huge tiene 341,472 palabras y proviene del paquete Debian wamerican-huge versión 7.1-1.