Содержание статьи
Capture the Flag (CTF) — это игра, в которой участники пытаются захватить флаг противников и защитить свой. Популярной ее сделали командные шутеры вроде Quake и Team Fortress, но в какой-то момент хакерам пришла идея спроецировать CTF на информационную безопасность. О том, как выглядит результат, и пойдет речь в этой статье.
Хакерский CTF хоть и построен на правилах классического Capture the Flag, однако с годами очень сильно видоизменился. Сейчас CTF в контексте информационной безопасности может означать даже соревнования, которые далеки от обычного захвата флага. Множественные эксперименты с правилами и механикой проведения привели к появлению массы типов и разновидностей CTF. Вот основные из них.

Attack-Defence
Этот вид CTF считается классическим, поскольку использует правила Capture the Flag в чистом виде. Организаторы выдают командам некий образ (vulnbox) — чаще всего это виртуалка, но может быть ноутбук, сервер или удаленный доступ к чему-то. Там развернута система, а в ней — несколько сервисов, которые написаны на разных языках программирования. Причем написаны так, чтобы в них имелись множественные уязвимости.
У команд обычно есть абсолютные права на виртуалке, хотя встречаются и частные случаи, когда доступ ограниченный, например — DEF CON. Образы обязательно полностью одинаковые, а соответственно, и уязвимости в сервисах — тоже. Основная идея CTF — искать уязвимости в своей системе и атаковать чужие. Почти всегда vulnbox — это дистрибутив *nix.
Хоть все сервисы и должны быть написаны на разных языках, кое-что одинаковое у них есть: к каждому можно получить доступ извне. Например, это может быть веб-сервер, написанный на Python с использованием Flask или Django, либо скомпилированный бинарный файл (зачастую без исходников), который слушает какой-нибудь порт и выполняет определенные действия. Короче, все, что может прийти на ум организаторам.
Иногда даже приходится писать свои сервисы с нуля — это отступление от классической модели CTF, но такое тоже встречается. В этом случае на какой-то порт сыплются определенные пакеты, а участники должны написать обработчик для них.
Как организаторы узнают, что тот или иной сервис взломан? В этом им помогают проверочные боты. Они имитируют действия легитимного пользователя, который применяет сервис по назначению. Каждый раунд бот каким-то особым для каждого сервиса образом отправляет на него некую секретную информацию. Эта информация и является флагом. На следующий раунд бот приходит и проверяет, доступен ли предыдущий флаг и верен ли он, а затем ставит новый. Организаторы таким образом узнают, что сервис работает корректно. Продолжительность и количество раундов описываются в правилах и могут варьироваться от игры к игре.
Вот пример того, как действует бот. Представь, что есть сервис, который имитирует работу почтового сервера. Бот подключается, регистрирует новый почтовый ящик и сам себе отправляет сообщение, в котором содержится флаг. На следующий раунд бот заходит под ранее зарегистрированным аккаунтом и читает флаг, отправленный в предыдущем раунде. Если флаг сходится с тем, который содержится у него в базе, то бот считает, что сервис работает верно. После этого он снова регистрирует учетную запись и повторяет все с начала.
Успешная атака — это обнаружение уязвимостей, которые позволят читать чужие сообщения. Если команда находит такую уязвимость, то она сможет прочесть сообщение бота и таким образом захватить флаг.
Случается, что бот не может забрать флаг с предыдущего раунда. Например, виртуалка упала, либо команда сделала кривые исправления сервиса, либо другая команда с помощью уязвимости удалила или изменила этот флаг. Тогда организаторы считают, что сервис у команды недоступен. Пока сервис работает корректно, команда получает очки за защиту. Если нет, то в раунды его недоступности не получает ничего.
Помимо очков за защиту, есть второй вид очков — за атаку. Они начисляются за сдачу флагов, которые хранятся в сервисах других команд. Формулы для расчета этих очков очень сильно разнятся от соревнования к соревнованию. В формулу, к примеру, может быть заложено число команд, которые тоже украли этот флаг, а может и не быть. Часто еще учитывается место в рейтинге команды, у которой был украден флаг.
Любое изменение формулы подсчета очков очень сильно влияет на механику игры. Например, если члены одной команды первыми нашли уязвимость и написали к ней эксплоит, то зачастую есть смысл атаковать только слабые команды, поскольку сильные могут проанализировать трафик и украсть эксплоит. Зато если в формуле учитывается ранг команды и за сильные будут давать значительно больше очков, то эта тактика может оказаться невыгодной. Еще часто встречается правило, что команды не могут сдавать флаги за сервисы, которые у них самих недоступны.
Коэффициент, который соответствует числу команд, также укравших этот флаг, тоже немаловажен. С ним получается, что чем меньше команд смогли сдать определенный флаг, тем он дороже. В общем, главное — читать перед каждым CTF регламент и продумывать тактику в соответствии с ним.
На что похож флаг?
В регламенте соревнования всегда очень четко прописано, как именно должны выглядеть флаги. Это нужно, чтобы участники хорошо понимали, что именно им нужно защищать и красть. Чаще всего флаги выглядят примерно так: 322d4e510659dc1e3a9d5b6d6df6c3e0
. Но опять же организаторы могут придумать совершенно любой вид флага.
Task-Based CTF
Это наиболее популярный вид CTF, поскольку он проще других в реализации. Вместо того чтобы ломать друг друга, команды делают определенные задания. За решение заданий дают флаг — сдав его, команда получает очки. Обычно в таком CTF есть несколько веток заданий — каждая по своей дисциплине. Давай пройдемся по наиболее популярным.
Reverse — классический реверс бинарей. Он обычно сводится к разбору какой-нибудь скомпилированной программы или прошивки. Тебе понадобится вникнуть в логику ее работы, что-то вытащить из нее или написать кейген.
Exploit — эксплуатация различных уязвимостей. Чаще всего требуется найти уязвимость в бинарнике для Linux. Как правило, это уязвимость из серии переполнения стека или кучи, уязвимости форматной строки и подобные. Часто бывают включены защитные функции, вроде ASLR, DEP или Canary, которые тоже надо обойти.
Web — задания на веб-безопасность. Это может быть что угодно — начиная от SQL Injection, XXE и RCE, заканчивая XSS (где по твоим ссылкам переходит специальный бот) и уязвимостями в логике приложения. Причем уязвимости редко бывают в том виде, в каком встречаются в реальной жизни. Часто разработчики добавляют своеобразные WAF, которые значительно усложняют процесс.
Crypto — тут тебе предстоит изучать малоизвестные и вспоминать известные слабости разных криптографических алгоритмов. Как правило, алгоритм выдают самописный, однако в него будет заложена уязвимость какого-нибудь другого криптоалгоритма, найденная ранее.
Stegano (стеганография). В этой дисциплине участники пытаются вытащить скрытую информацию из какого-нибудь мультимедийного файла, документа, текста или образа чего-либо. Частенько задачки пересекаются с криптографическими.
Forensic. Форензика имитирует различные задания на расследование инцидентов и анализ образов и файлов. Вполне могут попасться задания, связанные с восстановлением удаленных файлов и скрытых разделов. Часто приходится анализировать самописную вирусню или дампы трафика.
PPC — Professional Programming and Coding. Это вариация на тему спортивного программирования, но в более прикладной форме. Тут может быть абсолютно что угодно: начиная с написания парсера или кода для брутфорса и заканчивая биржевыми или игровыми ботами.
В ветку Misc попадают любые задания, которые не относятся к другим группам. Это может быть и конкурентная разведка, и какие-нибудь развлекательные задания (например, «сфоткайте самую старую IT-книгу, которую сможете найти») — короче, все, на что хватит фантазии у организаторов.

