2021-05-06 23:39:30 +00:00
|
|
|
#!/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()
|
|
|
|
|
2021-05-08 00:06:05 +00:00
|
|
|
print('$cryptoapi$' + str(kern_type) + '$' + str(key_size) + '$03000000000000000000000000000000$00000000000000000000000000000000$' + ct)
|