Is there a way to extract a password hash from AESCrypt archive?
#1
I used this to make the archive https://www.aescrypt.com/
Reply
#2
on the official forum there is a topic about bruteforce a forgotten password on https://forums.packetizer.com/viewtopic.php?f=72&t=1333 there is a slow python version using the tool itself but a user claims to have a c version not requiring the tool. So if you can get your hands on that it would help analyse the problem.
Reply
#3
okay, googling a bit more it seems the format is pretty open. The fileformat is described on https://www.aescrypt.com/aes_file_format.html and there is source on https://github.com/kenkendk/sharpaescrypt/ to encrypt/decrypt files.

In the code on https://github.com/kenkendk/sharpaescryp...pt.cs#L523 it seems it uses the password to decrypt a part and hmac a part and compare, if that is equal the password is correct. So this should be doable. However I don't think hashcat can do this right now.
Reply
#4
Thanks! I sent him an email, let's see if he responds.
Reply
#5
it seems that the algorithm is quite simple and there are a lot of alternative implementations.

as a test I tried to find out if I'm able to recover/find the password of the example file from here: https://www.aescrypt.com/hello_world.txt, I've just developed a simple perl POC and I found the password within seconds (it's "hello", without quotes).

Code:
#!/usr/bin/env perl # Author: philsmd # Date: January 2020 # License: public domain (credits go to philsmd and hashcat) # the main algo can also be seen here: # (or alternative implementations from https://www.aescrypt.com/download/) # https://github.com/marcobellaccini/pyAesCrypt/blob/4b09ddc3737c539ee9fac179cab460abbb2b053e/pyAesCrypt/crypto.py#L59-L68 use strict; use warnings; use Digest::SHA qw (sha256); use Digest::HMAC qw (hmac); use Encode; # # Example file from https://www.aescrypt.com/hello_world.txt # # 41 45 53 02 00 00 18 43 52 45 41 54 45 44 5f 42 # 59 00 61 65 73 63 72 79 70 74 20 33 2e 30 35 00 # 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 00 00 00 db 66 a1 f9 73 4f 97 b5 6c 0d 1d ca 0c # aa 13 c9 4f 01 8c 9e 33 15 e3 04 87 1f d2 59 da # 97 14 a4 6e 66 d5 8f f7 af 05 44 92 d8 21 d8 82 # 6b c2 7e bc 13 d6 f7 60 7a 3b 3b 0b de 60 a3 a4 # 39 66 34 21 65 70 97 3b a6 49 60 fd 70 e0 5d fa # 71 b6 61 78 49 de 7d 38 69 b4 6d 1d 9c 84 a2 57 # 77 80 61 66 43 87 15 98 af 07 a6 ab ea a6 ff 82 # 89 2f 6f 0e 24 0c 7e 6f 35 f3 46 73 6a 9e 5a ca # 35 f7 97 93 cf 5a 79 74 77 5a 3d 50 0a dd 29 4e # 17 f4 f6 8c # File format is explained here: https://www.aescrypt.com/aes_file_format.html # 41 45 53 signature # 02 version # 00 reserved # 00 18 extension size # 43 52 45 41 54 45 44 5f 42 59 00 61 65 73 63 72 79 70 74 20 33 2e 30 35 extension # 00 80 extension size # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 extension # 00 00 extension size # db 66 a1 f9 73 4f 97 b5 6c 0d 1d ca 0c aa 13 c9 IV # 4f 01 8c 9e 33 15 e3 04 87 1f d2 59 da 97 14 a4 enc IV # 6e 66 d5 8f f7 af 05 44 92 d8 21 d8 82 6b c2 7e bc 13 d6 f7 60 7a 3b 3b 0b de 60 a3 a4 39 66 34 enc key # 21 65 70 97 3b a6 49 60 fd 70 e0 5d fa 71 b6 61 78 49 de 7d 38 69 b4 6d 1d 9c 84 a2 57 77 80 61 HMAC # 66 43 87 15 98 af 07 a6 ab ea a6 ff 82 89 2f 6f content # 08 file size % 16 # 24 0c 7e 6f 35 f3 46 73 6a 9e 5a ca 35 f7 97 93 cf 5a 79 74 77 5a 3d 50 0a dd 29 4e 17 f4 f6 8c HMAC # the password of the file that I've discovered by this script is: "hello" (without quotes) my $iv = pack ("H*", "db66a1f9734f97b56c0d1dca0caa13c9"); my $enc_iv = pack ("H*", "4f018c9e3315e304871fd259da9714a4"); my $enc_key = pack ("H*", "6e66d58ff7af054492d821d8826bc27ebc13d6f7607a3b3b0bde60a3a4396634"); my $hmac = pack ("H*", "216570973ba64960fd70e05dfa71b6617849de7d3869b46d1d9c84a257778061"); # # Start: # my $iiv = $iv . "\x00" x 16; while (my $word = <>) { chomp ($word); my $word_utf16le = encode ('UTF-16LE', $word); my $key = $iiv; for (my $i = 0; $i < 8192; $i++) { $key = sha256 ($key . $word_utf16le); } if (hmac ($enc_iv . $enc_key, $key, \&sha256, 64) eq $hmac) { print "password found: $word\n"; exit (0); } } exit (1);

as already explained in the code, the main algo is explained also in pyAesCrypt (https://github.com/marcobellaccini/pyAes...py#L59-L68)

It is "just" 8192 iterations of "salted" sha256 of the utf16 encoded password and a final hmac of that hash as a key and the encrypted IV and encrypted Key as the HMAC "message". pretty straight forward algo and wouldn't be impossible to support this in hashcat, I guess

You can always try to request it on https://github.com/hashcat/hashcat/issues/



just forgot: if you want to run this POC you could just use a command like this
Code:
perl aescrypt_hello_world.pl rockyou.txt

of course if you want to use different data (IV, enc_iv, enc_key, HMAC etc), you need to change the script accordingly... you can easily see which bytes I took from the hello_world.txt file and how the file format works (https://www.aescrypt.com/aes_file_format.html)
Reply
#6
update: we've now implemented this new algorithm: see https://github.com/hashcat/hashcat/issues/2267 and https://github.com/hashcat/hashcat/pull/2285

The hash format is also explained in the github pull request. The "hash" can be extracted with the aescrypt2hashcat.pl tool (currently supports version 2 of the aescrypt file format): https://raw.githubusercontent.com/hashca...hashcat.pl (this of course needs to be downloaded and run with perl, perl must be installed: perl aescrypt2hashcat.pl encrypted_file.txt.aes)

Could you please test @Complexoctopus with the latest beta version from https://hashcat.net/beta/ (only the beta version supports this new -m 22400 format at the time of this writing, of course) ? Thanks
Reply
#7
Hi

I am also intressted in this duplicati seems to use same algo.
Reply
#8
just run it and see if it works for you (betas of hashcat are over https://hashcat.net/beta/).

The extraction script can be found here: https://raw.githubusercontent.com/hashca...hashcat.pl ( you need to run it with perl - install perl first - and give it the encrypted file as parameter)
Reply
#9
(04-08-2020, 04:11 PM)philsmd Wrote: just run it and see if it works for you (betas of hashcat are over https://hashcat.net/beta/).

The extraction script can be found here: https://raw.githubusercontent.com/hashca...hashcat.pl ( you need to run it with perl - install perl first - and give it the encrypted file as parameter)

got the hash  now from
perl ../aescrypt2hashcat.pl ../duplicati-20200401T124445Z.dlist.zip.aes > ../hash.txt
: $aescrypt$1*ea8a4... but I run windows10 / cygwin the bin file do not start should I install ubuntu in wsl?
Reply
#10
There is a file called hashcat.exe in the beta version, as well. You do not need to use ubuntu.

Just use the exe files for windows. this should be a quite obvious thing to do and was also already mentioned a hundreds of time in the forum.
Reply