diff --git a/tools/cryptoloop2hashcat.py b/tools/cryptoloop2hashcat.py new file mode 100644 index 000000000..79d8ad7fc --- /dev/null +++ b/tools/cryptoloop2hashcat.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Author: Gabriele 'matrix' Gristina +# Version: 1.0 +# Date: Fri May 7 01:02:56 CEST 2021 +# License: MIT + +import argparse +import os.path +import sys + +kern_type = -1 +hash_mode = -1 +hash_modes = [ 14511, 14512, 14513, 14521, 14522, 14523, 14531, 14532, 14533, 14541, 14542, 14543, 14551, 14552, 14553 ] + +def validate_source(parser, arg): + if not os.path.exists(arg): + parser.error("! Invalid source argument: does not exist") + else: + return open(arg, 'rb') + +def validate_keysize(parser, ks): + if ks == '128': + return 0 + elif ks == '192': + return 1 + elif ks == '256': + return 2 + else: + parser.error("! Invalid key size selected ...") + +def valid_hash_cipher(hash, cipher): + if hash != 'sha1' and hash != 'sha256' and hash != 'sha512' and hash != 'ripemd160' and hash != 'whirlpool': + print("! Invalid or not supported hash type") + exit(1) + + if cipher != 'aes' and cipher != 'serpent' and cipher != 'twofish': + print("! Invalid or not supported cipher") + exit(1) + + if hash == 'sha1': + if cipher == 'aes': + return 0 + elif cipher == 'serpent': + return 1 + else: + return 2 + elif hash == 'sha256': + if cipher == 'aes': + return 3 + elif args.cipher == 'serpent': + return 4 + else: + return 5 + elif hash == 'sha512': + if cipher == 'aes': + return 6 + elif cipher == 'serpent': + return 7 + else: + return 8 + elif hash == 'ripemd160': + if cipher == 'aes': + return 9 + elif cipher == 'serpent': + return 10 + else: + return 11 + else: # whirlpool + if cipher == 'aes': + return 12 + elif cipher == 'serpent': + return 13 + else: + return 14 + +parser = argparse.ArgumentParser(description='cryptoloop2hashcat extraction tool') + +parser.add_argument('--source', required=True, help='set cryptoloop disk/image from path', type=lambda src: validate_source(parser, src)) +parser.add_argument('--hash', required=True, help='set hash type. Supported: sha1, sha256, sha512, ripemd160 or whirlpool.') +parser.add_argument('--cipher', required=True, help='set cipher type. Supported: aes, serpent or twofish.') +parser.add_argument('--keysize', required=True, help='set key size. Supported: 128, 192 or 256.', type=lambda ks: validate_keysize(parser, ks)) + +args = parser.parse_args() + +kern_type = valid_hash_cipher(args.hash, args.cipher) +hash_mode = hash_modes[kern_type] +key_size = args.keysize + +f = args.source +f.seek(1536) + +if sys.version_info[0] == 3: + ct = f.read(16).hex() +else: + ct = f.read(16).encode('hex') + +f.close() + +print('Hashcat mode: ' + str(hash_mode)) +print('Hash: $cryptoapi$' + str(kern_type) + '$' + str(key_size) + '$03000000000000000000000000000000$00000000000000000000000000000000$' + ct)