RUCTFE2009. Экзотичнее не придумаешь

Официальный старт события в 16-00 по UTC, т.е. в 20-00 по Московскому времени, но для команд все начинается раньше. В момент, когда выдается ключ для расшифровки образа с сервером все в техническом плане должно быть настроено и готово к работе. По этой причине команда UFOlogists прибыла к в «штаб»(кафедра БИТ ТТИ ЮФУ) к 17-00. Кое-кто прибыл еще раньше, что бы опробовать технологии, которые неплохо бы было применить в игре. Планировалось установить дополнительный firewall на роутер нашей подсети, что бы он фильтровал sql-запросы с целью «не пускать» инъекции.

Топология сети ничего нового в себе не содержала (картинка взята с официального сайта соревнований):

ructf_net

До начала игры нужно было «поднять» vpn-канал к главному роутеру, настроить шлюз, подготовить машину, где будет располагаться игровой и тестовый образ.Посуетившись, мы собрали довольно эргономичное рабочее место администратора, который, к слову, в течении всей игры как правило находится возле этих двух компьютеров( на фотографии он вовсе не спит, как может показаться, а настраивает роутер).

routerandadmin

После этой необходимой процедуры каждый занялся обустройством своего рабочего места. Рабочее место – это как правило один-два компьютера (ноутбука). Вот, к примеру два таких «места»:

worker1

worker2

Так же до самого старта игры дорабатывались заготовки для игры:

- Локальный сервер для отсылки флагов;
- Система логгирования трафика к серверу;
- Firewall для фильтрации sql-запросов;
- Скрипты для дизассемблера IDA, для получения сигнатур с библиотечных функций ( что бы уменьшить объем исследуемого вручную кода );

Как это часто бывает на подобных играх старт события был отложен. На час. Этот час был потрачен на дополнительную подготовку. На irc-канале соревнований люди коротали время откровенным флудом. В связи с проведением игры в России популярными темами, на которые общались наши и зарубежные игроки были водка, баня, балалайки, медведи. Так же кто-то пробовал инициировать игру «Slova», но игра заглохла, из-за недостаточного русского лексикона иностранных участников.

Второй раз переносить игру не пришлось и она стартовала в 20-00 по Москве сразу же после выдачи парольной фразы, необходимой для расшифровки образа. Сценарий действий на первые пол часа у нас был заранее определен. Образ был за считанные минуты расшифрован и скопирован в несколько мест: для «поднятия» игрового сервера, для изучения содержимого и извлечения сервисов и остальным игрокам по желанию для исследований.

Одной из главных интриг игры является содержимое игрового образа. Заранее не оговаривается не только состав сервисов, но даже использованная операционная система. Готовиться приходится ко всему. Встречать образ, основанный на Windows, нам за всю историю не приходилось, видимо проблемы с лицензированием тому виной, а вот увидеть там экзотический Linux (на UFOCTF2009 был arch Linux, к примеру) или одну из многочисленных разновидностей *bsd-системы – это запросто. Но увиденное внутри превзошло все ожидания. Сервер был реализован на операционной системе Android. Разумеется, саму ОС в чистом виде запустить на Virtual Box ( данная виртуальная машина используется для поднятия виртуального сервера игры, и это оговорено заранее ) не удалось бы. В зашифрованном образе оказался Linux Debian Lenny, а вот у него «внутри» был поднят эмулятор КПК на Android и сервисы находились в ОС, которая работала в этом эмуляторе.

Каждая игра CTF, что бы было не скучно играть, имеет свою тематику и предысторию. В данном случае мы получили в качестве сервера КПК, используемый в амуниции сталкера (Все помнят кто это такой? Хабар, аномалии и т.д и т.п ). На КПК среди калькулятора и прочих записных книжек работают четыре сервиса: CryptoPizza, Jabber, F, simple и Stalker. В заголовке финальной таблицы вы можете увидеть именно их названия. Надпись и цвет в соответствующем квадрате обозначает статус сервиса: лежит, поломан, отлично работает. Вообще статусов больше, но это отдельная тема. Главный смысл: чем больше сервис находится в состоянии «работает» тем больше очков начисляют.

scoreboard

Теперь для тех кто совсем не в теме кратко объясню значения столбцов. №, Logo, team, думаю, понятно. Total – это общий результат команды. У команды, которая находится на первом месте значение этого столбца 100%, у остальных в зависимости от отставания от первой. Defense – результат по защите. Он зависит от того сколько времени работают сервисы и как много флагов с сервиса украден (чем меньше – тем лучше ). Attack – результат по нападению. Определяется количеством захваченных с чужих серверов флагов. Advisories – определяет количество и качество написанных бюллетеней безопасности. Бюллетени пишутся по поводу найденных в сервисах уязвимостях. Бюллетень должен содержать описание, пример использования для удаленной атаки и описание заплатки. Столбец Tasks описывает состояние дел в прохождении так называемых «тасков». «Таски», по моему скромному мнению, придуманы больше для развлечения и отвлечения от больших объемов умственной работы, связанной с сервисами.

