-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathscorebot.py
119 lines (96 loc) · 3.29 KB
/
scorebot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import sys
import time, threading
import random, string
from flask import Flask
from flask import request
app = Flask(__name__)
#start-import-services
sys.path.insert(0, './services/')
import textfilestore
import tweetybird
#end-import-services
class Game:
def __init__(self, teams, services):
self.teams = teams
self.services = services
def getFlags(self):
for service_name, service in services.iteritems():
for team_name, team in teams.iteritems():
tmp_flag = service.getFlag(team.host, team_name)
if tmp_flag == service.flags[team.name]:
print '+1 for %s - %s' % (team_name, service_name)
team.updateDefScore()
def setFlags(self):
for service_name, service in services.iteritems():
for team_name, team in teams.iteritems():
service.setFlag(team.host, team_name)
def getFlagID(self, service_name, evil_team):
return self.services[service_name].args[evil_team].get('flag_id')
def submitFlags(self, team_name, service_name, flag):
teamx = self.teams[team_name]
dic_flags = self.services[service_name].flags
for user, user_flag in dic_flags.iteritems():
if flag == user_flag: #and user != teamx.name:
print '+2 for ' + team_name
teamx.updateAttScore()
self.services[service_name].flags[user] = ""
return "valid"
return "invalid"
class Team:
def __init__(self, name, host):
self.name = name
self.host = host
self.att_score = 0
self.def_score = 0
def updateAttScore(self):
self.att_score += 2
def updateDefScore(self):
self.def_score += 1
class Service:
def __init__(self, name, port, module):
self.name = name
self.port = port
self.module = module
self.flags = {}
self.args = {}
def getFlagID(self, team_name):
return (args[team_name]).get("flag_id", None)
def setFlag(self, host, team_name):
flag = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(20))
self.args[team_name] = self.module.set_flag(host, self.port, flag)
self.flags[team_name] = flag
def getFlag(self, host, team_name):
flag_id = self.args[team_name]["flag_id"]
token = self.args[team_name]["token"]
flag = self.module.get_flag(host, self.port, flag_id, token)
print 'retrieved flag %s' % (flag)
return flag
def routine():
game.setFlags()
game.getFlags()
threading.Timer(10, routine).start()
@app.route("/")
def hello():
res = ""
for team_name, team in teams.iteritems():
res += "Name: {0}</br>Def Pnt: {1}</br>Att Pnt: {2}</br></br>".format(team_name, team.def_score, team.att_score)
return res
@app.route('/submit/', methods=['POST'])
def submitFlag():
flag = request.form.get('flag', None)
team_name = request.form.get('team', None)
service_name = request.form.get('service', None)
status = game.submitFlags(team_name, service_name, flag)
return status
@app.route('/flagid', methods=['GET'])
def getFlagID():
username = request.args.get('enemy_name')
service_name = request.args.get('service')
flagid = game.getFlagID(service_name, username)
return str(flagid)
if __name__ == '__main__':
teams = {'fried': Team('fried', "192.168.56.102") }
services = {'tweety_bird': Service('tweety_bird', '20118', tweetybird), 'textfilestore': Service('textfilestore', '20093', textfilestore)}
game = Game(teams, services)
routine()
app.run()