Библиотека для написания чекеров на Attack-Defense для жюрейки Хакердома.
from adchecklib import BaseChecker, OK, Corrupt, Down
class MyChecker(BaseChecker):
def __init__(self):
super().__init__(vulns=[2, 1])
async def put(self, host, flag_id, flag, vuln):
raise OK
async def get(self, host, flag_id, flag, vuln):
self.logger.error("Expected %s, got nothing", flag)
raise Corrupt("Flag is wrong")
async def check(self, host):
raise Down
MyChecker().run()Вам понадобится Python 3.6, pip и setuptools.
pip install git+https://github.com/ugractf/ad-checklib#egg=adchecklibНужно корректно инициализировать родительский класс:
super().__init__()Опционально можно передать keyword-аргумент vulns (по умолчанию — [1]). При наличии нескольких мест для хранения флагов он задаёт отношение флагов в этих местах. Например, vulns=[1, 2, 3] кладёт половину флагов третьего типа, треть флагов второго типа и шестую часть флагов первого типа. Номера уязвимостей считаются, начиная с единицы.
Из всех следующих функций вы должны бросить исключение с результатом проверки:
OK— проверка завершена успешноCorrupt— сервис работает, но невозможно получить флагDown— сервис работает некорректно или не работает
В исключения Corrupt и Down можно передавать аргумент — сообщение, которое будет показано участнику в скорборде.
Используйте self.logger для логгирования ошибок. Например: self.logger.info('Service returned %s', data). Эта информация будет доступна в админке жюрейки.
В этой функции нужно положить флаг. Аргументы:
host— IP-адрес или хостнейм вулнбоксаflag_id— уникальный идентификатор флагаflag— значение флагаvuln— номер уязвимости (1, еслиvulnsне используется)
В будущем вам понадобится доставать флаг, используя лишь flag_id. Вы можете заменить этот идентификатор на другой (например, логин с паролем): для этого бросьте исключение SetFlagID(new_flag_id) вместо OK.
В этой функции нужно проверить флаг. Аргументы:
host— IP-адрес или хостнейм вулнбоксаflag_id— уникальный идентификатор флагаflag— значение флагаvuln— номер уязвимости (1, еслиvulnsне используется)
В качестве flag_id передаётся то же значение, что и в put, если вы бросили OK, или выведенное вами значение, если вы бросили SetFlagID.
Проверьте работоспособность функционала сервиса. Аргументы:
host— IP-адрес или хостнейм вулнбокса
Функции check, put и get асинхронные. Если вы не используете asyncio, то просто допишите async перед названием функций и не думайте об остальном.