Регистрация на C.I.P.H.E.R. 4 открылась ещё весной, и сразу после окончания RuCTF мы подали заявку, попутно рассказав об этом другим командам с RuCTF. Я был приятно удивлен тем, что в соревнованиях приняли участие ещё 4 российские команды:
Reboot из УГАТУ
SiBears из ТГУ
Scythian из ТТИ ЮФУ
Smoked Chicken из ЧелГу и ЮУрГУ
Ещё одна команда, KEVA из ТУСУР, тоже хотела поучаствовать, но у них возникли какие-то трудности, и они не смогли играть. В прошлом году играли всего 2-е команды: мы и команда Smoked Chicken – ребята из г. Челябинска, а два года назад не было ни одной команды из России.
Все спешили подавать заявки, потому как было ограничение на количество команд, не более 25. Правда, как потом выяснилось, это ограничение было снято, и выступало 32 команды. Вообще, регистрация в этом году отличалась от прошлогодней, организаторы позволили участникам выбрать дату проведения игры. Было проведено голосование: даты были в диапазоне от начала июля и до начала августа. Я уже не помню, голосовали мы или нет, но это и не важно, из предложенных дат нам подходили все. Выбор пал на 1 августа, отлично!
Подготовка.
Подготовка проходила обычным способом. С прошлых игр у нас сохранились некоторые полезные программы, в частности:
бэкдор для Linux
простенький PHP shell
автоматическая отправка найденных флагов.
система для эксплоитов
конечно, список маленький и его необходимо увеличить, но это уже будет включено в подготовку для следующих игр. Вообще, хорошая практика, когда на игру команда выходит с некоторыми домашними заготовками, и чем их больше, тем лучше. За день до игры мы установили VPN туннель до игрового сервера и находились в стадии ожидания. Снова выражаю свою благодарность компании УралВЭС за предоставленный канал. К сожалению, у нас в УрГУ канал к внешним серверам очень медленный, и он не годится для игры в CTF. При доступе к внутригородским серверам скорость хорошая, поэтому мы сначала настроили туннель до одного из серверов УралВЭС, а потом, через этот туннель установили VPN соединение для игры. Ещё одно отличие CIPHER 4 от прошлогоднего заключалось в раздаче IP сетей командам. Обычно, номер IP сети зависел от порядка регистрации команд, в этом году Lexi (один из организаторов) решил нарушить эту традицию, т.е. номер команды и её IP сеть не совпадали. За несколько дней до игры Lexi разослал всем командам их номера и выделенную для них IP сеть. Удобно :) Теперь, когда ты видишь, что тебя атакуют, нельзя понять, что это за команда. Номер команды используется при отправке флагов на сервер.
До начала игры мы выделили две отдельных машины. Одна для игрового образа, а вторая для копии. Во время игры не рекомендуется вносить изменения и упражняться на игровом сервере. Весь процесс исследования игрового образа, тестирование эксплоитов и патчей происходит на копии, а в игровой образ вносятся только отлаженные изменения. Вместе с этим подготовили командное хранилище. Правда резервную копию мы не сделали. В следующий раз озаботимся о более удобной системе, типа SVN.
Для нас соревнования проходили с 22.00 до 5.00. В хоге (два компьютерных класса в УрГУ на первом этаже) мы начали собираться с 16.00. Сделали все необходимые приготовления и отправились в магазин за едой. Когда вернулись, до игры оставалось 30 мин. Сели и стали наблюдать, что происходит на irc канале.
Мы готовы, начинаем.
Практически вовремя, в 22.00 на irc канале появился ключ к расшифровке образа, и я тут же начал его расшифровывать. Как всегда забыл, что по умолчанию утилита gnupg расшифрованное сообщение выводит на консоль, поэтому пришлось один компьютер перезагрузить :) На втором подобной ошибки уже не допустил. Расшифровав и запустив образ, обнаружил, что будем играть на Ubuntu. Быстренько сменив пароль для пользователя root, перезагрузился, поставил подбирать пароли для других пользователей, и все начали смотреть, что нам приготовили. На наше удивление сервисов оказалось 7, в то время как в правилах стояло ограничение на количество участников в команде: не более 5. Список сервисов:
5kr3wdr1v3r (бинарный)
tagging (Perl)
gabble (C)
ghoSTFTP (PostScript)
rapid graffiti(PHP, MySQL)
myspray (Python)
brook3 (Haskell)
Каждый взял себе по одному сервису, а два оставили на потом.
Первый час игры сети команд изолированы – это время дается для подготовки. За это время мы успели прикрыть несколько уязвимостей, как в сервисах, так и в самой системе. Написали несколько уведомлений (aka advisories), но ничего за них не получили: были не первые.
Первые несколько часов были поистине тяжелыми. У нас практически ничего не получалось, и ряд ошибок, которые мы совершали, не добавляли уверенности. Сначала мы упустили шанс повесить нескольким командам бэкдоры (чертов ctrl+c :), затем я написал несколько уведомлений до того, как сам использовал найденную уязвимость. С некоторыми сервисами просто тупо ничего не получалось. Примерно через час после открытия шлюза нам кто-то завалил игровой образ, пришлось перезагрузиться. Весь этот период мы находились примерно в середине турнирной таблице, рядом с нами постоянно была команда Scythian, то выше на пару позиций, то ниже. Остальные русские команды были ниже нас. За все это время мы не получили ни одного флага с других команд, держались только на уведомлениях и хорошей защите.
Ага, вот эти ребята
Такая ситуация нам в корне не нравилась, можно понять :). И тут началось... Сначала я таки научился доставать флаги через сервис rapid graffiti, но они были в картинках, и, вспомнив про Breaking Da CAPTCHA, попросил kost'a написать распознавалку: руками вводить флаги было утомительно. Так и поступили, а свой сервис (gabble) kost передал Dimmo. Не прошло и 20 минут, как Dimmo уже писал эксплоит для него. Так как у нас было ещё два сервиса, за которыми никто не следил, я решил их немного пропатчить. Почитал уведомления других команды по этим сервисам и воспользовался их советами. Сервисом tagging занимался Last_G, к текущему моменту он научился его методично опускать т.е. DoS. Настроение команды немного улучшилось. Повеселил VenROCK: поймав эксплоит на свой сервис ghoSTFTP от другой команды, разобрался в нем, пропатчился и отправил уведомление, включив в отчет этот эксплоит. За это уведомление мы получили 4 балла из 5 :) Играть стало веселей!
Надо было торопиться, до конца игры оставалось примерно два с половиной часа. Первый флаг мы достали по истечению третьего часа игры, в то время как лидеры начали забирать флаги с других команд примерно через полтора часа после начала. На удивление эксплоит dimmo для сервиса Gabble давал отличные результаты, по количеству захватываемых флагов мы были на уровне лидеров. Так как мы были на первом месте по защите и имели хороший результат по уведомлениям, мы начали двигаться, медленно, но уверенно, вверх по турнирной таблице. Оставалось только надеяться, что уязвимость, через которую мы захватывали флаги, не прикроют :) Ещё через полчаса мы научились у некоторых команд захватывать флаги с сервиса ghoSTFTP, хотя и не в большом количестве. За полчаса до конца игры мы вышли на второе место, перед нами была teamSparta – прошлогодние победители. Времени оставалось мало, и ничего особенного не меняли, новые эксплоиты не писали, старались поднажать на уведомления. Разрыв в процентном соотношении от первого места составлял примерно 10%, и нам казалось это недосягаемым. kost в это время усилено что-то дописывал! За 15 минут до конца выяснилось, что он научился распознавать флаги в картинках, но программа частенько сваливалась в exception. За 10 минут до конца игры мы решили быстро написать последние уведомления. Last_G про tagging, dimmo вместе с venrock написали на gabble, а мы с kost'ом на rapid graffiti.
Победа!!!
Строго по расписанию на канале появляется сообщение от организатора:
[05:00] <@[RWTH]Lexi> GAME OVER
В турнирной таблице положение не поменялось, на первом месте teamSparta (100%), на втором мы (92%) и на третем ENOFLAG (88%). Конец игры. Все поздравили teamSparta с победой, затем организаторов за чудесную игру и как обычно начали обмениваться приятными впечатлениями, рисовать ascii графику, расспрашивать друг друга про сервисы и обнаруженные у себя бэкдоры. Мы же ждали, когда проверят наши уведомления, хотя и не особо на что-то надеялись: разрыв составлял 8%. И тут произошло то, чего мы не ожидали! Первым проверили уведомление Dimmo и VenRock'a, поставили 3 балла и разрыв от первого места сократился до 2%, а после проверки уведомления kost'a мы получили 5 баллов и вышли на первое место!!!
В этом году CIPHER очень порадовал своей подготовкой и квалификацией организаторов. Все сервисы были на высоте, а игра прошла без серьезных сбоев. Хочу поблагодарить все принявшие участие команды, играть с Вами сплошное удовольствие! До встречи, тру хакеры :)