Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # uncompyle6 version 3.2.5
- # Python bytecode 2.7 (62211)
- # Decompiled from: Python 3.6.7 (default, Oct 22 2018, 11:32:17)
- # [GCC 8.2.0]
- # Embedded file name: source/keepass.py
- # Compiled at: 2019-02-02 20:55:37
- import sys, os, time
- os.system('./masterkeyauth_01_keygenass >/dev/null')
- NSA_MODE = False
- ALARM_SEC = 5
- import signal
- def alarm_handler(signum, frame):
- print 'Timed out'
- fd = os.open('/tmp/key', os.O_WRONLY)
- os.write(fd, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
- os.close(fd)
- os._exit(0)
- signal.signal(signal.SIGALRM, alarm_handler)
- signal.alarm(ALARM_SEC)
- unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
- sys.stdout = unbuffered
- import tinydb, tinyrecord
- PASSWORDS_DB = tinydb.TinyDB('./passwords.kdbx')
- fd = os.open('/tmp/key', os.O_RDONLY)
- if fd < 0:
- print "Can't get NSA master key"
- exit()
- MASTER_KEY = os.read(fd, 16)
- os.close(fd)
- if len(MASTER_KEY) != 16:
- print 'Bad NSA master key'
- exit()
- with tinyrecord.transaction(PASSWORDS_DB) as (tr):
- tr.remove(tinydb.where('expire') < time.time())
- while True:
- print '\n __ __ _______ \n| |/ |.-----.-----.-----.| _ |.-----.-----.\n| < | -__| -__| _ || ||__ --|__ --|\n|__|\\__||_____|_____| __||___|___||_____|_____|\n |__| '
- print '[L] Login'
- print '[R] Register'
- print '[W] Who is registered'
- print '[Q] Quit'
- signal.alarm(ALARM_SEC)
- choice = raw_input().strip().upper()
- if choice == 'L':
- try:
- sys.stdout.write('Username: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- username = raw_input().strip()
- if len(username) < 3 or len(username) > 30:
- raise Exception('Length should be >= 3 and <= 30')
- sys.stdout.write('Password: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- password = raw_input().strip()
- if not NSA_MODE and not PASSWORDS_DB.search((tinydb.where('type') == 'user') & (tinydb.where('username') == username) & (tinydb.where('password') == password)):
- raise Exception('Bad username or password')
- print '%s logged in' % username
- while True:
- print
- print "=== %s's credential database ===" % username
- print '[S] Show credentials'
- print '[A] Add credentials'
- print '[P] Log in to website'
- print '[Q] Log out'
- signal.alarm(ALARM_SEC)
- choice = raw_input().strip().upper()
- if choice == 'S':
- print 'Credentials:'
- emptyList = True
- for i, u in enumerate(PASSWORDS_DB.search((tinydb.where('type') == 'cred') & (tinydb.where('owner') == username))):
- emptyList = False
- print '%d) Website: %s\tLogin: %s' % (i + 1, u['website'], u['login'])
- if emptyList:
- print '(empty list)'
- elif choice == 'A':
- sys.stdout.write('Website: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- website = raw_input().strip()
- sys.stdout.write('Login: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- login = raw_input().strip()
- sys.stdout.write('Password: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- password = raw_input().strip()
- with tinyrecord.transaction(PASSWORDS_DB) as (tr):
- tr.insert({'expire': time.time() + 5400, 'type': 'cred', 'owner': username, 'website': website, 'login': login, 'password': password})
- print '%s@%s added' % (login, website)
- elif choice == 'P':
- sys.stdout.write('Website: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- website = raw_input().strip()
- emptyList = True
- for i, u in enumerate(PASSWORDS_DB.search((tinydb.where('type') == 'cred') & (tinydb.where('owner') == username) & (tinydb.where('website') == website))):
- emptyList = False
- print '%d) Website: %s\tLogin: %s\tPassword: %s' % (i + 1, u['website'], u['login'], u['password'])
- if emptyList:
- print '(no credentials for %s)' % website
- elif choice == 'Q' or choice == '':
- break
- except Exception as e:
- print e
- elif choice == 'R':
- try:
- sys.stdout.write('Username: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- username = raw_input().strip()
- if len(username) < 3 or len(username) > 30:
- raise Exception('Length should be >= 3 and <= 30')
- sys.stdout.write('Password: ')
- sys.stdout.flush()
- signal.alarm(ALARM_SEC)
- password = raw_input().strip()
- for u in PASSWORDS_DB.search(tinydb.where('type') == 'user'):
- if u['username'] == username:
- raise Exception('User already exists: %s' % username)
- with tinyrecord.transaction(PASSWORDS_DB) as (tr):
- tr.insert({'expire': time.time() + 5400, 'type': 'user', 'username': username, 'password': password})
- print '%s registered' % username
- except Exception as e:
- print e
- elif choice == 'W':
- print 'They are registered:'
- emptyList = True
- for i, u in enumerate(PASSWORDS_DB.search(tinydb.where('type') == 'user')):
- emptyList = False
- print '%d) %s' % (i + 1, u['username'])
- if emptyList:
- print '(empty list)'
- elif choice == 'NSA':
- try:
- print 'Sup. Provide knowledge of all AES keys in the world'
- chall = os.urandom(16)
- print chall.encode('hex')
- signal.alarm(ALARM_SEC)
- resp = raw_input().strip().decode('hex')
- import Crypto.Cipher.AES
- if resp == Crypto.Cipher.AES.new(MASTER_KEY).encrypt(chall):
- NSA_MODE = True
- print 'Hello.'
- else:
- raise Exception
- except:
- print 'Impostor.'
- os._exit(0)
- elif choice == 'Q' or choice == '':
- break
- print 'o/ Bye!'
- # okay decompiling keepass.pyc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement