Attack-Defense CTF от команд dtl & Rop runners
В самой середине лета в МИФИ состоялось необычное представление, а именно — первое соревнование от коллаборации команд dtl & Rop runners в формате Attack-Defense CTF для учащихся и выпускников школ со всей России. Взламывали, защищались и просто проводили время в отличной компании 60 команд или в пересчете на уникальных участников — 196 школьников. Под куполом цифрового цирка в МИФИ очно расположились 46 участников, не считая 6 организаторов.
Соревнование длилось 6 игровых часов и за это время школьникам предстояло разбираться с пятью сервисами. Дух легендарного админства от Алексея Тарасова, участника команды dtl и студента 3 курса, продолжился и на этот раз. Ничего не скрываем и рассказываем подробнее про технические аспекты и эксперименты, которые были встречены и поставлены организаторами.
Функционал сервиса enchaintix содержал чат с поддержкой, в котором участники могли общаться с LLM. Под капотом сервиса находилась модель gemma-2-2b, развернутая на подключенном к игровой сети компьютере Дмитрия Логинова, участника команды dtl. Столкновение идеального мира с реальностью произошло прямо здесь: из-за значительного числа участвовавших команд нагрузка на модель оказалась гораздо больше, чем изначально предполагалось. С первыми же сплойтами модель перестала отвечать на запросы и соответствующий столбец борды окрасился в красный цвет. Организаторы приняли волевое решение по отключению части функционала чекеров, однако возможность эксплуатации уязвимостей в чате сервиса сохранялась до конца CTF.
"Добавление хоста, не являющегося жюрейкой, вулнбоксом или участником, в игровую сеть потребовало модификации сетевого устройства и инфраструктуры. К тому же, хотелось исправить некоторые недочеты с прошлых тренировочных CTF: 1) плохой throughput на ноде с VPN-сервером, 2) отсутствие сброса ttl на gateway, 3) потенциальные проблемы с резолвингом DNS хостов инфраструктуры с вулнбоксов.
Поэтому последние 24 часа перед A&D по традиции прошли в попытках заставить работать уже разломанную модификациями инфраструктуру. Примерно за два часа до старта внезапно обнаружилось, что отсутствует сетевая связность между командами и их вулнбоксами, причем даже в открытой сети.
Чуть позже стало ясно, что уже запущенный на серверах команд сервис enchaintix не может подключиться к LLM из-за ошибки в указанном адресе. Благо, все эти проблемы удалось решить и во время самого CTF никаких подтвержденных проблем с инфраструктурой (отказ LLM из-за нагрузки не считаем) не обнаружилось. Кажется, впервые за историю ивентов от dtl", — заявляет Алексей Тарасов.
Сэкономим ваше время и кратко расскажем про сервисы:
- nevalashka — сервис с огромным количеством кода, основанный на Login System от некоего "Jpmaster77 a.k.a. The Grandmaster of C++", написанной в 2004 году. Сервис содержал несколько модификаций, добавлявших несложные уязвимости тут и там — достаточно было лишь аккуратно прочитать код. Несмотря на объем, этот сервис был решен первым и практически одновременно командами "Блаблабла" и "АКП ИНА". Некоторые из уязвимостей позволяли удалять флаги, а также полностью ломать сервис. Поэтому у большей части команд сервис находился в статусе CORRUPT на протяжении всей игры, а среди команд в топе скорборда происходила усердная борьба за флаги.
- enchaintix — тот самый сервис с искусственным интеллектом в поддержке. Помимо prompt injection в чат, сервис содержал множество простых уязвимостей: 1) захардкоженый секрет для подписи сессий, 2) открытая в общую сеть база данных, 3) включенный debug-mode в Flask, 4) хорошо замаскированную SQL-иньекцию. Этот сервис решили вторым.
- battlebots — сервис с бинарной уязвимостью, приводящей к получению исполнения произвольного кода в контейнерах соперников. Бинарную эксплуатацию осложнял тот факт, что сервис запускался в alpine контейнерах. В результате успешно написать сплойт на него смогли только команды "v3rb0s1ty" и "Pudge Fun Club". Правда только во второй половине игры.
- flagbin — второй бинарный сервис, решенный лишь одной командой "v3rb0s1ty" на последних минутах игрового времени. Для его решения было необходимо найти в скомпилированном коде path traversal, после чего аккуратно прочитать флаги из оперативной памяти процесса, используя ее отображение на файловую систему в procfs.
- crmka — :(. Сервис оказался не по зубам участникам. Решение сервиса предполагало объединение сразу двух уязвимостей — auth bypass + RCE via dynamic import. Единственный флаг, сданный командой "daywawe.", был получен в результате фишинга соперников, а не решением самого сервиса.
Тройка лидеров выглядит следующим образом:
🥇"v3rb0s1ty", Такин Роман, Карпов Семен, Черных Данила, Белоусов Николай, Павлючков Константин.
🥈"daywawe.", Галеев Исмаиль, Гуленок Тимофей, Васильев Алексей, Румянцев Артем, Сорокин Тимофей, Старчак Илья, Коротков Михаил, Филатов Глеб, Дударева Дарья, Калита Георгий, Огарева Анна, Белозеров Иван.
🥉"Блаблабла", Маляр Матвей, Лобачев Александр, Ковалева Варвара, Кириченко Семен, Буцких Всеволод, Смолева Наталия, Шемяков Евгений, Чернышов Арсений.
Выводы сделаны, опыт получен. Всем спасибо за игру!