Che tipo di hash è questo MD4 (MD4 (($ pass)). (strtolower ($ username))) [chiuso]

-3

Posso decifrare questo hash?

Credenziali memorizzate nella cache del dominio: MD4(MD4(($pass)).(strtolower($username)))

    
posta Radwan Cherfy 09.07.2015 - 04:26
fonte

1 risposta

1

Gli hash sono schemi di compressione non . La password che stai cercando non è memorizzata nell'hash, sebbene sia teoricamente possibile che qualcuno abbia un dizionario che lo mappa al suo contenuto originale.

Conoscenza dello schema,

MD4(MD4(($pass)).(strtolower($username)))

Puoi indovinarlo. MD4 è decentemente veloce da calcolare, quindi se hai $username , tutto ciò che rimane è $pass .

Puoi o costruire una cosa del genere da te, o usare qualcosa come John the Ripper , che presumo possa essere configurato per attacca questo schema.

Per quanto riguarda ciò che è tipo di hash, per lo più hai risposto alla domanda nominando come è composta. MD4 è un algoritmo di digest piuttosto vecchio ma veloce. Questo schema usa quell'algoritmo due volte; in primo luogo, blocca la password e concatena l'hash con la forma minuscola del nome utente, quindi blocca quella stringa risultante.

Implementazione di esempio in perl:

#!/usr/bin/perl

use Digest::MD4 "md4_hex";

my $username = shift;
my $pass = shift;

print md4_hex( md4_hex($pass) . lc($username) ) . "\n";

Alcune uscite:

$ perl sample.pl user password
200677efff76ec27e716b319b611e217
$ perl sample.pl AzureDiamond hunter2
8ff17c78faf27083670a7423a90a964c

Esempio (stupido) password cracker brute force:

#!/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";

Alcune uscite:

$ 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
$ 

Il mio laptop (che eseguiva questa operazione a 650k pw / sec) non trovava la password data a queste semplici iterazioni (parola del dizionario con qualche ipotesi sul caso, 0-2 cifre che lo seguono). / usr / share / dict / american-english-huge ha 341.472 parole e proviene dal pacchetto Debian wamerican-versione enorme 7.1-1.

    
risposta data 09.07.2015 - 23:39
fonte

Leggi altre domande sui tag