- PVSM.RU - https://www.pvsm.ru -
[1]23 и 24 мая 2013 года в рамках ежегодного международного форума по практической информационной безопасности Positive Hack Days III [2] прошло одно из крупнейших соревнований по принципу Capture the Flag — PHDays III CTF. В этом году на организацию соревнования было потрачено очень много сил, и результат не оставил равнодушным ни одного из участников. По прошествии этого события мы решили рассказать о том, как проходила подготовка соревнования и представить взгляд из-за кулис.
CTF — это соревнование по обеспечению ИБ в формате, схожем с командной игрой. Каждой команде предоставляется своя сетевая инфраструктура с предустановленными уязвимыми сервисами. Команды должны изучать сервисы, искать в них уязвимости и, используя их, атаковать сервисы своих соперников. В то же время им необходимо поддерживать собственные сервисы в работоспособном состоянии и исправлять в них ошибки, чтобы защититься от атак соперников.
При совершении успешной атаки на вражеский сервис команда получает некоторые секретные данные, называемые «флагом». Флаг является доказательством успешной атаки. Также, помимо сервисов, командам дается набор заранее подготовленных заданий, которые могут принести дополнительные флаги.
Имея большой опыт участия и организации CTF-соревнований, мы понимали, что главное для соревнования — это задания. Однако, без хорошей «обертки» — легенды, игрового мира, увлекательных правил и визуальных составляющих, обеспечивающих погружение как игроков, так и зрителей, —соревнование было бы немногим интереснее олимпиады по математике.
Первым делом было решено проработать легенду и правила, а потом использовать их как отправную точку для создания самих заданий. В попытках связать между собой свежеиспеченные игровые составляющие, мы решили побольше узнать о процессе создания игр.
После разработки концепции легенды, пришел через игровой механики. Прежде всего мы определились с форматом соревнования: это должен был быть смешанный CTF с обычными тасками (Jeopardy CTF), сервисами (классический CTF) и нововведением — заданиями с ограниченным временем на решение и постоянно растущей ценой очков, которые мы назвали «босс-тасками». Данный формат, как нам кажется, позволяет широко оценить навыки участников и вносит в игру динамичность.
Далее нужно было понять, что игроки могут делать с заданиями и что за это получать. Всплыли такие термины, как сущности игры, активности и вовлечения игроков. Нарисовав на доске сущности и определив действия над ними, мы наконец-то смогли зафиксировать правила. Осталось только определиться с балансом игры — распределением очков за задания и внутренние игровые ресурсы игроков.
Мы начали с расстановки приоритетов при решении различных типов заданий — сервисов и тасков. Нам нужно было решить, кто является для нас победителем — команда, решившая все таски, или команда, которая полностью проанализировала все сервисы, написала к ним эксплойты и исправила уязвимости в своих сервисах. Также нам нужно было сравнить между собой любые частичные решения заданий или сервисов. Ранжирование позволило создать сбалансированную систему оценок заданий, которая в свою очередь предоставила командам свободу в выборе тактики при решении всего CTF.
Важным моментом при разработке CTF стал тот факт, что форум Positive Hack Days, в рамках которого должно было состояться соревнование, вовсе не ограничивается битвой хакеров, а значит у нас есть большая аудитория людей, которые могут заинтересоваться происходящим на игре, не говоря уже о болельщиках команд.
Чтобы не оставить никого в стороне, была необходима система, наглядно отражающая ход игры, да еще и так, чтобы ощущалось погружение в придуманный нами мир. Фактически эта система должна визуализировать зрителю игровые события почти в реальном времени. А поскольку речь идет об игре, то и выглядеть система должна как игра: красочные картины мира, стильные герои, красивые спецэффекты и неодинаковые (насколько это возможно) события. Всех нас посетила одна муза: хотим, чтобы игра выглядела как Heroes of Might and Magic, затронувшая не одно поколение. И было бы идеально, если бы мы смогли запустить ее на различных мобильных платформах!..
Помимо легенды, за первые недели мозговых штурмов, появились оригинальные игровые механики и правила игры, добавляющие в процесс решения заданий немного стратегии. Мы постарались разработать механики таким образом, чтобы у игроков всегда был выбор из нескольких стратегий ведения игры, каждая из которых могла привести их к победе.
В набор игры входит:
Цель игры: набрать как можно больше золота. Побеждает самая «состоятельная» команда.
Схематичное отображение игровых механик (вариант 1)
Сущности игры:
Виды ресурсов (в порядке увеличения стоимости):
Действия над ресурсами:
1. Сервис — уязвимое приложение с обновляющимся один раз за раунд флагом, которое принадлежит одной из команд.
Действия над командными сервисами:
Количество очков, которое получают команды за сервисы, рассчитывается по следующим формулам:
2. Общий сервис — это уязвимое приложение, с обновляющимся один раз за раунд флагом, которое не принадлежит ни одной из команд.
Действия над общими сервисами:
3. Таск — это заранее подготовленное задание с одним флагом, требующее определенных навыков для его решения.
Действия над тасками:
4. Босс — это заранее подготовленное задание с одним флагом, с ограниченным временем жизни (3 часа), переменным вознаграждением и требующее определенных навыков для его решения.
Каждый раунд со всех команд собирается некоторое количество золота (налог), которое кладется в копилку боссу.
Действия над боссами:
5. Скилл (навык) — вид игровых очков, которые показывают:
Виды скиллов:
Действия над скиллами:
6. Ачивка (награда) — награда, выдающаяся команде за выполнение определенных требований. Всего в игре можно получить 42 вида наград.
-3.png)
Схематичное отображение игровых механик (вариант 2)
Когда правила игры были готовы и все уже примерно представляли, каким образом будет проходить соревнование и что для него нужно с технической точки зрения, началось проектирование сетевой инфраструктуры.
По всем канонам жанра, проектирование началось с задания требований, основанных на правилах, игровых механиках и здравом смысле, и только после этого можно было приступать непосредственно к проектированию сети.
У каждой команды должна быть своя подсеть, причем запросы из одной подсети в другую должны скрываться за NAT, для того чтобы игроки не могли отличить атаки соперников от запросов жюрейской системы на основании IP-адреса.
Помимо командных подсетей должен быть отдельный сегмент для размещения интерактивных тасков и общих сервисов. Причем необходимо, чтобы сервис мог получить информацию о подсети, из которой был отправлен запрос, чтобы идентифицировать команду.
По умолчанию доступ игроков ко всем заданиям должен быть ограничен, но сразу после покупки командой определенного таска, всей подсети должен открывается к нему доступ.
В игровой инфраструктуре также должен присутствовать сегмент, принадлежащий жюри. В нем расположена жюрейская система, веб-сервер с пользовательским интерфейсом, серверная часть визуализатора, а также компьютеры, с которых происходит настройка и мониторинг всего игрового процесса. Из этой подсети должен быть открыт доступ ко всем таскам, сервисам и командам. И, конечно, для всех подсетей должен быть свободный доступ в Интернет.
В качестве ядра сети был выбран коммутатор Cisco Catalyst 3750X 24, располагавшийся в серверной комнате. В него был подсоединен межсетевой экран Cisco ASA 5510, который также выполнял роль шлюза по умолчанию для всех сегментов сети CTF (команды, таски, сервисы, жюри). Он раздавал IP-адреса (DHCP) для всех компьютеров сети, обеспечивал трансляцию IP-адресов (NAT), разграничивал доступ к заданиям, а также обеспечивал доступ в Интернет.
С ядром сети был соединен коммутатор Cisco Catalyst 3750G 24, в который были подключены свичи D-Link DES-1008E десяти команд и жюри, каждый из которых принадлежал своему сегменту (VLAN).
Также в главный маршрутизатор было подключено два мощных сервера для интерактивных тасков, общих сервисов и жюрейской системы:
1. 2 processors, 4 cores, 64Gb RAM, 1Tb HDD.
На нем был поднят VMware ESXi с двумя виртуальными машинами. На первой работала серверная версия Ubuntu 13.04 с набором жюрейских сервисов:
На второй работал сервис визуализатора под управлением Windows 7.
2. 2 processors, 6 cores, 128Gb RAM, 1Tb HDD.
На нем также функционировал VMware ESXi, на котором работало 36 виртуальных машин:
-4.png)
Схема игровой сети
Как только легенда и правила были готовы, необходимо было приступать к проектированию общей архитектуры системы. Далее будет описано устройство площадки в целом, а также каждого отдельного компонента.
Схематичное представление общей архитектуры проекта
Главным элементом является Jury System — система, обрабатывающая всю игровую логику. В ее задачи входит обработка игровых событий и подсчет очков команд. Все остальные части — скорее внешние интерфейсы, нежели самостоятельные подсистемы.
Flag Acceptor Interface — интерфейс приема флагов. Является подсистемой Jury System; представлен на данной схеме для отображения возможности команд сдавать флаги, украденные как с общих так сервисов, так и с сервисов оппонентов.
MongoDB — база данных игрового состояния. Здесь хранится и обновляется все актуальное состояние игры: очки, набранные командами, состояния заданий (открыты или закрыты для каждой из команд), полные описания самих заданий и боссов, продолжительность игры и пр.
User Interface (UI) — пользовательский интерфейс команд, реализованный в виде веб-приложения. Согласно правилам игры, команды могут открывать задания, покупать / продавать ресурсы, решать задания, получать информацию о текущем рейтинге и т. д. За эту функциональность отвечает UI. В качестве исходных данных для отображения берутся данные из MongoDB. Обработка запросов от пользователей реализована посредством RPC, построенным в свою очередь на AMQP.
Visualizer — система визуализации игрового процесса, аккумулирующая и отображающая игровые события. Поскольку не вся информация может быть передана через события, система берет некоторые данные из состояния системы в MongoDB.
Network Access Interface — интерфейс управления доступом к таскам. В начале игры все таски недоступны командам. Как только команда открывает какой-либо таск, ей открывается к нему доступ при помощи этого интерфейса.
Как было описано выше, Jury System (жюрейская система) отвечает за просчет игровой логики. При ее проектировании мы старались достичь следующие цели:
Для подстраховки мы создали специальную систему восстановления состояния игры после падения жюрейской системы.
Цели обозначены, теперь можно расписать задачи жюрейской системы:
1. Обработка раундов
2. Обработка пользовательских запросов
3. Прием флагов с сервисов от команд
4. Обработка логики работы боссов
5. Награждение команды ачивками
-6.png)
Архитектура жюрейской системы
Интерфейсы для работы с внешними компонентами:
Сущности игры:
Обработку логики над игровыми сущности берут на себя «игровые менеджеры». Хочется отметить некоторые их особенности реализации.
Для проверки работоспособности сервисов, организаторами CTF заранее пишутся специальные программы, чекеры. Сервисы обычно абсолютно абстрактны и меняются от соревнования к соревнованию, поэтому чтобы иметь универсальный интерфейс работы с чекерами. Чекеры запускаются в отдельных процессах со следующими параметрами командной строки: команда {GET или PUT}, определяющая какое действие совершить — положить флаг на сервис или проверить его наличие, IP-адрес сервера, на котором проверяется сервис с флагом, сам флаг. По завершению работы чекер должен вернуть статус завершения:
Поскольку за один раунд надо совершить 2 действия для чекеров — GET и PUT, они запускаются для всех команд 2 раза за раунд: PUT — в первую четверть раунда со случайной задержкой внутри четверти, GET — в третью четверть раунда со случайной задержкой внутри четверти. В момент запуска чекеров на выполнение команды PUT также выполнялось завершение всех чекеров, не успевших отработать к тому времени. Статус сервиса в таком случае будет отображать ошибку работы чекера.
Архитектурно чекеры запускаются сразу на все сервисы и на все команды, поэтому проверка сервисов является самой ресурсоемкой задачей всей системы. Поэтому особое внимание следует уделять написанию чекеров — они должны как можно быстрее отработать и использовать при этом как можно меньше ресурсов. В общем, с точки зрения программирования, все как всегда :)
Остальные компоненты не представляют особого интереса. Единственное, что хотелось бы отметить, это — система восстановления игры после падения. Для реализации этой функциональности пришлось сохранять многие игровые переменные во внешнюю базу. Поскольку большинство данных уже сохранялось в MongoDB, было решено добавить функционал сохранения оставшихся и восстановления их из БД.
Напоследок стоит отметить пару слов о реализации жюрейской системы. Вся система была написана на C++, поскольку это был наиболее популярный язык среди команды разработчиков системы. К тому же, автор свято убежден, что тот же код, написанный на Python, будет работать медленнее. В качестве фреймворка для разработки был выбран Qt, как наиболее удобный для выделенных под проект разработчиков.
Продолжение следует…
P. S. На сайте PHDays опубликована [3] интереснейшая статья с анализом игрового процесса.
Автор: ptsecurity
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/38475
Ссылки в тексте:
[1] Image: http://habrahabr.ru/company/pt/blog/186310/
[2] Positive Hack Days III: http://phdays.ru/
[3] опубликована: http://phdays.ru/upload/ctf/ARTICLE_CTF_ANALYSIS_v4.pdf
[4] Источник: http://habrahabr.ru/post/186310/
Нажмите здесь для печати.