API - nsychev/DestructiveFarm GitHub Wiki
DestructiveFarm имеет два вида API. Flag API предназначено для клиентов фермы, Client API — для игроков команды (используется фронтендом)
Авторизация
Flag API
В конфигурационном файле сервера есть две настройки авторизации:
ENABLE_FLAG_API_AUTH
— включает или выключает авторизацию для Flag APIFLAG_API_TOKEN
— токен Flag API
Если настройка ENABLE_FLAG_API_AUTH
установлена в True
, то с каждым запросом к Flag API необходимо передавать заголовок X-Token
, равный FLAG_API_TOKEN
. В случае его отсутствия будет возвращена ошибка 403.
Client API
В конфигурационном файле сервера есть параметр CLIENT_API_TOKEN
. Его необходимо передавать в заголовке X-Token
в каждом запросе. В случае его отсутствия будет возвращена ошибка 403.
Совершение запросов
Все запросы должны быть осуществлены по адресу http[s]://FARM-HOST:PORT/api/TYPE/METHOD_NAME
.
Для Flag API значение TYPE
равно flag
, для Client API — client
.
Для GET-запросов используйте передачу параметров в параметрах URL, для POST-запросов передавайте аргументы в формате application/json
.
Результат возвращается в формате application/json
.
Объекты Flag API
FlagSubmit
flag
—string
— текст флага, должен удовлетворять регулярному выражениюFLAG_FORMAT
ip
—string
— IP-адрес команды
Методы Flag API
config (GET)
Получает настройки фермы.
Аргументы отсутствуют.
Возвращает объект настроек фермы, эквивалентный содержимому файла server/config.py
, но без API-токенов.
flags (POST)
Загружает флаги на сервер.
Аргументы:
flags
—FlagSubmit[]
, обязательный — список найденных флаговsploit
—string
, обязательный — название сплойта, должно начинаться с названия сервиса и символа нижнего подчеркивания (_
)
Возвращает объект {"success": true}
в случае успеха.
Объекты Client API
Team
name
—string
— название командыip
—string
— IP-адрес команды
FlagStatus
Строка, принимающая одно из значений
ACCEPTED
— принятREJECTED
— отклоненSKIPPED
— пропущенQUEUED
— в очереди
Flag
flag
—string
— содержимое флагаcreated
—timestamp
(akauint64_t
) — время приема флагаstatus
—FlagStatus
— статус сдачи флагаteam
—Team
||string
— команда или строкаmanual
, если флаг сдан вручнуюservice
—string
— название сервиса или строкаmanual
, если флаг сдан вручнуюsploit
—string
— название сплойта или строкаmanual
, если флаг сдан вручнуюresponse
—string
— ответ проверяющей системы
Методы Client API
check_token (GET)
Проверяет статус авторизации.
Аргументы отсутствуют.
Возвращает объект {"success": true}
в случае успеха.
services (GET)
Получает список сервисов.
Аргументы отсутствуют.
Возвращает объект:
services
—string[]
— список названий сервисов
services (POST)
Регистрирует новый сервис.
Аргументы:
name
—string
, обязательный — имя сервиса
Возвращает объект {"success": true}
в случае успеха.
teams (GET)
Получает список команд.
Аргументы отсутствуют.
Возвращает объект:
teams
—Team[]
— список объектов команд
manual_flags (GET)
Получает флаги, отправленные вручную, в порядке убывания времени получения.
Аргументы отсутствуют.
Возвращает:
flags
—Flag[]
— объекты запрашиваемых флагов
manual_flags (POST)
Добавляет ручной флаг.
Аргументы:
text
—string
, обязательный — текст, содержащий флаги, удовлетворяющие регулярному выражениюFLAG_FORMAT
Возвращает:
success
—bool
—true
, если есть хотя бы один новый флаг,false
, если их нетflags
—string[]
— все новые найденные флаги
stats (GET)
Получает статистику по флагам.
Аргументы:
limit
—uint64_t
, по умолчанию +∞ — число последних раундов, за которые запрашивается статистика
Возвращает:
rounds
—uint64_t
— общее число раундовstats
— массив объектов типаRoundStats
RoundStats
— словарь с ключами – именами сплойтов и значениями – объектами типаSploitStats
SploitStats
— словарь с ключами – IP-адресами команд и значениями – объектами типаTeamStats
TeamStats
— словарь с ключамиFlagStatus
и значениями – числом флагов
Пример:
{
"rounds": 1,
"stats": [
"nodbrary_rce.py": {
"6.6.1.2": {"accepted": 2, "skipped": 0, "rejected": 1, "queued": 0},
"6.6.2.2": {"accepted": 3, "skipped": 0, "rejected": 0, "queued": 1}
},
"cdo_sqlinj.php": {
"6.6.1.2": {"accepted": 1, "skipped": 0, "rejected": 0, "queued": 0},
"6.6.2.2": {"accepted": 0, "skipped": 0, "rejected": 2, "queued": 0}
}
]
}
subscribe (WebSocket)
Подписаться на обновления статистики.
Важно! Так как протокол Websocket не поддерживает HTTP-заголовки (пруф), используется другой механизм авторизации.
Для авторизации необходимо отправить серверу объект {"token": CLIENT_API_TOKEN}
. До этого момента обновления приходить не будут.
Если токен некорректен или не будет передан в течение 20 секунд, сервер вернет {"error": "invalid token"}
и закроет соединение.
Если передан корректный токен, сервер ответит {"success": true}
, а затем каждый раунд будет возвращать статистику — один объект типа RoundStats
.