Новости Обзорный отчет NanoBears по игре RuCTF 2009 Quals

Progressor
, 5 марта 2009

Итак, в этом году мы заявились на RuCTF двумя командами, SiBears и NanoBears. Я был в NanoBears и сейчас расскажу, как мы, собственно, играли.

Перед игрой мы традиционно подкрепились в Чинаре. Потом все вместе завалились в 203, до начала отборочных было еще некоторое время. Примерно за полчаса до игры мы пошли к себе в 430. Пришли, настраиваем там все, предвкушаем. Не успеваем как обычно в мелочах. Тут очень кстати приходит письмо от организаторов о переносе игры на полчаса. И вот час икс настал. Открылся доступ к скорборду, таскам и новостям. Забегая вперед, скажу, что в новостях за всю игру я увидел только две новости: "Игра началась!" и "Новости тоже работают!". А в таблице с тасками было несколько колонок. Сначала доступны только первые задания во всех колонках. Потом, когда любая из команд отправляет правильный ответ на какой-либо таск, открывается следующий таск в соответствующей колонке.

Роль админа в нашей команде исполняет Леха. Для админов была отдельная колоночка с заданиями. Еще были задания historical, главным образом сводящиеся к поиску в гугле. Эти поисковые задания все команды сделали в первую очередь. Второй такой ненапряжной колонкой был joy - сфотографироваться командой, снять клип, сценку, придумать рекламу и нарисовать веб-страничку про команду. Таким образом, все заинтересованные команды могли спокойно набрать 3000 за historical и joy.

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

В общем, в пятницу в универе за первые полтора часа игры мы решили многое или все из historical, и вроде бы подняли впн (задание для админов). Вовка расковырял первое задание на реверсинг, ему оставалось написать какую-нибудь примитивную брутилку для получения ответа. Около десяти вечера мы свернулись и пошли по домам спать.

Но спать мне не позволила совесть и азарт. Вовка ночевал у меня, мы намеревались что-нибудь порешать, но, к сожалению, наш капитан и по совместительству реверсер заболел уже тогда (и потом всю субботу он пролежал с высокой температурой). Он наскоро описал мне, для чего нужна брутилка, я ее написал, очень примитивную, но выдавшую мне на-гора дофигааа ответов - qqmz, qqqD и много-много других. Так я первый раз отправил правильный ответ и получил 100 баллов:) После этого я взялся за дамп - по легенде представлен дамп трафика провайдера и сказано, что кто-то распространяет вирусы. Надо было узнать ip распространителя и название вируса и - внимание! - отправить ответ в формате "ip:name". Пробежавшись по дампу, наткнулся на одну очень подозрительную фтп-сессию, в которой на сервер заливался файл с говорящим названием ructf.bin. Ну, первым делом я отправил ответ с именем вируса ructf.bin. Не проканало. Начал потихоньку накидывать прогу, чтобы склеить из пакетов сам файл... Но спустя некоторое время обнаружился совсем читерский способ - тупо скачать файл с того самого фтп))). Файл был скачан и успешно распознан моим McAfee. Отправляю ответ - не подходит... Лезу на viruslist.com, получаю довольно длинный список вариаций названий этого вируса, начинаю их все перебирать... Довольно быстро надоело. Почитал про вирус, он там при запуске выдает ложное сообщение об ошибке и еще выполняет специфические действия, если системная дата = 12 января. Запустил виртуалку, установил вирус:), перевел дату на 12 января, перезагрузился, получил табличку на итальянском от вируса... ничего интересного не получил. В итоге забил на это дело и перешел к другому заданию.

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

Костя в это время раскопал таск про удаленное с флэшки расписание. Решение крылось в файле Thumbs.db, в котором хранилась иконка удаленной картинки с расписанием. Иконка по размеру маленькая, но то, что там в расписании на выходных большими буквами было написано ЗООПАРК, разобрать можно было. Еще одно задание, которое ночью сдал Костя, - про цифровой водяной знак. Там была картинка и прога на дотнете, которая что-то творила (подписывала) с некоторыми пикселами на изображении. Легко и непринужденно получив исходный код этой проги:), Костя разобрал алгоритм и отправил ответ. Еще сто баллов.

