¿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.