AgatCTF-2019

Правила

Очень непросто формализовать набор правил, по которым проводится CTF, поэтому этот раздел может поменяться в любой момент до начала игры. Не забудьте перед игрой прочитать его еще раз, на всякий случай :)

Определения

Команда

Группа людей во главе с капитаном. Размер любой команды не должен превышать 5 человек.

Сервис

Уязвимое приложение, специально подготовленное командой разработчиков для игры.

Флаг

Строка, удовлетворяющая регулярному выражению: /^[A-Z0-9]{31}=$/. Время жизни флага ограничено, и устаревшие флаги не влияют на начисление очков.

Проверяющая система

Автоматическая система, которая заносит в сервисы флаги, проверяет работоспособность сервисов и начисляет очки. Начисленные очки наряду с состоянием сервисов отображаются в скорборде.

Игровой раунд

Промежуток времени, за который проверяющая система заносит в сервисы новые флаги, проверяет наличие старых флагов, и начисляет очки за защиту. Все раунды длятся равное количество времени.

Организаторы и жюри

Группа людей, ответственная за проведение игры. Организаторы и жюри делают все возможное для того, чтобы игра получилась качественной, честной, и доставила участникам удовольствие. Тем не менее, жюри может наказать или дисквалифицировать команду за нарушение правил, а также может принимать решения в критических ситуациях, не описанных в данных правилах. Команды должны быть готовы отнестись к таким решениям с пониманием. Также жюри определяет победителя. По большей части, это решение основывается на скорборде.

Командам разрешено

• Делать все, что заблагорассудится внутри своего сегмента сети. Скорее всего, команды захотят изменить конфигурацию своего сервера и закрыть уязвимости в своих сервисах

• Атаковать другие команды в пределах игровой сети. Неожиданно, да?

Командам запрещено

• Фильтровать трафик от других команд

• Генерировать неоправданно большое колличество сетевого трафика, представляющий угрозу стабильности систем организаторов или других команд

• Атаковать команды за пределами игровой сети

• Атаковать инфраструктурные системы организаторов

Ход игры

Игра начинается с выдачи участникам идентичных серверов с предустановленным набором уязвимых сервисов. В течение первого часа после выдачи игрового образа сегменты сети закрыты, и командам следует сконцентрироваться на администрировании своего игрового сервера и анализе уязвимостей. По истечение этого часа сеть открывается, и в течение 8 часов команды могут эксплуатировать уязвимости с целью получения флагов у других команд.

Начисление баллов

Ключевыми понятиями в начислении очков являются понятия SLA и FlagPoints. Эти величины индивидуальны для каждого сервиса каждой команды. В каждый момент времени очки команды вычисляются как сумма попарных произведений SLA сервиса на FlagPoints сервиса для всех сервисов.


SLA (team, service) — это доля от прошедшего игрового времени, в течение которой данный сервис у данной команды был в состоянии UP. Например, если сервис ни разу за прошедшее игровое время не опускался, SLA будет равен 1. Если прошло 4 часа игры, и сервис работал первый час, а потом опустился на 3 часа, SLA будет равен 0.25.


FlagPoints (team, service) — это неотрицательное число, которое коррелирует с тем, насколько хорошо команда понимает данный сервис. Если команда умеет эксплуатировать уязвимости в этом сервисе, и закрыла их у себя, ее FlagPoints будет расти. Если она не умеет эксплуатировать уязвимости в этом сервисе и не озаботилась их закрытием, ее FlagPoints будет стремительно приближаться к нулю в результате атак других команд. Если она закрыла уязвимости, но не научилась их эксплуатировать, ее FlagPoints не будет меняться. В начале игры значение FlagPoints всех сервисов у всех команд равно 0.


Стоимость флага — это количество FlagPoints, которое получает атакующая команда и, соответственно, теряет атакуемая за захваченный флаг, сданный атакующей командой в проверяющую систему. Это число зависит от мест в скорборде, занимаемых атакующей и атакуемой командами в прошлом раунде относительно момента сдачи флага. Очки за флаг засчитываются даже если соответствующий сервис атакующей команды не был в состоянии UP.


Время жизни флага — это количество времени, в течение которого флаг должен быть доступен в сервисе для запросов проверяющей системы. Для получения FlagPoints, команде нужно успеть захватывать и сдавать в проверяющую систему флаги до того как у них истекает время жизни.


Если флаг захватывается у команды, находившейся в скорборде выше атакующей в предыдущем раунде, то за него атакующей команде начисляется максимальное количество FlagPoints. Это число равно количеству играющих команд. В противном случае, начисляемое количество FlagPoints экспоненциально падает от максимального к 1. Атакуемая команда, соответственно, теряет то же самое количество FlagPoints, но их итоговое количество у нее никогда не опускается ниже нуля.

def on_game_start(team):

team.sla = [1] * number_of_services

team.flagpoints = [0] * number_of_services


def on_flag_post(attacker, flag):

victim = flag.owner

victim_pos = scoreboard[victim]

attacker_pos = scoreboard[attacker]

service = flag.service

max = number_of_teams


flag_score = attacker_pos > victim_pos ? max : exp(log(max) * (max - victim_pos) / (max - attacker_pos))


attacker.flagpoints[service] += flag_score

victim.flagpoints[service] -= min(victim.flagpoints[service], flag_score)


def get_score(team):

return sum(map(lambda x: x[0] * x[1], zip(team.sla, team.flagpoints)))


Помимо текущих результатов, скорборд отображает SLA, FlagPoints и статус каждого сервиса у каждой команды. Статусы бывают такими:

• UP означает, что сервис доступен по сети, отвечает на запросы и ведет себя так, как того ожидает проверяющая система;

• CORRUPT означает, что сервис доступен по сети, но не может отдать один из предыдущих флагов;

• MUMBLE означает, что сервис доступен по сети, но ведет себя не так, как того ожидает проверяющая система. Например, если HTTP сервер не отвечает на запросы;

• DOWN означает, что сервис недоступен по сети.

Скорборд

Во время игры скорборд — таблица результатов — будет доступна по адресу http://10.10.10.10/

Украденные флаги можно отправлять построчно на 10.10.10.10, TCP порт 31337 или в виде JSON-массива на HTTP-хэндлер http://10.10.10.10/flags, указав командный аутентификационный токен в заголовке X-Team-Token

Команды сортируются по суммарным очкам — выше находится команда, набравшая больше очков.

© 2019 ОАО "АГАТ-системы управления"- управляющая компания холдинга «Геоинформационные системы управления». Все права защищены.