И вот, около пяти часов утра, мы с ним переписываемся по поводу вируса в дампе. Он со своей стороны продолжил перебор названий. Потом от безнадеги предложил - а мож с кавычками отправить?.. Мы отмели это версию, но через несколько минут я таки отправил с кавычками и - о, блин - сработало. Потом, уже днем в субботу мы увидели письмо от организаторов про эти кавычки, но потерянные пять часов ночи это нам не вернуло=).

Еще ночью я поковырял картинку про пингвинчика. Всякие там слои, кривые уровней... Творил все, что находил в настройках фотошопа. В итоге получил какие-то довольно регулярные узоры - квадратики всякие. Ну получил и получил, а что с ними делать - не знаю. Забил.

В общем, ночь с пятницы на субботу была довольно результативна.

Эх, поскольку ключ был у меня, я должен был к девяти часам появиться в универе и открыть аудиторию... После трехчасового сна меня потом весь день колбасило.

В общем, на второй день мы остались без реверсера, но обрели веб-кодера - пришел Славка. Вместе с Лехой они выполняли админские задания, в которые я даже не вникал. Там надо было поднять почтовый сервер и страничку вики с некоторыми условиями. Вики поднялась влет, а с почтовиком они долго бились, в итоге добились. А я вернулся к картинке. Кто-то, увидев эти квадратики, сказал, что похоже это на двумерный штрих-код. Википедия нам в помощь - и вот она, статья про QR-код. Нашли сайт с декодером, вогнали туда картинку... - Decoding Failed! Гыгы, отправил это в качестве ответа, не прокатило:) побились еще несколько минут, в итоге даже Олег стал вручную убирать шум с картинки, пока мы другие таски решали... Отправили чистенькую картинку декодеру - облом... Скачали и установили на мой телефон прогу, считывающую QR-код - тоже ничего... И тут зоркий глаз заметил, что у нас изначально получилась инвертированная картинка - в гимпе порог не в ту сторону выставили. Хоп, инвертировали - тыдыщ! Телефон весело чирикнул и выдал текст про пингвинчика. Отправили, подошло. Прикольная штука, QR-код.

Посмотрели третье задание из раздела stegano... 143 байта и вопрос - кто получатель сообщения? Долго и безрезультатно помедитировали на эти 143 байта. Самый правдоподобный вариант - что это кусок сообщения с гпг-шифрованием. И что там где-то фингерпринт ключа. Леха что-то там пошаманил, поискал фингерпринт на кей-серверах - не получилось. Ну и забили.

Какая-то команда все-таки решила ЭТО и открылось еще более зловещее задание. Флеш с картинкой, какая-то лучистая звездочка на картинке-фоне. Про это у нас вразумительной версии не возникло.

Львиную долю субботы я убил на изучение проги на лиспе. Макс, наш алгоритмик и кодер, в субботу был на работе и помочь нам не мог. Почитывал я википедию потихонечку, вносил свои поправки в код - но после них прога выдавала некорректный результат :( А вообще, смысл задания был в том, что представленная прога на лиспе очень долго работала на представленных входных данных и нужно было это дело как-то ускорить. То бишь разобрать алгоритм и исправить/написать новую прогу. В общем, ничего у меня не получилсь, потому что, как выяснилось позже, я даже неправильно представлял себе оператор if в лиспе... Еще я потыкал задание админ400, там почему-то не расшифровывался образ. Позже выяснилось, что надо было заново скачать этот образ с сайта соревнований, он был изменен. Новый образ нормально расшифровался, но при запуске не пускал в загрузчик и ребутился каждые полминуты:) Оставили его на воскресенье.

На протяжении субботы я все порывался свалиться поспать, но дободрствовал-таки до вечера и, придя домой, честно упал лицом в подушку.

В воскресенье подошел в универ уже после 10 утра. Там сидели только Леха и Олег. Славка в воскресенье ушел на работу, но зато обещался прийти Макс. Макс пришел ближе к обеду и сходу решил задачку про лисп. Это оказался поиск подмножества минимальной суммы, причем самым неэффективным способом - перебором всех подмножеств. Переписал на сях, отправил, принес команде 200 баллов. А еще принес команде блинов и термос с чаем, что не менее ценно! Кстати, по поводу еды - обычно на игры - ну они, правда, все по ночам были, - мы затаривались едой очень хорошо, а в этот раз вообще практически без еды сидели...

