Path: blob/master/Block-Cipher/Attack-CBC-Padding-Oracle/Challenges/Secret-Server/secretserver.py
1402 views
import os, base64, time, random, string1from Crypto.Cipher import AES2from Crypto.Hash import *34key = os.urandom(16)56def pad(msg):7pad_length = 16-len(msg)%168return msg+chr(pad_length)*pad_length910def unpad(msg):11return msg[:-ord(msg[-1])]1213def encrypt(iv,msg):14msg = pad(msg)15cipher = AES.new(key,AES.MODE_CBC,iv)16encrypted = cipher.encrypt(msg)17return encrypted1819def decrypt(iv,msg):20cipher = AES.new(key,AES.MODE_CBC,iv)21decrypted = cipher.decrypt(msg)22decrypted = unpad(decrypted)23return decrypted2425def send_msg(msg):26iv = '2jpmLoSsOlQrqyqE'27encrypted = encrypt(iv,msg)28msg = iv+encrypted29msg = base64.b64encode(msg)30print msg31return3233def recv_msg():34msg = raw_input()35try:36msg = base64.b64decode(msg)37assert len(msg)<50038decrypted = decrypt(msg[:16],msg[16:])39return decrypted40except:41print 'Error'42exit(0)4344def proof_of_work():45proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in xrange(20)])46digest = SHA256.new(proof).hexdigest()47print "SHA256(XXXX+%s) == %s" % (proof[4:],digest)48x = raw_input('Give me XXXX:')49if len(x)!=4 or SHA256.new(x+proof[4:]).hexdigest() != digest:50exit(0)51print "Done!"52return5354if __name__ == '__main__':55proof_of_work()56with open('flag.txt') as f:57flag = f.read().strip()58assert flag.startswith('hitcon{') and flag.endswith('}')59send_msg('Welcome!!')60while True:61try:62msg = recv_msg().strip()63if msg.startswith('exit-here'):64exit(0)65elif msg.startswith('get-flag'):66send_msg(flag)67elif msg.startswith('get-md5'):68send_msg(MD5.new(msg[7:]).digest())69elif msg.startswith('get-time'):70send_msg(str(time.time()))71elif msg.startswith('get-sha1'):72send_msg(SHA.new(msg[8:]).digest())73elif msg.startswith('get-sha256'):74send_msg(SHA256.new(msg[10:]).digest())75elif msg.startswith('get-hmac'):76send_msg(HMAC.new(msg[8:]).digest())77else:78send_msg('command not found')79except:80exit(0)818283