+55 minutes in Generating Dictionary for 194GB
#9
Well...
I looked at the problem a bit more in depth and now I'm aware (hope to be wrong) that I can use only a dictionary based attack. Also using ethercrack that has the "presale" option, that @philsmd gently proposed, has no way of solving my issue.


The key points are:
  • passphrase is between 23 and 25 chars 
  • passphrase is presumably created with 3 names (i.e. Camille, Ernest, Savannah)
  • the "a" can be "@" at least in the first position
  • the "e" can be "€" at least in the first position
  • the first letter of every name is capitalized
  • at the end of the passphrase can be a "*"

So the only way I found (please refute me!) is dictionary attack with a very big dictionary. 
So I can for sure pipe the dictionary I created into the .pl scripts that @philsmd wrote and I have only to test it.

If other infoes are needed please tell me.
Thanks


(04-07-2017, 02:12 PM)dindolo1979 Wrote: Wow !! Thank you.
Ok I'll collect info and give a better definition of the scenario as well as I can.
I'll try the perl code you wrote and try to contribute asap.

Thanks

(04-07-2017, 02:03 PM)philsmd Wrote: @dindolo1979 Attention: I would be very careful with this small set of information you provided/got here.

As far as I understood the algorithm is much more simple/straight forward and doesn't need any AES etc steps just to validate the password.

If you are really interested in some more (technical) discussions and/or if you want that these algorithms (actually yes, there are 2 different algorithms at least!) to be added to hashcat, we should continue to collect some information and maybe you can contribute a little bit (with some more info, e.g. which file a user normally has etc, I'm thinking about e.g. the ~/.web3/keys/ files on linux, but I'm not too familiar with ethereum)...

This is what I got so far, a POC:
pbkdf2:
Code:
#!/usr/bin/env perl

# author: philsmd (for hashcat)
# date: april 2017

use strict;
use warnings;

use Crypt::PBKDF2;
use Digest::Keccak qw (keccak_256_hex);

#
# Algorithm can be found in: SecretStore::decrypt () in cpp-ethereum/libdevcrypto/SecretStore.cpp
# Examples can be found in:  cpp-ethereum/test/unittests/libdevcrypto/SecretStore.cpp
#

my $mac = "cf6bfbcc77142a22c4a908784b4a16f1023a1d0e2aff404c20158fa4f1587177"; # the "hash"

my $ciphertext = "d69313b6470ac1942f75d72ebf8818a0d484ac78478a132ee081cd954d6bd7a9";

# pbkdf2 params:

my $dklen = 32;
my $c = 262144; # iterations
my $salt = "c82ef14476014cbf438081a42709e2ed";

# pass:

# my $pass = "bar";

#
# Start
#

my $salt_bin = pack ("H*", $salt);

my $ciphertext_bin = pack ("H*", $ciphertext);

while (my $pass = <>)
{
 chomp ($pass);

 # pbkdf2:
 
 my $pbkdf2 = Crypt::PBKDF2->new
 (
   hasher     => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
   iterations => $c,
   out_len => $dklen
 );
 
 my $derived_key = $pbkdf2->PBKDF2 ($salt_bin, $pass);

 my $derived_key_cropped = substr ($derived_key, 16, 16);

 # SHA3 - keccak (needed for the "mac" check)
 
 my $mac_gen = keccak_256_hex ($derived_key_cropped . $ciphertext_bin);
 
 if ($mac_gen eq $mac)
 {
   print "Password found: '$pass'\n";
 }
}

how to run it:
Code:
echo bar | ./ethereum_pbkdf2.pl

scrypt:
Code:
#!/usr/bin/env perl

# author: philsmd (for hashcat)
# date: april 2017

use strict;
use warnings;

use Crypt::ScryptKDF qw (scrypt_raw);
use Digest::Keccak   qw (keccak_256_hex);

#
# Algorithm can be found in: SecretStore::decrypt () in cpp-ethereum/libdevcrypto/SecretStore.cpp
# Examples can be found in:  cpp-ethereum/test/unittests/libdevcrypto/SecretStore.cpp
#

my $mac = "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097"; # the "hash"

my $ciphertext = "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c";

# scrypt params:

my $dklen = 32;
my $n = 262144;
my $p = 8,
my $r = 1,
my $salt = "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19";

# pass:

# my $pass = "testpassword";

#
# Start
#

my $salt_bin = pack ("H*", $salt);

my $ciphertext_bin = pack ("H*", $ciphertext);

while (my $pass = <>)
{
 chomp ($pass);

 # scrypt:

 my $derived_key = scrypt_raw ($pass, $salt_bin, $n, $r, $p, $dklen);

 my $derived_key_cropped = substr ($derived_key, 16, 16);

 # SHA3 - keccak (needed for the "mac" check)

 my $mac_gen = keccak_256_hex ($derived_key_cropped . $ciphertext_bin);

 if ($mac_gen eq $mac)
 {
   print "Password found: '$pass'\n";
 }
}

how to run it:
Code:
echo testpassword | ./ethereum_scrypt.pl

(examples, as mentioned within the code, are from: cpp-ethereum/test/unittests/libdevcrypto/SecretStore.cpp)

Note: the code is in perl, but it wouldn't be impossible to add GPU support with hashcat, but we need to clarify a lot of things first, actually there is already a github issue here: https://github.com/hashcat/hashcat/issues/262 (with very little information about the algorithm)


Messages In This Thread
RE: +55 minutes in Generating Dictionary for 194GB - by dindolo1979 - 04-07-2017, 04:33 PM