В воскресенье еще открылась новая колонка заданий для сети, настроенной в админских заданиях. Первое и самое легкое задание мы протупили по полной:( Надо было узнать содержимое файла, доступ к которому был закрыт (кстати, 403 - Forbidden я тоже отправлял:))). В итоге, уже после игры, вечером, наша вторая команда (или первая?) поведала нам, что простой сканер уязвимостей выдавал там критическую дырку, через которую на сервер можно было заливать свои файлы... Второе задание из этой колонки - на sql-инъекции - решилось довольно быстро и приятно:) Третье задание - блог. Не помню, каким образом, но узнали, что есть доступ к папке includes. Поскольку было подозрение, что использована какая-то не самописная cms-ка, залезли туда, взяли названия папочек, вбили в гугл, и в итоге выяснили, что это blogme. Вбили запрос типа blogme vulnerability, получили кучу ссылок на то, что есть sql-инъекция в обработке комментариев к записям. А потом и исходники скачали:) Первоначальный план действий - через инъекцию добавить в таблицу _links новую запись - по заданию нужно было разместить свою ссылочку на главной странице блога. Но не получилось, а там уже и время кончилось.

В это время Макс писал свой первый в жизни шеллкод=) Причем на платформу амд64. Они сидели вместе с Костей и вылизывали код. В итоге все было сделано, до конца игры оставалось ровно пять минут. Перекинули шеллкод на машину с поднятым впн, с которой можно было запустить шеллкод. Счет пошел на секунды, первый вариант шеллкода вернул Stack is not corrupted, лихорадочное исправление каких-то байт, вторая попытка в напряженном ожидании... Тоже облом. Третья попытка - но тут время и вышло.

Леха залатывал образ с задания админ400. Там по системе была куча нехороших вещей раскидана – заменены файлы стандартных команд типа пинг, добавлены нехорошие строчки в rc.local и т.д. Видимо, не все он отыскал, ибо задание приниматься не хотелось:(

А еще с обеда воскресенья вернувшийся в строй Вовка и все остальные занимались придумыванием всяческих роликов/реклам/сценок и воплощением их в жизнь. Сначала сняли "клип на хакерскую песню" - Вовка нашел на просторах сети какую-то песенку - этакий шансон про хакеров. Под это дело был придуман сценарий про гопо-хакеров. В итоге получилось нечто весьма привлекательное)))) Монтажом занимался Олег и получилось у него это отлично=). Следующее развлекательное задание - сценка-отрывок про невесту программиста. Тут нам ничего оригинального не пришло в голову и мы сняли просто и незамысловато. Потом вечером мы увидели, как на этом задании отожгла вторая команда со своим театром теней)). Рекламу придумал Вовка - у него были фотки с прошлогодней нашей поездки на РуЦТФ и он делал презенташку в паверпоинте. Потом перегнали ее в видео. Кстати, скачали демо-версию проги для конвертации презентации в видео. Она честно предупредила, что разместит свой логотипчик в уголке. Ну и ладно, нам все равно не до этого. Перегнали - ага, эта зараза разместила здоровенный логотипище совсем не в углу и еще и гоняла его по экрану. Нафиг-нафиг, пришлось принять некоторые меры:) В итоге получилась довольно милая реклама очного тура РуЦТФ2009=) И завершающим аккордом развлекательного раздела стала веб-страничка про команду. Ее сделал Олег, статически, чистый хтмл. Еще воткнули туда закодированное QR-кодом название нашей команды. Тоже аккуратненькая такая красивенькая страничка получилась.

И вот так, с шутками и прибаутками, подошли мы к концу отборочных. Наша цель была пройти во второй тур обеими командами - цель достигнута, в конце апреля толпой из 14 (а мож и больше) человек едем в Екатеринбург! Ой-ой-ой, что там будееет... будет весело, это точно)).

Скажем дружно большое спасибо ребятам из УрГУ за отборочный тур и будем ждать личной встречи с ними!