В зависимости от сложности заданий за них дают разное количество баллов. Очень часто ветки пересекаются, и одно задание может одновременно требовать разных специализированных знаний.
Механика проведения task-based CTF бывает разная. Например, более сложные задания могут открываться по мере решения более простых. Или бывает так, что команда, решившая задание первой, получает дополнительные баллы. Однако в целом идея остается прежней — кто решил больше заданий, тот набрал больше баллов и тот в итоге побеждает.
Mixed
Существуют CTF, которые объединяют черты attack-defence и task-based: командам требуется не только защищать свои сервисы и атаковать чужие, но и решать задания. В этом случае правила проведения могут быть любыми и ограничиваются лишь воображением организаторов. Яркий пример можно было встретить на PHDays 2014. Текста регламента хватило на небольшую книжечку, и разобраться в механике было не так-то просто.
King of the hill
«Царь горы» — относительно молодой тип CTF, его даже сложно считать настоящим CTF. Основная идея этого формата — взломать систему, закрепиться на ней и не дать другим участникам перехватить управление. Фишка в том, что с определенным интервалом времени система полностью откатывается и гонка за получение доступа начинается по новой.
Немного про сами соревнования
В мире каждую неделю проводится как минимум один CTF, а то и несколько. Организуют их, как правило, команды, которые сами постоянно участвуют в подобных соревнованиях. Полный список всех CTF с датами проведения можно найти на сайте CTFtime.
Самый крутой CTF — это, безусловно, финал DEF CON CTF (attack-defence). Он проходит в Лас-Вегасе каждый август. Как правило, в нем участвуют пятнадцать-двадцать сильнейших команд из разных стран, прошедшие отборочные соревнования в течение года. Часть команд отбирается через DEF CON Quals CTF (task-based), который проводится в мае. Остальная часть — через другие авторитетные CTF, которые в начале года получают статус DEF CON Qualifying Contest.
Немало CTF проходит и в России. Большинство из них студенческие, однако есть пара соревнований, которые известны на международном уровне, — RuCTFE и PHDays. RuCTFE — это attack-defence CTF, который проводится командой HackerDom. Он имеет очень высокий рейтинг среди международных CTF, и, как следствие, победа на RuCTFE — пропуск на DEF CON CTF.
PHDays организует компания Positive Technologies. Его формат неоднократно менялся — были и task-based, и mixed варианты. Некоторое время он был отборочным для DEF CON CTF.
Из российских студенческих CTF наиболее популярны RuCTF (не путать с RuCTFE) и VolgaCTF. С недавних пор набирает силу RCC.
Основные команды на арене CTF
Рейтинг команд можно найти на сайте CTFtime. Вот десятка лидеров на момент написания статьи.
- dcua (Украина)
- p4 (Польша)
- Dragon Sector (Польша)
- 217 (Тайвань)
- Plaid Parliament of Pwning (США)
- Tasteless (интернациональная)
- LC↯BC (Россия)
- Shellphish (США)
- int3pids (Испания)
- TokyoWesterns (Япония)
У каждой из этих команд своя многолетняя история, свои сильные и слабые стороны. Если говорить о международных командах, то этой статьи нам не хватит, поэтому быстро пробежимся только по российской сцене.
На данный момент наиболее активные российские команды — LC↯BC (объединение More Smoked Leet Chicken и BalalaikaCr3w), Bushwhackers (команда на базе МГУ), Rdot.org (команда на базе одноименного форума), SUSlo.PAS (команда из Новосибирского государственного университета), Antichat (команда на базе одноименного форума), SiBears (команда на базе Томского государственного университета).

