Skip to content

Instantly share code, notes, and snippets.

@MichaelMayorov
Created November 20, 2012 18:14
Show Gist options
  • Save MichaelMayorov/4119766 to your computer and use it in GitHub Desktop.
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)
#!/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