Attack-Defense CTF

Что это такое и как в это играть
Описание и правила
Описание
Attack-Defense CTF — это соревнование в реальном времени, где командам нужно соревноваться друг с другом, атакуя и защищая сервисы.

Каждая команда имеет свой сервер или несколько серверов (хостов / компьютеров), на серверах располагаются сервисы.

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

Например, представьте, что вы маленький google: у вас есть один сервер, на котором работают 3 сервиса — youtube (с возможностью создать приватное видео), gmail (с приватной перепиской) и photo (с приватными фотографиями).

Кроме того, сервисы спроектированы так, что каждый из них содержит одну или несколько уязвимостей, позволяющих эту приватную информацию похитить.
Набор сервисов у каждой команды одинаковый, уязвимости тоже; если вы нашли уязвимость в своём сервисе, такая же уязвимость есть в этом сервисе у других команд!

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

Флаги хранятся на вашем сервисе и должны быть доступны пользователю, который их оставил, но не должны быть доступны другим пользователям (иначе данные совсем не приватные, правда?). Например, в случае сервиса, пародирующего gmail, письмо может содержать флаг в теме письма или содержимом, и пользователь, его отправивший, должен видеть его в исходящих, пользователь, его получивший, — во входящих, а остальные пользователи — не видеть вовсе.

Если приватные данные (читай — флаги) ваших пользователей будут похищены с вашего сервиса злоумышленниками из команд-соперниц — вы будете терять очки.
Виртуальных пользователи, помимо прочего, проверяют функциональность вашего сервиса; если это почта, то они могут:

  1. Зарегистрироваться;
  2. Войти в почту;
  3. Отправить письмо;
  4. Прочитать пришедшие письма;
  5. Отметить письмо как спам (и больше не получать письма от этого собеседника).

Если ваш сервис функционирует неправильно или не доступен вообще, то вы будете терять баллы. Ниже мы опишем это подробнее.
Правила и подсчёт очков
Каждая команда получает одинаковый набор сервисов.

Раз в раунд (определенный временной интервал, обычно уточняемый организаторами, если их спросить напрямую) сервис команды проверяется организаторами с помощью чекера.

Чекер — это программа, которая эмулирует работу реальных пользователей сервиса. В его задачи входит: проверить функционал сервиса, проверить в сервисе наличие флагов (приватных данных), оставленных там ранее, положить в сервис новые флаги.

Флаг, который кладёт чекер, подчиняется общему правилу — это приватная информация в сервисе, которая является обычной строкой и подходит под регулярное выражение [A-Z0-9]{31}=
После проверки сервиса чекером команда получает один из четырех статусов:

  • OK — сервис функционирует нормально.
  • MUMBLE — часть функционала сервиса не работает (например, вы отключили поиск по картинке в поисковике и пользователь не может им воспользоваться).
  • CORRUPT — невозможно получить данные пользователя (например, пользователь отправлял письмо, но теперь не может его найти в исходящих из-за атаки другой команды).
  • DOWN — сервис не доступен по сети.
Для каждого сервиса считается один из самых важных результатов вашей команды в игре: SLA — количество прошедших игровых раундов, которые сервис провёл со статусом OK / количество прошедших раундов вообще.

Пример: В игре прошло 20 раундов, команда получила 10 статусов OK, потом 2 статуса MUMBLE, 2 статуса CORRUPTED и 6 статусов ОК, тогда SLA по этому сервису будет равно (10 + 6) / 20 = 80%

Следующий крайне важный параметр — это FP (flag points).
Обычно, ваши FP изначально равны нулю (или какой-то другой одинаковой для всех константе). Если вы похищаете приватные данные пользователей (флаги) с сервисов других команд, после чего направляете эти флаги в проверяющую систему жюри, ваши FP растут, а FP команды, чьи флаги вы похитили, падают. Обычно, чем больше FP было у команды соперников, тем больше FP вы получите.
Подсчёт очков
В разных CTF-ах итоговая формула подсчёта очков отличается, но чаще всего используется вариант SLA * FP. Например, если ваш сервис отработал на ОК в 80% случаев, и вы набрали 1000 очков, то ваш счёт по этому сервису = 800.

