Created
November 20, 2012 18:14
-
-
Save MichaelMayorov/4119766 to your computer and use it in GitHub Desktop.
Simple TCP server which should emuale iteraction with jury server on challenges like RuCTF(I use it for testing flag posting script)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2 | |
# -*- coding: utf-8 -*- | |
# Copyright::MichaelMayorov([email protected]) | |
""" | |
I found example TCP server somewhere in Internet and quickly adapted it to | |
emulate jury flag receiving service on competitions like RuCTF(e) | |
I didn't test it too long. | |
""" | |
import socket, threading | |
import os | |
import sys | |
import signal | |
def handler(signum, frame): | |
print "Stopping, disconnecting clients..." | |
lock.acquire() | |
for client in clients: | |
client.socket.shutdown(socket.SHUT_RDWR) | |
client.socket.close() | |
print '%s:%s disconnected.' % client.address | |
# clients.remove(client) | |
lock.release() | |
sys.exit(0) | |
signal.signal(signal.SIGINT, handler) | |
HOST = '127.0.0.1' | |
PORT = 31337 | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
s.bind((HOST, PORT)) | |
s.listen(4) | |
clients = [] #list of clients connected | |
lock = threading.Lock() | |
class chatServer(threading.Thread): | |
def __init__(self, (socket,address)): | |
threading.Thread.__init__(self) | |
self.socket = socket | |
self.address= address | |
def run(self): | |
def disconect(self): | |
self.socket.close() | |
print '%s:%s disconnected.' % self.address | |
lock.acquire() | |
clients.remove(self) | |
lock.release() | |
return | |
lock.acquire() | |
clients.append(self) | |
lock.release() | |
print '%s:%s connected.' % self.address | |
self.socket.send("Enter team number:\n") | |
tn = self.socket.recv(3) | |
try: | |
tn = int(tn.strip()) | |
except: | |
self.socket.send("WRONG\n") | |
disconnect(self) | |
print "Team number:\n", tn | |
self.socket.send("Welcome, team %d\n" % tn) | |
while True: | |
try: | |
data = self.socket.recv(1024) | |
except socket.error: | |
break | |
print "Receiving flag", data | |
if int(os.urandom(5).encode('hex'),16) % 2: | |
print "Flag incorrect" | |
self.socket.send("TOO OLD: %s\n" % data) | |
continue | |
print "Flag correct" | |
self.socket.send("OK: %s\n" % data) | |
disconnect(self) | |
while True: # wait for socket to connect | |
# send socket to chatserver and start monitoring | |
t = chatServer(s.accept()) | |
t.daemon = True | |
t.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment