Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.57 KB | None | 0 0
  1. from hash import secureHash
  2. import SocketServer
  3. import string
  4. import random
  5. from text import *
  6. import os
  7. from hashlib import sha256
  8.  
  9. PORT = 2000
  10. ROUNDS = 10
  11. TIMEOUT = 120
  12. sigma = string.ascii_letters+string.digits+'!@#$%^&*()-_=+[{]}<>.,?;:'
  13.  
  14. def isPrintable(x):
  15.     global sigma
  16.  
  17.     alpha = set(sigma)
  18.     beta = set(x)
  19.  
  20.     return alpha.intersection(beta) == beta    
  21.  
  22. def get_random_string(l, s):
  23.     return ''.join([random.choice(s) for i in range(l)])
  24.  
  25. class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
  26.     def PoW(self):
  27.         s = os.urandom(10)
  28.         h = sha256(s).hexdigest()
  29.         self.request.sendall("Provide a hex string X such that sha256(X)[-6:] = {}\n".format(h[-6:]))
  30.         inp = self.request.recv(2048).strip().lower()
  31.         is_hex = 1
  32.         for c in inp:
  33.             if not c in '0123456789abcdef':
  34.                 is_hex = 0
  35.  
  36.         if is_hex and sha256(inp.decode('hex')).hexdigest()[-6:] == h[-6:]:
  37.             self.request.sendall('Good, you can continue!\n')
  38.             return True
  39.         else:
  40.             self.request.sendall('Oops, your string didn\'t respect the criterion.\n')
  41.             return False
  42.  
  43.     def challenge(self, n):
  44.         s = get_random_string(random.randint(30,35), sigma)
  45.         H = secureHash()
  46.         H.update(s)
  47.         h = H.hexdigest()
  48.        
  49.         self.request.sendall(chall_intro.format(n, s, h))
  50.         inp = self.request.recv(2048).strip()
  51.         H_inp = secureHash()
  52.         H_inp.update(inp)
  53.         h_inp = H_inp.hexdigest()
  54.  
  55.         if(inp == s or not isPrintable(inp)):
  56.             self.request.sendall(chall_wrong)
  57.             return False    
  58.        
  59.         if(h_inp != h):
  60.             self.request.sendall(chall_wrong)
  61.             return False    
  62.  
  63.         self.request.sendall(chall_ok)
  64.         return True
  65.  
  66.     def handle(self):
  67.         self.request.settimeout(TIMEOUT)
  68.         if not self.PoW():
  69.             return
  70.         self.request.sendall(intro.format(ROUNDS))
  71.  
  72.         for i in range(ROUNDS):
  73.             if(not self.challenge(i+1)):
  74.                 self.request.sendall(losing_outro)
  75.                 return    
  76.  
  77.         self.request.sendall(winning_outro.format(FLAG))
  78.  
  79.         def finish(self):
  80.             logger.info("%s client disconnected" % self.client_address[0])
  81.  
  82.  
  83. class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
  84.     pass
  85.  
  86. if __name__ == '__main__':
  87.     server = ThreadedTCPServer(('0.0.0.0', PORT), ThreadedTCPRequestHandler)
  88.     server.allow_reuse_address = True
  89.     server.serve_forever()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement