Да, да, да, мы ПОБЕДИЛИ !!!
26 ноября в г.Челябинск прошел ответный матч между нашей командой и сборной г. Челябинска, в которую входили студенты и аспиранты университетов ЧелГУ и ЮУрГУ. После пяти часов увлекательного боя команда «ХакерДом" одержала победу со счетом 12:16 и с большой радостью отдала хозяевам соревнований переходящее знамя (см. ниже) :)
В игре проверяются способности специалистов защитить сложную незнакомую систему с сохранением необходимой функциональности. Задача, с которой сталкиваются участники, сходна с реальной работой консультанта по информационной безопасности в новой организации. Необходимость защищать свой сервер и в то же время исследовать, атаковать и размещать свои влаги на чужих серверах делает соревнование более динамичным и зрелищным.
В игре участвуют две команды по 6 человек в каждой. В начале игры, каждой команде выдаётся сервер, на котором установлена ОС Linux с некоторым набором сервисов и приложений. Помимо этого на образе будут размещены исходные тексты всех работающих сервисов и приложений. Команды получают идентичные друг другу образы за исключением информации об IP адресе, DNS имени и учетных записей пользователей. В ходе игры жюри будет размещать на серверах команд некоторую информацию (флаги) и проверяет их доступность. Задачей обеих команд – обнаружить как можно большее количество флагов противника, при этом не давая обнаружить свои. За найденные флаги команда получает баллы. Если по каким-либо причинам жюри не сможет установить очередной флаг или проверить уже установленный, то команде будут начислены штрафные баллы. Команда победитель определяется путем подсчета баллов по окончанию игры, победителем считается та команда, которая будет иметь большее количество баллов.
1. Общая длительность игры 5 часов.
2. Первые 30 минут сегменты команд отключены друг от друга и жюри не производит проверку сервисов.
3. Проверка каждого сервиса и флага производится не реже, чем раз в час.
4. Набор сервисов из которых будет производиться выбор: echo, discard, daytime, chargen, FTP, Telnetd, Web, DNS, Fingerprint, SMTP, POP3.
1. Запрещено проводить DoS атаки на канал связи.
2. В каждой команде принимает участие 6 человек.
3. Каждой команде предоставляется 6 ПК, которые могут быть настроены командами по их усмотрению за день до соревнований.
4. На каждом компьютере имеется в наличии CD-ROM или DVD-ROM и порт USB.
5. В ходе соревнований запрещено получать доступ к другим сетям (например, Internet) и пользоваться устройствами связи (телефон, пейджер и т.д.) В случае нарушения этих ограничений жюри принимает решение о наказании команды в виде начисления штрафных баллов или дисквалификации команды.
6. Команды могут приносить с собой дополнительное сетевое оборудование: кабеля для разводки сети, коннекторы, концентраторы и/или коммутаторы не выше 2-го уровня. Строго запрещается подключение своего сетевого оборудования к локальной сети, и количество компьютеров, непосредственно принимающих участие в игре (т.е. подключенных к сети), ограничено 6. В случае нарушения этих ограничений жюри принимает решение о наказании команды в виде начисления штрафных баллов или дисквалификации команды.
7. Командам разрешается приносить с собой любое программное обеспечение.
1. Настраивает сетевые устройства в соответствии со схемой сети.
2. Готовит набор сервисов с уязвимостями в исходном коде или пишет собственные сервисы с типовыми уязвимостями.
3. Заранее готовит защищенные станции жюри, которые будут производить проверку серверов и подсчет баллов.
4. Устанавливать флаги на серверах команд.
5. Периодически проверяет работу сервисов и доступность установленных флагов. В случае недоступности сервисов или флагов начисляются штрафные баллы.
6. Производит подсчет баллов.
7. Следит за соблюдением командами правил соревнований, и в случае нарушений принимает меры к их устранению.
8. Перед началом соревнований выдаёт командам необходимую информацию: список сервисов и web-приложений, установленных на сервере, в которых возможно размещение флагов; имена пользователей и пароли, необходимые для работы с сервером.
9. Жюри занимает открытую позицию. После окончания соревнований, по желанию команд, жюри должно выдать любые имеющиеся логи, рассказать о мотивах принимаемых решений и т.д.
1. Соблюдать правила соревнований.
1. Флаг – некоторая информация, которую жюри размещается на серверах команд. За обнаружение флага командой противника им начисляются баллы. Помимо этого, флагом может выступать некоторое задание, за выполнение которого команда так же получает очки в соответствии с системой начисление баллов.
2. Флаги, сданные командой противника, перестают участвовать в проверках.
3. Непосредственно после установки флага жюри сообщает противоположной команде информацию, позволяющую идентифицировать флаг либо задание, которое необходимо выполнить. Также жюри может сообщать любую другую дополнительную информацию о флагах.
4. Флаги действительны до окончания соревнований.
1. За сообщение флага противника либо выполнение задания, предусмотренного жюри, команда получает 6 баллов.
2. Если в ходе проверки флага выяснилось, что он не доступен, то команда противника получает 2 балла за каждую неудачную проверку, при этом жюри сообщает команде, что флаг недоступен, не сообщая какой именно. Повторная проверка производится не ранее чем через 5 минут после сообщения.
3. В случае невозможности установки нового флага (1-я попытка), команда противника получает 1 балл, при этом жюри сообщает команде, какой именно сервис недоступен. На исправление ошибки команде дается 5 мин., если по окончание этого периода времени по прежнему невозможно разместить флаг (2-я попытка), то команда противника получает 2 балла, и снова на исправление даётся 5 мин., если по окончание этого периода времени по прежнему невозможно разместить флаг (3-я попытка), то команда противника получает 4 балла и флаг более не участвует в игре. (Итого, за невозможность установить флаг команда соперника получает 7 баллов.)
4. Если команда нарушает правила, команде противника назначаются баллы. Количество штрафных баллов зависит от тяжести нарушения, и начисляется жюри (от 1 до 10 баллов). Команде противника начисляется округлённое до целого среднее арифметическое баллов, поставленных каждым из членов жюри.
5. Если при установке флага или проверке на доступность флага он оказывается недоступным, жюри ждёт 1 мин., после чего производит повторную попытку. При этом не начисляются штрафные баллы, и команде не сообщается о недоступности флага (даётся время на перезагрузку сервиса).

На данной картинке монитор сегмента необходимо заменить станцией жюри, с которой будет производиться вся установка и проверка флагов на сервере противоположной команды.
1. Каждой команде выделяется сеть класса С. Например для команды А это будет сеть 192.168.1.0/24, и для команды Б это будет сеть 192.168.2.0/24. Кроме того сеть класса С выделяется для нужд жюри. Например, 192.168.3.0/24.
2. При обращении к серверам команд запросы отправляются на адреса 192.168.х.1., внутренние интерфейсы на маршрутизаторе имеют адреса 192.168.х.254, а компьютеры жюри 192.168.х.253. Адреса из диапазона 2–252 команды могут использовать по своему усмотрению.
3. Провода из физических сегментов команд подсоединяются к маршрутизатору с поддержкой NAT. Маршрутизатор будет настроен таким образом, что все IP-пакеты идущие через его интерфейсы в сеть другой команды отправляются через NAT с IP-адреса исходящего интерфейса. Например, все соединения в сеть команды 192.168.1.0/24, исходящие от 192.168.2.0/24 и 192.168.3.0/24 через интерфейсы 192.168.x.254 маршрутизатора при выходе с интерфейса должны иметь IP адрес отправителя 192.168.1.254, т.е. обеспечивается NAT на выходе из маршрутизатора в сторону сети команды.
4. Так же на маршрутизаторе настроен FireWall, пропускающий пакеты только на IP адрес 192.168.х.1. Помимо этого, маршрутизатор занимается ведение логов передаваемого трафика.
Начать можно с того, что прошлую игру, которая проходила 17.05.06 в г. Екатеринбурге в стенах родного нам УрГУ, мы проиграли сборной команде из г. Челябинска, причем с очень неприличным счетом 6:20. В команду входили студенты и аспиранты УрГУ, УПИ и ИММ. Вспоминаю тренировки до первого боя и могу сказать, что ничего не вспоминается. Так, каждый занимался чем хотел, даже не в полную силу, много разговаривали и постоянно о чем-то думали. После поражения мы полностью поменяли свое отношение к соревнованиям и подготовке к ним. Я бы даже сказал, что это поражение пошло нам на пользу, и я не знаю, как все обернулось бы для нас, если бы мы победили. Не всегда проигрыш является катастрофой, как выяснилось, намного важнее сделать правильные выводы.
Подготовку к матчу-реваншу мы начали сразу после сессии, без дополнительного перерыва. Договорились, что ответный бой будет проходить в середине осени в г. Челябинск, в ЧелГУ. После первого боя к нам примкнули второкурсники (на то время, ещё первокурсники) и, что самое интересное, все из одной группы, КБ-101 (у нас
никогда не было и не будет ограничения по курсам, специальностям и прочему). С их приходом состав команды намного расширился, единственная проблема состояла в том, что практически никто из них не знал работу сети, веб сервера, не умели работать с UNIX-like системами и даже не слышали о виртуальных машинах, на которых можно запускать различные ОС (все это изучается на последующих курсах). Поэтому первым делом необходимо было начитать им этот материал. Целый месяц весь основной состав показывал и рассказывал второкурсникам основы работы веб серверов, UNIX систем, виртуальных машин, сетей и протоколов IP, TCP, HTTP. Основной упор делался на веб технологии, потому как мы готовились к матчу-реваншу, на тех же условиях и правилах.
Прошлая игра проходила только на Web, было два рабочих виртуальных хоста (и три нерабочих, не успели настроить), на которых стояли различные Web приложения с заранее встроенными уязвимостями. И мы готовились, что в ответном бою будет нечто подобное. Играем мы по международным правилам Capture The Flag. Коротко, каждая команда получает во владение сервер, обычно это VMWare образ UNIX-like системы, который она должна защищать и при этом атаковать сервера других команд, на которых размещены флаги. За каждый обнаруженный флаг команда получает баллы. Нетрудно догадаться, выигрывает та команда, которая на конец игры заработала больше всех баллов. Подробней об этих соревнованиях можно почитать на wikipedia или посмотреть ссылки и другие отчеты у нас на сайте: www.hackerdom.ru. В первую игру мы не нашли ни одного флага – это был ужасно. 6 очков мы заработали за то, что у ребят из Челябинска были какие-то проблемы с сервисами, за что им, в соответствии с правилами, начислили штрафные очки. При этом один флаг был в открытом доступе – просто был опубликован на форуме, и как мы его не нашли – до сих пор не понимаю?!
Тренировки у нас проходили по 2-а раза в неделю, прямо в УрГУ, на протяжении всего лета, это не редко, но и не сильно часто. Было время позаниматься и другими делами. Для тех, кто готовится или захочет поучаствовать в каких-нибудь соревнованиях, могу сказать, что организовать и построить хороший план тренировок – это одно из важнейших мероприятий. Только на общих тренировках из группы людей можно сделать команду, где каждый четко знает свое дело. На них мы в основном обменивались своими достижениями, задавали вопросы друг другу, которые возникали по ходу изучения материала, и тренировались. График у нас был такой:
Понедельник:
с 17.00 по 18.00 – общие вопросы
с 18.00 по 18.50 – доклад об уязвимости или какой-нибудь технологии
с 19.00 по 20.30 – тренировка (использовать заранее известную уязвимость или найти уязвимость, закрепиться, получить как можно больше информации о системе…)
с 20.40 по 21.00 – разбор полетов
Четверг:
с 17.00 по 18.00 – общие вопросы
с 18.10 по 20.10 – главная тренировка с backdoor.
С 20.30 по 21.00 – разбор полетов
Помимо изучения новых технологий вся команда учила веб уязвимости, и на тренировках мы учились их использовать. Кто-то уже умел их хорошо использовать, а кто-то только начинал учиться. Когда второкурсники хотели к нам присоединиться, главный их страх был в том, что они ничего не умеют. Но дело не в том, умеет человек в команде что-то или нет, главное – иметь желание этому научиться, а остальное придет. Желание победить было у всей команды, и притом – огромное, поэтому темпы изучения были очень быстрыми. Помнится, kost, сказал – «…я сейчас занимаюсь больше, чем во время учебы в Универе». Хотя программа обучения в УрГУ на мат-мехе (особенно на КБ – Компьютерной Безопасности) довольно мощная! Помню, после первой тренировки, когда я aka ilya и Коля Журавлев aka znick рассказали второкурсникам про HTTP, VMWare, немного о сетях и сказали что к концу лета все это надо будет не просто знать, а ещё и уметь взламывать, ilya посмотрел на znick-а и спросил – как думаешь, они на следующую тренировку придут? На что znick ответил – не знаю, боюсь, что половина не придет – испугаются. Но этой догадке не суждено было сбыться, на следующую тренировку пришли все, что не могло не порадовать! Саму тренировку у нас постоянно готовили 2 человека, я и znick. Но было бы гораздо лучше, если бы мы постоянно менялись с остальными участниками команды. Для более четкого понимания, где нужно искать уязвимости на сервере, хорошо бы их поделать самому. В последний месяц у нас немного получилось организовать такую схему. Всем очень понравилось, особенно kost'у! После того как пару раз встроишь бэкдор – по-другому начинаешь смотреть на код программы.
В игре нет время на раздумья, любая найденная уязвимость должны быть закрыта и использована на сервере чужой команды за максимально короткое время. И использование собственных утилит может сильно помочь в игре. В первом матче мы не обнаружили флаг в открытом доступе и чтобы такого не допустить в ответном и не тратить время на обзор всех сервисов в поисках флага, Дима Симонов aka DimmoBorgir, один из второкурсников, написал утилиту – net-grep, которая по заданной маске бегала по всему сайту и искала флаги. Небольшая, но очень эффективная утилита. Серегй Борисов aka Rainman написал программу для быстрого поиска подозрительных мест в PHP коде. Это анализатор кода на Perl, она не находит логичеких бомб, но она довольно хорошо и главное быстро позволяет узнать, где и какие переменные плохо фильтруются. Эта утилита позволяла нам быстро обнаружить SQL injection и PHP injection. Ещё одной программой для поиска уязвимостей была new-diff, написал её второкурсник Константин Плотников aka kost, она сравнивает исходные файлы на PHP. В отличие от обычного diff, она сравнивает не строки, идущие друг за другом, а функции, это было сделано на тот случай, если вдруг жюри решит переставить описание некоторых функций местами. Пока в наших играх используется сторонний софт, и подобная программа могла очень сильно помочь в поисках уязвимостей. Использовать самописный софт пока не было возможности, количество людей, участвующих в организации очень маленькое. Но на следующие соревнования, которые будут проходить в начале этой весны, мы планируем написать все приложения сами. Вообще говоря, в России подобные мероприятия слабо развиты. И многие шокируются, когда узнают, что эти игры проходят в университетской среде, хотя сам «Hack» как раз и зародился там. Недавно, в начале декабря (08.12.06) проходили международные соревнования iCTF, где принимали участие различные институты и университеты со всего мира. Хотя это никак не отслеживалось, но при подаче заявки команда должна обязательно указать, от какого учебного заведения она выступает. Т.е. там ко всему этому вполне нормальное отношение, «hack» как вырос, так и остался в университетской среде. Сама игра была фантастически интересной, захватывающей, подробней об этом соревнование можно так же почитать у нас на сайте www hackerdom.ru.
Самые интересные вещи начали происходить за месяц до игры. Вдруг выяснятся, что челябинцы готовились играть на всем сервере, в то время как мы – только на Web. Это был шок для нас, особенно для второкурсников. Виной всему было банальное недоразумение с обеих сторон после первого боя. Но после недлительных переговоров и взаимных уступок мы договорились, что игра будет проходить на полном сервере, практически без ограничений. До игры оставался ровно месяц. За этот месяц вся команда освоила работу основных сервисов, FTP, POP3, SMTP и простых TCP сервисов. А в связи с этим, необходимо было быстро учиться переполнять буфер, так как жюри наверняка бы встроила пару подобных уязвимостей. Изучением этой атаки у нас занялись DimmoBorgir и Дмитрий Корнев aka VenROCK. Они научились довольно лихо делать простые переполнения и занимались подготовкой софта и написанием готовых шелкодов. И вот тут я не могу не вспомнить о противостоянии администраторов и взломщиков. Администрированием у нас занимается Дмитрий Шеврин aka Archangel, он ответственный за защиту сервера и всегда в курсе всех наших методов проводимых атак и наоборот. Так вот, как только он узнает, как можно провести очередную атаку, он тут же начинает искать способы защиты и когда находит, рассказывает остальным. И это было очень здорово – методы атак и защит совершенствовались с каждым днем (нередко и с каждой ночью). Вот небольшой пример: первый шелкод, который написали DimmoBorgir и VenROCK открывал шел на определенном порту, но от этого быстро отказались, потому как первым делом на сервере другая команда скорее всего настроит firewall. Следующим ходом, как это и принято делать, создавалось обратное соединение – backconnect на машину атакующего, на что archangel заявил, что тогда он будет фильтровать и исходящие соединения. По идее, на сервере вообще не должно быть исходящих соединений за исключением FTP, но его можно перевести в активный режим и разрешить исходящие соединения с 20 TCP порта. Оставался единственный способ – открывать shell, используя уже установленное соединение (то, которое было установлено для работы с сервисом). И этот способ был освоен за день до боя! То, что было написано на лице у админа, нельзя выразить словами – это надо было только видеть :). Я не думаю, что мы пионеры в этом деле, но в книге по Shellcoding сказано – очень хотелось бы так сделать, но пока неизвестно как. Надо покопаться в Интернете, неужели действительно это малоизвестный факт?! Если это так и окажется, я думаю, в скором времени VenROCK и DimmoBorgir расскажут, как это делать.
Также, работая с сервисами, мы поняли, что далеко не все имеют хорошее логирование и что нам понадобится программа, которая бы по трафику отслеживала и в удобном для анализа виде показывала, что там происходит. К сожалению, такая мысль пришла всего за неделю до отъезда. Но как это обычно и бывает, чем меньше времени, тем продуктивней идет работа! За неделю Артем Зиненко aka ArtZin и Кирилл Шилиманов aka Mawile написали такой сниффер на Perl-е. Очень простой и в настройке, и в работе, а в игре это очень важные качества для программы. Как потом оказалось, эта программа сыграла решающую роль в игре.
Выехали в г. Челябинск мы за 2-а дня до боя, в пятницу. Прибыли на место днем, как раз к обеду. Погода по приезду была отличной. Сам город отличается от г. Екатеринбурга широкими и длинными проспектами, а ещё там намного чище. Но больше всего удивили водители и пешеходы. Светофоры точно придуманы не для них – машины едут на любой свет, точно так же поступают и пешеходы. А учитывая то, насколько широкие там улицы, перейди дорогу без происшествий – маленький праздник! Гостей города и туристов видно сразу: в то время, пока все занимались переходом дороги, мы небольшой кучкой стояли у тротуара и ждали зеленого света.
Поселились в общежитие, пообедали в столовой общежития и отправились в ЧелГУ на семинар. Сам университет располагался в 10 мин. ходьбы от общежития, очень удобно. Столовая тоже была вполне приличной: салатики, суп, второе, очень даже хорошо.
Уже стало традицией, что помимо боя, гости ещё и выступают на семинарах с различными докладами. В тот раз челябинцы выступали у нас, в этот раз – мы у них. В пятницу должен был читать доклад znick, что-то о raw sockets в Perl-е под Windows, точное название не помню. Семинар прошел хорошо, но отличие семинаров УрГУ и ЧелГУ было налицо. В УрГУ семинар – это общение аудитории с докладчиком. Докладчика можно перебить, если вопрос по теме, но лучше всего – поправить. В ЧелГУ все по другому, их семинар больше похож на лекцию, вопросы докладчику задаются в конце доклада. После окончания доклада мы отправились поужинать в хорошее кафе «Шоколадница». Макс Смолин указал нам туда дорогу – за что ему огромное спасибо! Я помню это кафе ещё с прошлого приезда, тот раз мне там понравилось и ведя туда всех, я надеялся, что и в этот раз кафе меня не разочарует. Меню там оказалось хорошее, вот только официант то ли издевался над нами, то ли он в серьез такой, не пойму. Когда у нас закончился чай, он вежливо подошел к нам и спросил, не хотим ли мы ещё чаю? На что вся команда ему ответила – хотим! Больше ничего не происходило, чая мы так и не увидели. Рассчитавшись за ужин, мы отправились домой, в общежитие. Как я уже сказал, погода была отличная, тепло, и на обратном пути мы душевно поиграли в снежки.
С собой у нас было всего 2-а ноутбука, и они постоянно были заняты. Сначала одни дописывают свои программы, потом другие. «Постоянно заняты» – это значит, что в то время пока кто-то спит – другой работает. В этот вечер Ольга Соломонова aka jackrabbit занималась просмотром PHP исходников, znick рисовал конфигурацию сети и обсуждалась тактика, а VenROCK c archangel’ом читали правила боя. Да, именно так, за два дня до боя. Так получилось, что конечные правила боя были полностью согласованы примерно за неделю до игры, и многие просто не успели их прочесть. Правила были хорошие, но уж слишком много запретов. Например, было оговорено, что у каждого участника команды по одному компьютеру, и больше подключать или использовать компьютеры в игре нельзя. И ещё несколько подобных запретов… Да, так то оно и понятно, это для нас были вторые соревнования, на международных или других подобных никто из нас до этого не принимал участие, и правила придумывали полностью с NULL. Посмотреть текст правил можно также у нас на сайте. Надеюсь, что следующие игры у нас пройдут по менее жестким правилам.
Отправились спать только около 2-х часов ночи.
На субботу у нас был запланирован ещё одни доклад, читал его VenROCK на тему «Breaking da CAPTCHA». Доклад был посвящен обходу антиботов. Дима выступил очень хорошо, всем понравилось. По итогам семестра он был на первом месте. На доклад не пошли только znick и jackrabbit, они остались в общежитии, освежая свои знания в PHP. Сразу после доклада, это было примерно в обед, к нам подошли znick и jackrabbit, и мы пошли в аудиторию, где должны были играть, и принялись настраивать свои компьютеры. Это делалось для того, чтобы не тратить время на установку во время игры. И так как это не наш родной класс, за день до игры мы полностью переделывали его под себя. Параллельно с нами жюри протягивали дополнительные кабели, чтобы сделать необходимую конфигурацию сети для боя, а челябинцы занималась настройкой своих рабочих мест. Короче говоря, все что-то делали. Занимаясь настройкой компьютеров, мы успевали еще фотографироваться. Настройка сводилась к тому, что мы установили удобные для нас ОС, весь необходимый софт, удобно организовали файловый архив и прочие приятные мелочи. VenROCK и archangel использовали Linux, а остальным и Windows был по душе. Программы для боя в основном были наши. Хотя пара сканеров не помешала бы, но мы их по какой-то невиданной причине забыли и не могли скачать. Закончилось все это мероприятие в 21.00, после этого мы отправились в общежитие дописывать программки.
В этот раз ноутбуки заняли VenROCK и DimmoBorgir, они дописывали shellcodes. А остальные обсуждали тактику и записывали на бумагу, что надо делать в начале игры. Судя по прошлой игре, это очень полезно, потому как в панике можно начать заниматься совсем не тем, чем надо. Не разговаривал только znick, он был в составе жюри, и в тот вечер ему не разрешалось разговаривать. Вообще, он себя очень классно проявил в жюри, за все время он не дал нам ни одного намека – гад! :). Игра была назначена на 15.00, спать снова отправились примерно в два часа ночи. Только оба Димы писали shellcodes до 5 утра.
Хорошо в бою срабатывает лишь то, что на автомате заучил во время тренировок и это очень важно, особенно в начале боя!
Первыми проснулись я и archangel, мы взяли ноутбуки у VenROCK’a и Dimmo и пошли на кухню работать. Дима доделывал ядра и grsecurity, а я писал небольшие программы-ловушки на perl. Примерно в 11 часов поднялись остальные. Был воскресный солнечный день с хорошим морозом. Пообедав в нашей любимой столовой, мы отправились в ЧелГУ. По пути зашли в магазинчик и купили себе немного еды. А за день до этого договорились, чтобы у нас был чайник в комнате, вдруг кому-то захочется попить чаю или покушать.
Пришли мы немного раньше срока, а челябинцы уже полным ходом что-то делали у себя в аудитории. Мы спокойно зашли к себе в класс и начали неспешно размещаться. До официального начала игры ещё было много времени. Ближе к 15.00 появилось телевидение, было аж 3 канала и одна местная журналистка. Тут же стало понятно, что ровно в 15.00 игра не начнется. И даже в 16.00 игра не началась. После того, как у нас взяли интервью, нас попросили сделать фальшстарт, чтобы они могли заснять, как мы играем. Это не сложно, каждый изобразил на полминуты какую-то деятельность, и почему-то все предпочли сделать это в консоли. После этого все телевизионщики ушли, стало скучно, все было настроено, перепроверено, и когда начнется бой, никто не знал. Скучно не было только Dimmo и kost, они сели играть в quake3, при этом игру грузили с компьютера jackrabbit’a. Archangel и VenROCK тоже хотели поиграть, до тех пор, пока не осознали, что у них стоит Linux и что quake3 под Linux никто не брал :). Задержки – не такая уж и плохая штука! В 15.00 мы все сидели как на иголках, волновались, но после интервью и quake3 стало как-то спокойней. Если бы я был в жюри в следующей игре, я бы сделал небольшую задержку умышленно, мне кажется, что это помогает успокоиться и сосредоточиться командам на игре. После, когда мы играли на международных, они задержались примерно на 45 мин., и как я понял из общения – это обыденное дело. Вот только я не знаю, это специально они так сделали или действительно по техническим причинам ?! :)
В 17.00 в нашу комнату ввалилось жюри с сервером под мышкой, положила на него бумажку с заданиями и удалилось, сказав на прощание – время пошло. Я и archangel принялись подключать сервер, остальные читали выданные жюри задания. В этот раз принцип игры несколько отличался от обычного, сервер был натуральным, а не VMWare образ. Поэтому нельзя было так просто скопировать его на случай его краха. После этого archangel сел делать учетные записи для удаленного доступа к серверу, а остальные пока отдыхали. Когда доступ был сделан, первым делом все начали смотреть – что мы имеем. В итоге был Web сервер Apache+PHP+My SQL?, ещё один альтернативный веб сервер, FTP сервер, POP3 и telnet, discard, echo, chargen серверы. На веб сервере было установлено 3-и виртуальных хоста с 4-мя приложениями. На первых двух по одному приложению и на последнем были 2-е гостевые книги. В качестве задания необходимо было найти 5 флагов, стереть первую запись в одной гостевой книге и держать все перечисленные выше сервисы в рабочем состоянии.
После включения сервера все поднялось автоматически, кроме telnet и пары других простых сервисов, по началу мы не обратили на этого должного внимания, пока не через некоторое время не пришло жюри и не наградило нас штрафными баллами.
Ещё перед началом игры, почти каждый участник команды знал, за какой сервис он будет ответственен, kost и jackrabbit брали на себя весь веб, VenROCK и DimmoBorgir занимались проверкой FTP, POP3, Telnet и прочих сервисов. Я и archangel – занимались администрированием и общими делами. Лучше заранее распределиться, чем во время игры. Даже если бы конфигурация была несколько другой, мы имели план распределения игроков по сервисам.
В самом начале игры нам повезло, мы нашил пару небольших уязвимостей. Первая – это php файл, показывающий список директорий от корня, а другая была в одной из гостевых книг. Там пароли хранились в файле passwd.dat, что позволяло его просматривать, если обратиться напрямую. Вот только пароль хранился в виде MD5 хеша, и тут же вспомнилось, что мы ещё забыли. Да, да…у нас был только john, о rainbow таблицах мы как-то не подумали. Ну, ничего страшного, зато мы у себя быстро ликвидировали эти уязвимости. На первом виртуальном хосте стоял moodle, его мы пропустили, на втором был какой-то web downloader, за который взялся kost, а jackrabbit занялась сразу двумя гостевухами. А оказалось, что основные уязвимости были встроены в moodle, через который нас постоянно и атаковали на протяжении всей игры.
К концу первого часа VenROCK и Dimmo научились валить FTP сервер, jackrabbit нашла пару откровенных уязвимостей, и kost обнаружил какую-то странность у себя в приложение. Один кусок php кода был по непонятной причине зашифрован в бинарный вид. Kost его без труда расшифровал, посмотрел, не найдя ничего подозрительного, пошел дальше. Второй час прошел так же, были уязвимости, были патчи на них, не было только флагов. Некоторые найденные уязвимости мы не успевали использовать, челябинцы их закрывали у себя, а некоторые не могли – не получалось. К концу третьего часа archangel, сидевший справа от меня, вдруг толкнул меня в бок и указывал в монитор. Наш снифер, написанный Art Z? и Mawile, отловил попытку подключения на POP3 сервер. Попытка была неудачна. Archangel проверил, что к ним на POP3 можно войти под теми учетными данными, под которыми они пытались это сделать у нас. POP3 сервер использовал учетные данные из системы, а это значило, что и по ssh к ним можно войти под той же записью. Честно признаться, это нас очень сильно удивило, ведь ssh не было в списке поддерживаемых сервисов и почему он у них не был закрыт firewall – непонятно. Более того, этот пользователь был прописан в sudo с правами ALL! И мы осознали ещё одну вещь – мы не были готовы к root’у! У нас не было с собой никаких rootkit, что бы надежно засесть на системе, а валить и блокировать систему, не было желания, нам интересно поиграть. Первым решением было скопировать к себе всю необходимую информацию, пока нас не заметят. Через 20 мин. мы имели всю базу данных, все их исходники и файлы с паролями. Ещё через 10 мин. archangel’a выкинули, а моя sftp сессия почему-то была незамечена :). Я просидел ещё 30 мин., потом и меня выкинули. На тот момент их пароли уже были сменены, доступ закрыт. Но ничего страшного, мы имели у себя почти все необходимые данные для поиска флагов. Конечно, основной упор делался на SQL базу. И тут произошло самое невероятное, в SQL не оказалось ни одного флага!!! Протерев глаза, мы ещё раз просмотрели SQL и ничего не нашли. Такой результат нас несколько обескуражил. Прошло три с половиной часа, а у нас по-прежнему было 0 флагов. Только жюри захаживали раз в час с неприятными сообщениями, что у нас не доступен какой-нить сервис, хотя с нашей стороны все работало.
При обсуждении правил, почему-то была выбрана позиция, что в случае недоступности сервиса командам не сообщалось, какой именно сервис недоступен. Теперь я понимаю, какой это было ошибкой. Потому как потом, при разборе, выяснилось, что с нашей стороны у нас практически всегда работал moodle, а у жюри он постоянно был недоступен. Может наша ошибка была в чем-то, а может и нет?! Так до конца пока и не выяснили.
Параллельно со скачиванием с челябинского сервера различной информации наш снифер снова дал о себе знать, на этот раз он обнаружил странную POP3 команду, где в качестве параметра передавалось /etc/passwd. На этом мы ещё раз поймали челябинцев. Этот баг они нашли раньше нас, но практически не успели им насладиться, через пару минут он был ликвидирован. На этом все немного расслабились.
Archangel запустил grep по скаченным исходникам, jackrabbit время от времени посматривала на код kost’a, а остальные занимались своей работой. Через пару минут jackrabbit обнаружила, что если отправить 100 сообщений в гостевую книгу, то 101 перезапишет 1 и т.д. Весь недостаток был в том, что эта уязвимость была не в той гостевой книге. Всего было 2-е гостевухи, челябинцам надо было удалить сообщение из первой, а нам из второй. Уязвимость, которую нашла Ольга, была в первой. Но все равно – было приятно!
Наконец нам улыбнулась удача, archangel обнаружил флаг в одном из исходников. Когда мы его отправили на сервер жюри, выяснилось, что он не подходит. Мы ещё раз проверили выданную нам маску, сомнений быть не могло – это он. Тогда я пошел к жюри в комнату, что бы выяснить, что случилось, может система приема флагов дала сбой?! В ответ жюри оставила этот флаг не засчитанным, пока мы не покажем, как мы его достали. Мы согласились это сделать, но только в конце игры. И тут же, не прошло и 10 мин., как jackrabbit обнаружила у kost’a в коде флаг. Это как раз и был тот зашифрованный участок кода, где помимо php кода содержался ещё и флаг. А ещё через 20 минут, DimmoBorgir удивленно заявил, что его net-grep нашел флаг в открытом доступе, но где именно, сказать не может :). Таким образом, у нас было 2 флага и один под вопросом. На душе стало спокойней.
Надо заметить, что по правилам игры, обе команды не знают счет друг друга, боле того, они не знают даже свой собственный счет.
Примерно за час до конца игры мы начали замечать, что челябинцы к нам активно заливают php shell, мы их тут же стирали, сначала руками, потом надоело, и VenROCK написал для этого скрипт. Все это они делали через moodle, за который так никто и не взялся. Потом, на разборе полетов выяснилось, что где-то в этом время они у нас тоже скачали всю SQL базу и так же как и мы были очень удивленны не найдя там ни одного флага :). На исходе пятого часа игры сил уже ни у кого не было, перерыв мы так и не сделали. Последние полчаса все сидели из последних сил. Но это был ещё не конец. За последние полчаса kost запустил на сервере свою версию diff, чтобы сравнить исходные тексты, скачанные с сервера челябинцев, с нашими. Через 5 мин. сервер упал. Я не могу сказать точно, что это diff виноват, до этого мы проводили тестирование и никаких серьезных нарушений не замечали. В это же самое время, противоположная команда что-то творила с нашим MySQL, что тоже могло быть причиной краха сервера. К счастью, ничего страшного не произошло, мы просто перезагрузили сервер и все стало нормально. Напоследок, jackrabbit напомнила про уязвимость в гостевой книге, с сообщениями. Не долго думая, дружно решили, что писать программу, даже на perl, для флуда будет дольше, нежели мы это сделаем руками. Jackrabbit, kost и VenROCK тут же принялись набивать сообщения. Проверено, примерно за 2–3 мин. три человека могут набить 100 сообщений! Правда, отправив 101 сообщение, чудо не произошло. Как оказалось, мы вбили 100 сообщений не в ту гостевую книгу. Зато посмеялись. Повторять опыт с другой гостевой книгой уже никто не хотел, до конца оставались считанные минуты.
Ровно в 22.00 сегменты обеих команд были отключены, игра закончилась. Награждения и разбор полетов решили провести в нашей аудитории, она была больше всех остальных. Разбор игры – это одно из обязательных условий в наших соревнованиях. После игры команды и жюри рассказывают об игре. Жюри сообщает, как был настроен сервер и где хранились флаги, а команды рассказывают друг другу об используемых утилитах, как искали уязвимости и проводили взлом. Ничто не остается в тени, любое достижение становится открытым. Мы считаем, что информация должна быть доступна всем, без секретов, именно с этой целью проводится разбор полетов после каждой игры.
Сначала вошли челябинцы, за ними жюри. Вид у челябинцев был довольно спокоен, даже где-то веселый. А мы от неизвестности сидели и молчали. В пол голоса я от кого-то из челябинской команды услышал – поздравляю, но так и не понял, то ли они сами себе это говорили, то ли это было адресовано нам. А может, послышалось от усталости. Да и чего нас поздравлять? В нашем активе было всего 2-а флага и один под вопросом, правда, у нас сомнений не было, это был нормальный флаг. Итого, 3 из 6 возможных, вдобавок, было много штрафных баллов за недоступность сервисов, так что повод для беспокойства был. В прошлой игре челябинцы нашли все 4 флага, а значит – могли и в этой.
Первым делом жюри решило провести разбор полетов. Начали с того, что рассказывали обо всех спрятанных флагах и способах, как их можно было получить. Оказалось, что в этой игре флаги были запрятаны так, что их ещё надо было постараться найти. Нам удалось найти 3 из 5, ещё один был спрятан где-то в бинарном файле, а последний…. а последний уже не помню где :). 6-м флагом было задание. Как оказалось – челябинцы выполнили задание! Мы, конечно, заметили это, когда у нас пропала запись, и восстановили её из архива, но было поздно, жюри успело заметить её отсутствие. Но самой неожиданной новостью для нас оказалось то, что челябинцы не нашли флага в открытом доступе! А в прошлый раз это сделали мы. Как видно, жизнь не лишена иронии.
Наконец-то дело подошло к результатам – сборная г. Челябинска 12 баллов, «HackerDom УрГУ» 16 баллов – мы победили, урааа!!! Вся команда была очень довольна, последние полгода мы только и мечтали, чтобы победить в ответном матче, и это случилось. После непродолжительного веселья позвонили остальным участникам команды, которые не поехали на игру, и объявили результаты. В качестве приза мы получили классные книги, как нетрудно догадаться, все по компьютерной тематике, начиная от администрирования и заканчивая написанием шел кодов. После этого нам пришлось очень быстро возвращаться в общежитие, так как пускали туда только до 23.00, там мы и праздновали свою победу :).
На следующий день, ранним утром мы отправились домой. На улице стоял мороз. В обед нам надо было быть уже дома, в УрГУ, потому что это был понедельник, а по понедельникам у нас проходят семинары «секреты ХакерДом». По стечению обстоятельств, докладчиком был archangel, и на обратном пути он повторял материал. Подготовится к игре и тут же доложить на семинаре – это много стоит! Половина обратной дороги была просто ужасна, автобус был холодным, и ничего не оставалось делать, как попытаться заснуть. Правда, потом стало лучше, на половине дороги сел другой водитель и затопил печку, но все ещё было холодно. По приезду в г. Екатеринбург мы почти всей командой отправились в УрГУ на мат-мех. На стене мы увидели плакат с поздравлениями, а после этого спустились в хогвартс поиграть в quake3, до семинара оставался час.
Репортаж Челябинской ГТРК о соревнованиях.