コード例 #1
0
ファイル: zond.py プロジェクト: neux7z/ctf-attack-defense
    def to_service(self, round, team, service, flag, flag_id):
        team = json_util.loads(json.dumps(team))
        service = json_util.loads(json.dumps(service))

        self.db.flags.insert_one({
            'round': round,
            'team': team,
            'service': service,
            'flag': flag,
            'flag_id': flag_id,
            'stolen': False,
            'timestamp': time.time()
        })

        path = self.path_to_checkers + service['name'] + '/' + self.filename_checkers

        action = ''
        try:
            action = 'check'
            self.checker.check(team['host'], path)

            action = 'put'
            self.checker.put(team['host'], path, flag, flag_id)

            action = 'get'
            self.checker.get(team['host'], path, flag, flag_id)

            self.update_scoreboard(team, service, 101)

        except Exception as error:
            code, message = error.args
            print(error)
            Message.fail(team['name'] + ' ' + service['name'] + ' ' + action + ' => error (message: ' + str(message) + ')')
            self.update_scoreboard(team, service, code, message)
コード例 #2
0
ファイル: round.py プロジェクト: shipko/ctf-attack-defense
    def next(self):
        #TODO: косяк в status_service
        # Подводим итоги предыдущего раунда

        self.statistic.summary(self.round_count)
        # Очищаем предыдущие задачи
        self.checkerManager.clear()

        self.round_count += 1

        Message.success('Round: ' + str(self.round_count))

        for team in self.config.get_all_teams():
            for service in self.config.get_all_services():
                flag = self.generate_flags()
                flag_id = self.generate_flag_ids()

                print(team['name'] + ' ' + service['name'] + ' ' + flag)

                self.checkerManager.put(
                    team = team,
                    service = service,
                    flag = flag,
                    flag_id = flag_id,
                    round = self.round_count
                )

        self.checkerManager.run()
コード例 #3
0
ファイル: zond.py プロジェクト: neux7z/ctf-attack-defense
    def update_scoreboard(self, team, service, status_code, message=''):
        codes = {
            101: 'UP',
            102: 'CORRUPT',
            103: 'MUMBLE',
            104: 'DOWN'
        }

        # self.status_service[team['name'] + '_' + service['name']] = status_code

        if status_code not in codes:
            Message.fail('\t Invalid checker return code for ' + service['name'])
            status_code = 104

        self.db.scoreboard.update_one(
            {
                'team._id': team['_id'],
                'service._id': service['_id']
            },
            {
                "$set": {
                    "status": codes[status_code],
                    'message': message
                },
                '$inc': {
                    'up_round': 1 if status_code == 101 else 0
                }
            }
        )
コード例 #4
0
    def create_teams(self):
        Message.success('Generate teams')

        for e in self.config.teams:
            Message.info("\tInit team {" + e["name"] + "} (Network: " +
                         e["network"] + ")")
            self.db.teams.insert_one(e)
コード例 #5
0
ファイル: round.py プロジェクト: ctfight/ctf-attack-defense
    def to_service(self, team, service):
        flag = self.generate_flags()
        flag_id = self.generate_flag_ids()
        print (team['name'] + ' ' + service['name'] + ' ' + flag)
        #print (flag_id)
        self.db.flags.insert_one({
            'round': self.round_count,
            'team': team,
            'service': service,
            'flag': flag,
            'flag_id': flag_id,
            'stolen': False,
            'timestamp': time.time()
        })

        path = self.path_to_checkers + service['name'] + '/' + self.filename_checkers

        action = ''
        try:
            action = 'check'
            self.checker.check(team['host'], path)

            action = 'put'
            self.checker.put(team['host'], path, flag, flag_id)

            action = 'get'
            self.checker.get(team['host'], path, flag, flag_id)

            self.update_scoreboard(team, service, 101)

        except Exception as error:
            code, message = error.args

            Message.fail(team['name'] + ' ' + service['name'] + ' ' + action + ' => error (message: ' + str(message) + ')')
            self.update_scoreboard(team, service, code, message)
コード例 #6
0
    def nextPut(self):
        #TODO: косяк в status_service
        # Подводим итоги предыдущего раунда

        self.statistic.summary(self.round_count)
        # Очищаем предыдущие задачи
        self.checkerManager.clear()
        self.round_count += 1

        Message.success('Round: ' + str(self.round_count))

        for team in self.config.get_all_teams():
            for service in self.config.get_all_services():
                flag = self.generate_flags()
                flag_id = self.generate_flag_ids()

                Message.info(team['name'] + ' ' + service['name'] + ' ' + flag)

                self.checkerManager.put(team=team,
                                        service=service,
                                        flag=flag,
                                        flag_id=flag_id,
                                        round=self.round_count,
                                        action='put')
        self.checkerManager.run()
コード例 #7
0
    def start(self):
        Message.success(
            'Class is initialized. Starting...\nListening on port {}'.format(
                CHECKER['PORT']))
        try:
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socket.bind(('0.0.0.0', self.port))
            self.socket.listen(
                CHECKER['MAX_CONNECTIONS']
            )  # максимальное число соединений. учитывайте это при конфигурировании сервиса

            while True:
                self.conn, self.address = self.socket.accept()
                Message.info('connected:' + self.address[0])

                process = multiprocessing.Process(target=self.recv,
                                                  args=(self.conn,
                                                        self.address))
                process.daemon = True
                process.start()

        except KeyboardInterrupt:
            print('Module flags is shutdown')
            self.conn.close()
            exit(0)
コード例 #8
0
    def create_service(self):
        Message.success('Generate services')

        for e in self.config.services:
            Message.info("\tInit service {" + e["name"] + "}");

            self.db.services.insert_one(e)
            self.create_program(e['name'], e['program'])
コード例 #9
0
    def delete_old_data(self):
        Message.success('Removing old data ... ')

        self.db.teams.delete_many({})
        self.db.services.delete_many({})
        self.db.scoreboard.delete_many({})
        self.db.flags.delete_many({})
        self.db.stolen_flags.delete_many({})
コード例 #10
0
 def __init__(self, method='json'):
     Message.info('Get config from ' + method)
     if method == 'json':
         self.from_json()
     else:
         self.from_api()
     if not self.loaded:
         Message.fail("Couldn't get config...Exit")
         sys.exit(0)
コード例 #11
0
    def delete_old_data(self):
        Message.info('Removing old data ... ')
        self.db.teams.delete_many({})
        self.db.services.delete_many({})
        self.db.scoreboard.delete_many({})
        self.db.flags.delete_many({})
        self.db.stolen_flags.delete_many({})
        self.db.settings.delete_many({})

        Message.info('\tDone')
コード例 #12
0
ファイル: application.py プロジェクト: dominiclet/dom
def submitchat(data):
    """send message to the room"""
    # log message
    chat = data['chat']
    room = data['room']
    message = Message(chat, session['name'], session['channelname'],
                      session['created'])

    message_data = message.add()
    emit('post', message_data, room=room)
コード例 #13
0
ファイル: put.py プロジェクト: shipko/ctf-attack-defense
    def __init__(self, method='api'):
        Message.info('Get config from ' + method)
        if method == 'json':
            self.from_json()
        else:
            self.from_api()

        if not self.loaded:
            Message.fail("Couldn't get config...Exit")
            sys.exit(0)
コード例 #14
0
 def from_api(self):
     try:
         response = requests.get("http://%s:%s" % (API['HOST'], API['PORT'])).json()
         data = response['response']
         self.services = data["services"]
         self.teams = data["teams"]
         self.settings.update(data["settings"])
         self.loaded = True
     except Exception as e:
         print(e)
         Message.fail('Error with requests in response')
コード例 #15
0
    def __init__(self, db):
        self.db = db
        self.conn = None
        self.address = None

        try:
            self.life = CHECKER['LENGTH'] * CHECKER['ROUND_LENGTH']
            self.port = CHECKER['PORT']
        except KeyError:
            Message.fail('Error with parse in response')
            sys.exit(0)
コード例 #16
0
    def __init__(self, args):
        self.args = args

        Message.info('Get config from ' + self.args.type)

        if self.args.type == 'json':
            self.from_json()
        else:
            self.from_api()

        if not self.loaded:
            Message.fail("Couldn't get config...Exit")
            sys.exit(0)
コード例 #17
0
    def nextCheck(self):

        Message.success('Check availability of services... ')

        for team in self.config.get_all_teams():
            for service in self.config.get_all_services():

                self.checkerManager.put(team=team,
                                        service=service,
                                        flag=None,
                                        flag_id=None,
                                        round=self.round_count,
                                        action='check')
        self.checkerManager.run()
コード例 #18
0
    def generate_scoreboard(self):
        Message.success('Generate scoreboard')

        for team in self.db.teams.find({}):
            for service in self.db.services.find({}):
                self.db.scoreboard.insert_one({
                    'team': team,
                    'service': service,
                    'status': 'UP',
                    'message': '',
                    'up_round': 0,
                    'attack': 0,
                    'defense': 0
                })
コード例 #19
0
    def from_api(self):
        try:
            response = requests.get("http://10.16.255.196:5000").json()
            data = response['response']

            self.services = data["services"]
            self.teams = data["teams"]

            self.settings.update(data["settings"])

            self.loaded = True
        except Exception as e:
            print(e)
            Message.fail('Error with requests in response')
コード例 #20
0
ファイル: flags.py プロジェクト: ctfight/ctf-attack-defense
    def __init__(self, db, config):
        self.db = db
        self.conn = None
        self.address = None
        config = ConfigJson('tmp.config.json');
        try:
            lifetime = config.settings["flags"]["lifetime"]
            round_length = config.settings["round_length"]
        except KeyError:
            Message.fail('Error with parse in response')
            sys.exit(0)

        self.life = lifetime * round_length
        self.port = config.settings['flags']['port']
コード例 #21
0
    def generate_scoreboard(self):
        Message.success('Generate scoreboard')

        for team in self.db.teams.find({}):
            for service in self.db.services.find({}):
                self.db.scoreboard.insert_one({
                    'team': team,
                    'service': service,
                    'status': 'UP',
                    'message': '',
                    'up_round': 0,
                    'attack': 0,
                    'defense': 0
                })
コード例 #22
0
ファイル: put.py プロジェクト: shipko/ctf-attack-defense
    def from_api(self):
        try:
            response = requests.get("http://10.16.255.196:5000").json()
            data = response['response']

            self.services = data["services"]
            self.teams = data["teams"]

            self.settings.update(data["settings"])

            self.loaded = True
        except Exception as e:
            print(e)
            Message.fail('Error with requests in response')
コード例 #23
0
    def __init__(self, db):
        self.db = db
        self.config = ConfigGet(self.db)
        self.statistic = Statistic(self.db, self.config)
        self.status_service = {}

        if CHECKER['METHOD'] == 'queue':
            from classes.checker.queue import Queue
            self.checkerManager = Queue()
        else:
            self.checkerManager = Threads()

        Message.info('Get last round number')
        self.get_round_number()
        Message.info('\t Last round number - ' + str(self.round_count))
コード例 #24
0
ファイル: flags.py プロジェクト: NskCTF/nsk-home-ctf-2016
    def __init__(self, db):
        self.db = db
        self.conn = None
        self.address = None
        self.config = ConfigGet(self.db)

        try:
            lifetime = CHECKER['LENGTH']
            round_length = CHECKER['ROUND_LENGTH']
        except KeyError:
            Message.fail('Error with parse in response')
            sys.exit(0)

        self.life = lifetime * round_length
        self.port = 2605  #self.config.settings['flags']['port']
コード例 #25
0
ファイル: flags.py プロジェクト: neux7z/ctf-attack-defense
    def __init__(self, db):
        self.db = db
        self.conn = None
        self.address = None

        self.config = ConfigGet(self.db)

        try:
            lifetime, round_length = CHECKER['LENGTH'], CHECKER['ROUND_LENGTH']
        except KeyError:
            Message.fail('Error with parse in response')
            sys.exit(0)

        self.life = lifetime * round_length
        self.port = FLAGS['PORT']
コード例 #26
0
ファイル: flags.py プロジェクト: shipko/ctf-attack-defense
    def __init__(self, db):
        self.db = db
        self.conn = None
        self.address = None

        self.config = ConfigGet(self.db)

        try:
            lifetime, round_length = CHECKER["LENGTH"], CHECKER["ROUND_LENGTH"]
        except KeyError:
            Message.fail("Error with parse in response")
            sys.exit(0)

        self.life = lifetime * round_length
        self.port = 2605
コード例 #27
0
    def from_json(self):
        if not os.path.isfile(self.path_to_config_file):
            Message.fail('File not found: ' + self.path_to_config_file)
            return
        self.filename = self.path_to_config_file

        try:
            with open(self.filename) as data_file:
                data = json.load(data_file)
            self.settings = data['settings']
            self.teams = data['teams']
            self.services = get_checkers_src(data['services'])
            self.loaded = True
        except KeyError as e:
            Message.fail('Not found parameter ' + str(e) + ' in ' + self.path_to_config_file)