Что вкачивать, чтобы быть незаменимым в CTF
Как показывает опыт, все самые серьезные соревнования делают основной акцент на заданиях, которые относятся к ветке эксплоитов. Однако людей, которые достаточно прошарены в этой теме, очень мало, и даже в сильнейших командах их зачастую не хватает. В остальном все так или иначе вращается вокруг реверсинга, веба и криптографии.
Если речь заходит об attack-defence, то очень важна роль администратора, поскольку ему достается много работы.
Если ты решил углубиться в низкоуровневую безопасность, к которой относится эксплоитинг и реверсинг, то тебе необходимо определиться с операционной системой и процессорной архитектурой. Большей частью встречаются архитектуры x86 и x64, причем x64 с каждым годом все чаще. Далее по популярности идет ARM. В подавляющем большинстве случаев операционная система — это Linux, но иногда бывает и Windows (в основном в реверсе и форензике). В идеале тебе должно быть не важно, какую архитектуру реверсить, но это приходит только с опытом.
Помощь начинающему участнику CTF
Единственный способ преуспеть в CTF — постоянно участвовать в CTF. Поначалу все будет казаться нелогичным и непонятным, особенно attack-defence, но без этого никак. Благо CTF сейчас проводятся каждую неделю.
Еще советую читать разборы заданий (writeup’ы) с уже прошедших соревнований — из них можно почерпнуть много интересного. Помимо обычных CTF, есть онлайновые, они проходят вообще непрерывно. Их полный список можно найти на сайте captf.com в разделе Practice.

WWW
ringzer0team.com — сайт с очень крутыми заданиями из самых разных веток. Определенно достоин внимания.
pwnable.kr — для тех, кто решил прокачаться в эксплоитинге.
ahack.ru — сайт крутого хакера Beched. Там можно найти много интересных заданий про веб.
ftp.hackerdom.ru/ctf-images/ — золотая жила для тех, кто решил прошариться в attack-defence. По ссылке собраны виртуалки со всех прошедших RuCTF и RuCTFE.