35 lines
1.6 KiB
Python
35 lines
1.6 KiB
Python
import os
|
|
import argparse
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description='Match credentials in a leaked username:hash formatted'
|
|
' file with cracked passwords in a potfile')
|
|
parser.add_argument('-a', '--accounts', type=str, required=True,
|
|
help='leaked accounts file with one "username:hash" per line')
|
|
parser.add_argument('-p', '--potfile', type=str, required=True,
|
|
help='hashcat potfile')
|
|
parser.add_argument('-d', '--delimiter', type=str, default=':',
|
|
help='character or string that seperates usernames from passwords')
|
|
args = parser.parse_args()
|
|
if not os.path.exists(args.accounts):
|
|
parser.error('{} file does not exist'.format(args.accounts))
|
|
if not os.path.exists(args.potfile):
|
|
parser.error('{} file does not exist'.format(args.potfile))
|
|
return args
|
|
|
|
if __name__ == '__main__':
|
|
|
|
args = parse_args()
|
|
with open(args.accounts, 'r') as f:
|
|
hash_to_username = { hsh: username for username, hsh in \
|
|
[l.split(args.delimiter) for l in f.read().split('\n') \
|
|
if len(l.split(args.delimiter)) > 1] }
|
|
# print(hash_to_username)
|
|
with open(args.potfile, 'r') as f:
|
|
hash_to_pw = { hsh: pw for hsh, pw in [l.split(':') for l in f.read().split('\n') \
|
|
if len(l.split(':')) > 1]}
|
|
|
|
for hsh, username in hash_to_username.items():
|
|
if hsh in hash_to_pw:
|
|
print('{}:{}'.format(username, hash_to_pw[hsh]))
|