]> git.somenet.org - ctf/pub/submit_bot.git/blob - flagbot.py
modified: index.php
[ctf/pub/submit_bot.git] / flagbot.py
1 #!/usr/bin/env python
2 #
3 # Copyright 2015 by Jan Vales <jan@jvales.net> (Someone <someone@somenet.org>)
4 # send me your changes. credit author(s). do not publish. share alike.
5 # to be done: find a suitable licence text.
6 #
7
8 import psycopg2
9 import psycopg2.extras
10 import sys
11 import time
12 import signal
13 import socket
14 import threading
15
16 import ictf
17
18 team = None
19 dbconnstring = "host=127.0.0.1 port=5432 dbname=flagbot user=flagbot password=flagbotpw"
20
21 def login(force = False):
22     global team
23     if force == True or team is None:
24         team = ictf.iCTF().login('georg@iseclab.org','8u6kNdUcsxE6sEkT')
25         print("login(): logged in.")
26
27 def getTargets():
28     print("getTargets() starting...")
29     login(True)
30     global team
31
32     service_list = team.get_service_list()
33     service_names = [s['service_name'].encode("ascii") for s in service_list]
34     import pprint
35     pprint.pprint(service_names)
36     try:
37         for service in service_names:
38             try:
39 #                print("getTargets() getting for:"+service)
40                 targets = team.get_targets(service)
41                 for target in targets['targets']:
42                     try:
43                         dbconn = psycopg2.connect(dbconnstring)
44                         cur = dbconn.cursor()
45                         cur.execute("INSERT INTO flag_ids (service, team, host, port, flag_id) VALUES (%s, %s, %s, %s, %s)", 
46                                     (service, target['team_name'], target['ip_address'], target['port'], target['flag_id']))
47                         dbconn.commit()
48                     except psycopg2.DatabaseError as e:
49                             pass
50 #                           print 'getTargets()Error %s' % e
51 #                           print "getTargets() Unexpected error:", sys.exc_info()[0]
52                     try:
53                         dbconn.close()
54                     except psycopg2.DatabaseError as e:
55                         print 'getTargets()Error %s' % e
56                     dbconn = None
57
58             except Exception as e:
59                 print 'getTargets()Error %s' % e
60                 print "getTargets() Unexpected error:", sys.exc_info()[0]
61
62     except Exception as e:
63         print 'getTargets() Error %s' % e
64         print "Unexpected error:", sys.exc_info()[0]
65
66
67     time.sleep(5.0)
68     gettargetth = threading.Timer(0.5, getTargets)
69     gettargetth.start()
70     print("getTargets(): ended")
71
72 def submitFlags():
73     print("submitFlag(): starting...")
74     login()
75     global team
76
77     try:
78         dbconn = psycopg2.connect(dbconnstring)
79         cur = dbconn.cursor(cursor_factory=psycopg2.extras.DictCursor)
80         cur.execute("SELECT * from flags where status = 0 or status = 3 order by random() limit 50")
81         print "submitFlag() submitting " + str(cur.rowcount) + " flags"
82         for row in cur.fetchall():
83             try:
84                 result = team.submit_flag([row['flag']])
85
86                 if "correct" in result:
87                     cur.execute("UPDATE flags SET submitted = date_trunc('second', NOW()), "
88                                 "status = %s, srvresponse = %s WHERE fid = %s",
89                                 (1, result, row['fid']))
90
91                 elif "already" in result:
92                     cur.execute("UPDATE flags SET submitted = date_trunc('second', NOW()), "
93                                 "status = %s, srvresponse = %s WHERE fid = %s",
94                                 (2, result, row['fid']))
95
96                 elif "notactive" in result:
97                     cur.execute("UPDATE flags SET submitted = date_trunc('second', NOW()), "
98                                 "status = %s, srvresponse = %s WHERE fid = %s",
99                                 (2, result, row['fid']))
100
101                 elif "incorrect" in result:
102                     cur.execute("UPDATE flags SET submitted = date_trunc('second', NOW()), "
103                                 "status = %s, srvresponse = %s WHERE fid = %s",
104                                 (2, result, row['fid']))
105
106                 else:
107                     import pprint
108                     pprint.pprint(result)
109                     cur.execute("UPDATE flags SET submitted = date_trunc('second', NOW()), "
110                                 "status = %s, srvresponse = %s WHERE fid = %s",
111                                 (3, result, row['fid']))
112
113                 dbconn.commit()
114             except psycopg2.DatabaseError as e:
115                 print 'Error %s' % e
116
117     except Exception as e:
118         print 'Error %s' % e
119         print "Unexpected error:", sys.exc_info()[0]
120
121     try:
122         dbconn.close()
123     except psycopg2.DatabaseError as e:
124         print 'Error %s' % e
125     dbconn = None
126
127     time.sleep(5.0)
128     submitth = threading.Timer(0.5, submitFlags)
129     submitth.setDaemon(True)
130     submitth.start()
131     print("submitFlag(): ended")
132
133 def main():
134     print "*** starting ..."
135     dbconn = psycopg2.connect("host=127.0.0.1 port=5432 dbname=flagbot user=flagbot password=flagbotpw")
136     cur = dbconn.cursor()
137     cur.execute("CREATE TABLE IF NOT EXISTS flag_ids ("
138         "service character varying(64) NOT NULL,"
139         "team character varying(64) NOT NULL,"
140         "host character varying(10) NOT NULL,"
141         "port character varying(10) NOT NULL,"
142         "flag_id character varying(128) NOT NULL,"
143         "received timestamp without time zone NOT NULL DEFAULT date_trunc('second'::text, now()),"
144         "handed_out timestamp without time zone,"
145         "status integer NOT NULL DEFAULT 0,"
146         "CONSTRAINT flag_ids_pkey PRIMARY KEY (service, flag_id)"
147         ")")
148     cur.execute("CREATE TABLE IF NOT EXISTS flags ("
149         "fid serial NOT NULL,"
150         "flag character varying(32) NOT NULL,"
151         "service character varying(32),"
152         "flag_id character varying(128),"
153         "submitter character varying(32),"
154         "received timestamp without time zone NOT NULL DEFAULT date_trunc('second'::text, now()),"
155         "submitted timestamp without time zone,"
156         "status integer NOT NULL DEFAULT 0, "
157         "srvresponse character varying(128),"
158         "CONSTRAINT flags_pkey PRIMARY KEY (fid),"
159         "CONSTRAINT flags_flag_key UNIQUE (flag)"
160         ")")
161     dbconn.commit()
162     cur.close()
163     cur = None
164     dbconn = None
165     print "Connected to DB + tables created"
166
167     # start one other thread
168     submitth = threading.Timer(1.0, submitFlags)
169     submitth.setDaemon(True)
170     submitth.start()
171
172     getTargets()
173
174 if __name__ == "__main__":
175     def signal_handler(signal, frame):
176         print 'SIG received. exitting!'
177         sys.exit(0)
178     signal.signal(signal.SIGINT, signal_handler)
179     main()
180