コード例 #28
0
	def __init__(self, filename):
		if not os.path.isfile(filename):
			self.loaded = False
			Message.fail('File not found: ' + filename)
			return
		self.filename = filename;
		try:
			with open(filename) as data_file:    
				data = json.load(data_file)
			self.settings = data['settings']
			self.teams = data['teams']
			self.services = data['services']
			self.loaded = True
		except Exception:
			Message.fail('Invalid format of file: ' + filename)
			self.loaded = False
コード例 #29
0
ファイル: put.py プロジェクト: shipko/ctf-attack-defense
    def from_json(self):
        if not os.path.isfile(self.path_to_config_file):
            Message.fail('File not found: ' + self.path_to_config_file)
            return

        self.filename = self.path_to_config_file

        try:
            with open(self.filename) as data_file:
                data = json.load(data_file)

            self.settings = data['settings']
            self.teams = data['teams']
            self.services = data['services']

            self.loaded = True
        except KeyError as e:
            Message.fail('Not found parameter ' + str(e) + ' in ' + self.path_to_config_file)
コード例 #30
0
    def start(self):
        Message.success('Class is initialized. Starting')
        try:
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socket.bind(('0.0.0.0', self.port))
            self.socket.listen(1)

            while True:
                self.conn, self.address = self.socket.accept()
                Message.info('connected:' + self.address[0])

                process = multiprocessing.Process(target=self.recv, args=(self.conn, self.address))
                process.daemon = True
                process.start()

        except KeyboardInterrupt:
            print('Module flags is shutdown')
            self.conn.close()
            exit(0)
コード例 #31
0
ファイル: flags.py プロジェクト: shipko/ctf-attack-defense
    def start(self):
        Message.success("Class is initialized. Starting")
        try:
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socket.bind(("0.0.0.0", self.port))
            self.socket.listen(1)

            while True:
                self.conn, self.address = self.socket.accept()
                Message.info("connected:" + self.address[0])

                process = multiprocessing.Process(target=self.recv, args=(self.conn, self.address))
                process.daemon = True
                process.start()

        except KeyboardInterrupt:
            print("Module flags is shutdown")
            self.conn.close()
            exit(0)
コード例 #32
0
ファイル: round.py プロジェクト: shipko/ctf-attack-defense
    def __init__(self, db):
        self.db = db
        self.config = ConfigGet(self.db)

        self.statistic = Statistic(self.db, self.config)

        self.status_service = {}

        # if CHECKER_METHOD == 'queue':
        from classes.checker.queue import Queue
        self.checkerManager = Queue()
        # else:
        #     self.checkerManager = Threads()


        Message.info('Get last round number')

        self.get_round_number()

        Message.info('\t Last round number - ' + str(self.round_count))
コード例 #33
0
    def __init__(self, db):
        self.db = db
        self.config = ConfigGet(self.db)

        self.statistic = Statistic(self.db, self.config)

        self.status_service = {}

        # if CHECKER_METHOD == 'queue':
        from classes.checker.queue import Queue
        self.checkerManager = Queue()
        # else:
        #     self.checkerManager = Threads()


        Message.info('Get last round number')

        self.get_round_number()

        Message.info('\t Last round number - ' + str(self.round_count))

        Message.success('All ready!')
        Message.info('Now use python3 main.py init --slave for starting slave client')
コード例 #34
0
    def from_api(self):
        try:
            # Определяем путь до API сервера (откуда мы получаем команды)
            api_url = self.args.url if self.args.url != '' else API_SERVER

            if api_url == '':
                Message.fail('API server url is not defined in config/main.py.')
                Message.fail('Use python3 main.py init --url=\'SOME_URL\' instead')
                sys.exit(0)

            response = requests.get(api_url).json()
            data = response['response']

            self.services = data["services"]
            self.teams = data["teams"]

            self.settings.update(data["settings"])

            self.loaded = True
        except Exception as e:
            print(e)
            Message.fail('Error with requests in response')
コード例 #35
0
 def create_settings(self):
     Message.success('Generate settings')
     self.db.settings.insert_one(self.config.settings)
コード例 #36
0
    def create_teams(self):
        Message.success('Generate teams')

        for e in self.config.teams:
            Message.info("Init team {" + e["name"] + "} (Network: " + e["network"] + ")");
            self.db.teams.insert_one(e)
コード例 #37
0
 def create_service(self):
     Message.success('Generate services')
     for e in self.config.services:
         Message.info("\tInit service {" + e["name"] + "}");
         self.db.services.insert_one(e)
         self.create_program(e['name'], e['program'])