Дается задание и его нужно выполнить. К примеру, первым заданием, которое мы выполнила просьба ответить на вопрос «Что в зоне успех, удача. судьба и случай». Потратив некоторое время удалось найти соответствующее место в книге братьев Стругацких, затем ее англоязычную версию (вопросы и ответы-то на английском) и добыть таким образом ответ. Это были наши первые 100 ( не считая балов за защиту ) баллов. Должно было быть 100, но как оказалось система, принимающая ответы так же имеет свой «баг». Оказалось, что вернувшись на страницу ранее и заново послав ответ, он снова засчитывается! Не то что бы корысти ради, а больше для эксперимента мы пощелкали таким образом странички и тут же взобрались на верх турнирной таблицы.

first

Собрав стихийное совещание мы решили, что это не fairplay, добиваться таким образом победы неинтересно, глупо, да и не получится – жюри не глупые и увидят, то что у команды 600 баллов в колонке, где максимом может быть 300. Решено было написать advisory на данный «баг». В админке жюри писать было некуда, так как к игре это не относится, поэтому мы написали в личку, а затем и в общий канал jabber. После этого нашлось множество «последователей», самые наглые из которых взвинтили себе 6900 баллов. Разумеется, некоторое время спустя жюри поправили ошибку и все вернулось на свои места. Мы оказались чуть выше середины турнирной таблицы.

Как я уже говорил сервером оказался Android в эмуляторе. Сервисы оказались соответсвующие. CryptoPizza, f – написаны на java.Staler на Си, а вот на чем написан Simple с уверенностью сказать не могу ( но тот, кто копался в нем, возможно и сможет ), потому как выдан он был в виде бинарного файла. Как это обычно делается на доске( доска – важный инструмент команды ctf ) были написаны названия сервисов и розданы «обазанности», т.е. кто какой сервиса «копает». Тут же послышались возгласы человека (Антон его зовут), который выбрал сервис simple: «Освой assembler ARM за 7мь часов!». Бинарный файл был собран именно для такого процессора. К слову сказать, к концу игры он его освоил, хотя ранее имел дело только с assembler’ом семесйства x86. Кто-то начал читать исходник на СИ, кто-то соединяться с jabber-сервером и пытаться понять, что на нем происходит. Ваш покорный слуга вчитался в листинги java-сервиса и начал вникать в особенности сборки его под платформу Android.

Дальнейшие баллы мы получали за то, что сумели «поднять» сервисы на устройстве и нашли несколько потенциальных уязвимостей, с помощью которых удавалось сделать разные вещи: перегрузить эмулятор другой команды, получить содержимое таблицы через sql-инъекцию. Так же были найдены недокументированные особенности. По «находкам» были написаны advisories, за которые нам было выдано разное количество баллов. Конкретнее об найденных уязвимостях, я надеюсь, напишут в блоге нашей команды ребята, которые над ними трудились. Я лишь сказу, что к сожалению, до самого конца игры, как мы ни старались вытащить через них флаги так и не удалось.

work

Дополнительные балы был получены за «таску» по дешифрации сообщений. Было так же полностью отвлеченное задание. Нужно было отослать жюри «русский танец». Мы поводили хоровод вокруг обогревателя (видимо, символизировал костер) и получили за это несколько сотен баллов ;) Пару заданий мы пытались раскусить в течение всей игры. Одно из них стеганография из звукового файла. «Вывести» зашифрованный звук мы смогли, а вот «аудишн» услышанного подвел. Так и не разобрали, что же там говорилось.

Другое задание – скрипт на haskell (для тех кто не знает – это такой функциональный язык программирования). У нас в команде, кстати, есть любитель функциональных языков ( Костя ). Так вот он провел довольно много времени сидя и рассматривая эти великолепные (судя по его взгляду) четыре строчки. Даже подозвал меня однажды и спросил: «Артем, не видишь ли ты в «этом» деревья?», я разумеется понял о каких деревьях шла речь, но смог выделить, только лишь внешнее( т.е. корни, палки, ветки, кусты, колючки) сходства благодаря множеству символов ‘\’, ‘/’ и ‘|’, потому как «мыслю», к сожалению только императивно :) ще можно было процетировать 14-ую строчку HOWTO из мануала к серверу Gopher для Windows XP… не осилили.

functional

Бурная «работа» над сервисами продолжалась до самого окончания игры ( 6-ть часов утра ). Флаги получать не удавалось. Что бы не скатиться вниз по таблице мы стали писать advisory обо всем что удалось найти. Получили дополнительные очки.

В самом конце уже действовали «от обратного». Опускали вниз по турнирной лестнице команды, которые находились выше нашей. «Ронять» их сервисы, к тому моменту мы уже умели. Результат – 14-ое место из 43 команд.

final

Стоит ли радоваться этому результату? Мы можем и добиться и большего. Стоит ли огорчаться? Определенно нет. Мы показали себя как слаженная команда, которая имеет достаточно знаний, умений. Если к этому позже добавить опыт и «домашние заготовки», то вполне можно побеждать.

Хотелось бы поблагодарить организаторов игры за отличную ее реализацию. Так же спасибо факультету ФИБ и кафедре БИТ за помощь и поддержку.

Комментировать