Если в игре участвует не один сервис, а несколько (а чаще всего это именно так), то счет по всем сервисам суммируется.
Пример игры, или что делать в самом начале
Игровая сеть
В самом начале организаторы объявляют, как будет осуществляться доступ к игровым серверам.
Иногда организаторы сходу приносят вам запароленный ноутбук, оставляя на вас радость его взлома и приведения его в чувство.

Доступ к игровой сети (в которой вас уже ждут ваши игровые сервера) осуществляется при помощи VPN (погуглите). Файлы-конфигурации посылаются заранее капитану команды по оговоренному каналу связи. Каждый игрок команды должен выбрать свой уникальный конфиг-файл из предложенных организаторами (не допускайте пересечений с сокомандниками, это может привести к плохим последствиям) и запускает VPN-клиент с этим конфигом.
Популярные VPN-клиенты с легкостью справятся с конфиг-файлами, которые вам отправят, но на всякий случай рекомендуем использовать tunnelblick для MacOS, Openvpn connect для Windows и стандартный клиент Openvpn для Linux (здесь).

VPN-клиент перенесет вас в игровую сеть, в которой вам необходимо найти ваш сервер (сервера).
Игровые машины
Игровые машины, они же — игровые сервера, это машины, выделенные вашей команде для игры. На них уже установлены игровые сервисы. Машины доступны в пределах игровой сети; вы можете подключиться к ним по протоколу SSH. IP-адреса и пароли обычно предоставляются капитанам организаторами, как и конфиги VPN.

Допустим, организаторы выдали вам такой файл:
ssh team0@10.70.0.2
password: uj1lwWvHj,CycC2Q_lWa


Тогда, для доступа к машине вам необходимо ввести в консоли команду
ssh team0@10.70.0.2
После чего ввести пароль, указанный в бумажке.

Для Windows вам потребуется отдельный ssh-клиент, так как команда ssh в Windows не поддерживается по умолчанию. Советуем скачать putty (ищется в гугле на раз-два).
Находим сервисы
Итак, вы в машине. Обычно сервисы можно найти в директориях /home, /root, /services, /var/www, /tasks. Чаще всего каждый сервис лежит в своей подпапке, в которой хранятся его исходники (если такие есть), бинарный файл, файлы конфигурации и прочие необходимые для работы сервиса вещи.

Для примера, можете посмотреть содержимое папок сервисов здесь.

Зачастую бывает удобно загрузить исходные коды сервисов с сервера на ваш компьютер. С этим вам может помочь команда scp или putty.
Первая уязвимость
Допустим, в исходном коде одного из сервисов вы нашли пароль от панели администратора. Это значит, что у всех остальных команд пароль от панели администратора точно такой же.
Защита
Первое, что имеет смысл сделать, чтобы через админскую панель не украли данные ваших пользователей, это сменить от неё пароль, сделав её доступной только для вас. Для этого просто измените строчку в коде, где указан пароль, на что-то другое, и не забудьте перезапустить сервис. Обычно, сервисы находятся в docker-контейнерах (специальной среде исполнения, которая изолирует сервисы друг от друга) и перезапустить их нетривиально, но зачастую организаторы предоставляют скрипты с названиями вроде stop.sh или restart.sh, которые помогают управлять запуском сервиса, однако мы всё равно рекомендуем вам ознакомиться с докером и тем, как управлять его контейнерами.

Итак, вы изменили строчку, перезапустили сервис. Теперь пришла пора убедиться, что вы не сломали его: попытайтесь воспользоваться сервисом, как им пользовался бы обычный пользователь. Если всё работает, ваша защита прошла успешно.

Теперь пришло время атаковать другие команды.
Атака
Для того чтобы атаковать вражескую команду, вам нужно знать её IP-адрес. В большинстве случаев организаторы выдают либо диапазон игровых IP-адресов, среди которых вы вольны выбрать в качестве жертвы любой, либо адреса видны напротив названий команд в scoreboard'е.

Когда вы выбрали жертву, заходите в панель администрирования на IP-адресе жертвы под найденным вами стандартным паролем, сожмите кулачки в надежде, что соперники еще не защитились, и если вы успешно вошли — вперёд искать там флаги!

