Библиотека для написания чекеров на 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
перед названием функций и не думайте об остальном.