¿Qué tipo de hash es este MD4 (MD4 (($ pass)). (strtolower ($ username))) [cerrado]

-3

¿Puedo descifrar este hash?

Credenciales en caché de dominio: MD4(MD4(($pass)).(strtolower($username)))

    
pregunta Radwan Cherfy 09.07.2015 - 04:26
fuente

1 respuesta

1
Los

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.

    
respondido por el Adam Katz 09.07.2015 - 23:39
fuente

Lea otras preguntas en las etiquetas