Если вы нашли флаг, вам необходимо сдать его в проверяющую систему и получить свои очки. Обычно проверяющая система располагается на сервере организаторов (его IP выдаётся в начале игры) и доступна по определенному порту (который тоже уточняют в начале игры). Если не сказано иное, проверяющая система ожидает от вас подключения на указанный порт по протоколу TCP (например, с помощью утилиты netcat или socket в питоне), после чего вы должны представиться проверяющей системе, отослав свой токен (он выдается в начале игры), а затем вы должны послать похищенные у других команд флаги. За каждый похищенный флаг проверяющая система наградит вас очками FP, о чём и сообщит.

Иногда проверяющая система откажет вам в очках по причине, в которой сразу и признается, это может быть:

  • "Flag is your own" — флаг взят из вашего собственного сервиса
  • "Flag is too old" — флаг был отправлен на сервис команды очень давно, и очки за него уже не дадут — ищите более свежие флаги. Обычно "время жизни" флага составляет от 2 до 10 раундов. Вы можете спросить организаторов про время жизни флага, они с радостью ответят.
  • "Wrong flag" — флаг не существует. Вы могли опечататься, а может флаг был "подделан" командой, у которой вы его украли.
Кстати, один флаг может быть сдан вами только однажды — никаких бесконечных очков!
Автоматизация
Скорее всего, вы захотите автоматизировать вашу атаку — совершать её вручную слишком медленно. Для этого обычно пишутся программы, которые называются exploit'ами. Их можно писать на любом удобном вам языке программирования, ни в какую проверяющую систему их сдавать не нужно, они исключительно для вашего удобства и скорости зарабатывания FP. Мы рекомендуем писать exploit'ы на Python, вам могут пригодится такие библиотеки python'а как pwntools, requests, socket, beautifulsoup, re.

По этой ссылке вы можете посмотреть примеры эксплоитов, написанных организаторами тренировок CBS для своих сервисов.

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

Кроме того, будьте осторожны: некоторые уязвимости позволяют сделать ваш сервис недоступным, и вы можете начать терять SLA, что критически отразится на ценности ваших FP, ведь итоговый счёт — это произведение SLA на FP.
Глоссарий
Здесь под одним параграфом вы найдете все основные термины Attack/Defense CTF. Если какие-то из терминов вам непонятны, то перечитайте страницу еще раз или напишите свой вопрос в чат.
Vulnbox (игровая машина / уязвимый образ) — физическая / виртуальная машина, на которой находятся сервисы команды.

Сервис — уязвимое приложение, работающее по сети, развёрнутое на vulnbox'e. Обычно на одном соревновании несколько сервисов.

Раунд — заданный временной промежуток, единица времени в игре.

Чекер — программа, которую организаторы запускают каждый раунд для проверки работоспособности сервиса. Программа эмулирует действия пользователя в сервисе и оставляет флаги.

Атака — успешное похищение флагов с сервиса команды-соперницы.

Защита — устранение найденной уязвимости, после которого использовать её для атак становится невозможно.

Флаг — строка, являющаяся частью приватных данных в сервисе. Обычно подходит под регулярное выражение [A-Z0-9]{31}=.

SLA — доля прошедших игровых раундов со статусом OK для данного сервиса к общему количеству прошедших раундов. Обычно измеряется в процентах.

FP (Flag Points) — численное значение, которое растет, когда вы крадете флаги и падает, когда их крадут у вас.

Эксплойт — программа, которая автоматически занимается похищением флагов через найденную уязвимость.

Scoreboard — приложение, отображающее текущее положение команд (турнирная таблица).
Референсы
Если вы хотите узнать еще подробнее про AD перед первой игрой, то вы можете:
Посмотреть видео
подробное видео про AD для новичков от капитана Shadow Servants и команды HSE CTF
плейлист про Attack/Defense от SPbCTF. Тут и про формат, и разбор сервисов
разбор одной из тренировок от SPbCTF
Посмотреть прошедшие соревнования и тренировки
Играть, играть и ещё раз играть
  • Ищите Attack-Defense соревнования на ctftime.org
  • Следите за анонсами тренировок и соревнований от C4T BuT S4D, SPbCTF, Hackerdom