Files
ctf/basically gambling/challenge_server.py
2018-07-08 19:06:10 -04:00

63 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python
import threading, time, socket, sys, random
import SocketServer
from base64 import b64encode
flag = "MNZ{64IsTheBestBase==}"
notTheFlag = "Better luck next time!"
CHUNKS = 20
CHANCE = 0.15
PORT = 6646
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def setup(self):
print("Connected TO {}".format(self.client_address))
try:
fh = open("/dev/urandom","rb")
chunk = random.randint(1, CHUNKS)
for i in range(0, CHUNKS):
output = b64encode(fh.read(22))
self.request.sendall("{}\n".format(output))
if i == chunk:
rand = random.random()
output = flag if rand < CHANCE else notTheFlag
print output
output = b64encode(output)
self.request.sendall("{}\n".format(output))
time.sleep(0.1)
except socket.error as e:
print "Socket error {} - {}".format(e.errno, self.client_address)
finally:
fh.close()
def handle(self):
pass
def finish(self):
print "Closed connection to {}".format(self.client_address)
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
HOST = "0.0.0.0"
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
# Start a thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
# Exit the server thread when the main thread terminates
server_thread.daemon = True
server_thread.start()
print "Server loop running in thread:", server_thread.name
#server.shutdown()
#server.server_close()
while ( True ):
server.handle_request()
try:
server.get_request()
except KeyboardInterrupt:
print "Server Stopping"
server.shutdown()
server.server_close()
break