Pull to refresh
149.66
Инфосистемы Джет
российская ИТ-компания

SITIS CTF: как тюлень помог CTF выиграть

Reading time 8 min
Views 6K


27 января 2019 года состоялось мероприятие SITIS CTF — соревнование по информационной безопасности для школьников и студентов техникумов. В турнире приняли участие около 80 молодых специалистов и один тюлень. Игра проводилась в офисе компании «Инфосистемы Джет», организатором заданий и технической площадки выступил молодой коллектив SITIS.


CTF


Формат мероприятия — task-based CTF (jeopardy), при котором игроки решают задания (таски) различного уровня сложности. Ответом может быть набор символов или произвольная фраза. За каждый правильный ответ (захват флага) участники получают определенное количество очков. Доступ к части тасков открывается только после решения предыдущих.


Участникам CTF-игры удалось решить почти все таски, но два из них так и не поддались: скорее всего, сказалась усталость — «ломали» таски и мозги юные хакеры и хакерши с утра и до вечера.


Задания


PPC


Цепь (200 очков)
Участникам был предоставлен набор пикселей, специальным образом переведённых в hex, среди которых была цепочка ключевых пикселей. Путем перевода hex в картинку можно было получить изображение с флагом.


Живопись (200 очков)
Участникам был предоставлен архив, содержащий около 1600 монохромных картинок с изображением цифр размером в 75 байт. Путь к получению флага — сложение чисел на картинках с использованием в качестве разделителей нулей и перевод полученного списка в строковое представление.


Которова (250 очков)
См. раздел «Врайтапы».


Музыка (300 очков)
См. раздел «Врайтапы».


REVERSE


Razminka (75 очков)
Участникам были необходимы начальные умения revers, пароль хранился в виде char-переменных в главном классе.


Моё творение! (250 очков)
См. раздел «Врайтапы».


CRYPTO


Странный сон (100 очков)
См. раздел «Врайтапы».


Hmmmmmmm (150 очков)
См. раздел «Врайтапы».


JOY


а (25 очков)
Участникам было необходимо найти флаг, написанный мелким шрифтом на одном из кадров в gif с котиками.


Снежинки (75 очков)
Участникам предоставили html-файл с обфусцированным javascript-кодом. Необходимо было из медленно падающих на странице символов составить флаг.


Flag Among Us (100 очков)
К заданию была прикреплена картинка.





Первым делом все бросились искать флаг в изображении. Покопавшись в нём и убедившись, что флага там нет, стоило вернуться к описанию и названию задания и еще раз внимательно прочитать их. Дело в том, что на самом соревновании, на дверях помещений, где проводилось мероприятие, были необычные наклейки с QR-кодами.





Собрав все части, можно было получить фразу HRGRH{9I3371M95_7i4e3o3i}. Здесь очевидно прослеживается флаг, но он зашифрован. За задание давали не так много баллов, поэтому было бы логичным, что шифр не должен быть сложным. Перебором основных вариантов можно было прийти к выводу, что здесь был Атбаш. Флаг SITIS{9R3371N95_7r4v3l3r}.


STEGO


Баг или фича? (50 очков)
К заданию был прикреплен текстовый документ, в котором, на первый взгляд, было только 2 строчки. Однако присмотревшись и выделив текст, можно было увидеть множество пробелов и табуляций на 39 строчек. Тем, кто уже сталкивался с таким, не должно было составить труда достать флаг.


Поэзия (75 очков)
Участникам была дана картинка с изображением кадра из фильма «Игра в имитацию». Нужно было найти оригинальную картинку и сравнить их, а из отличающихся пикселей составить новую картинку со стихами Байрона, чья фамилия и была флагом.


STORY


Добро пожаловать (50 очков)
Дроиды повсюду (100 очков)
Пора проветриться (105 очков)
Помощь лишней не бывает (125 очков)
Играть надо стагом (150 очков)
Первое полевое испытание (175 очков)
Веселье начинается p1 (200 очков)
Веселье начинается p2 (205 очков)
Final Boss (300 очков)


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


Завязка заключалась в предоставлении участникам архива с различными досье, но им необходимо было найти в метаинформации координаты. В подсказке было сказано, что у автора топографический кретинизм, поэтому нужно поменять местами широту и долготу и получить флаг в виде названия озера.


Во втором задании необходимо было найти в файловой системе файл с флагом. Там же была и ссылка, открывавшая доступ к 3 задаче. Далее флаг нужно было найти на сохраненной странице в веб-архиве. В следующих задачах участникам предстояло вычислить популярного хакера из видео на Youtube (флагом были его имя и фамилия), найти его аккаунт на каком-нибудь форуме «хакеров», где находились флаг и подсказка по взлому сайта. Затем необходимо было провести атаку на сайт CTfOS (найти в cookie md5 хеш-пароля и с помощью любого сервиса получить оригинал пароля, флагом являлась пара admin+пароль).


Далее нужно было подключиться по ssh, увидеть архив, скачать его по sftp, подобрать пароль, обнаружить, что вместо картинки внутри на самом деле был архив, и получить флаг. В конце давался номер порта «65530», необходимо было подобрать пароль (словарь rockyou), после чего отформатировать систему и предоставить доказательства организаторам.


SITIS


  1. INSTA (100 очков)
    Для успешного прохождения нужно было сделать пост в Instagram с фотографией CTF и тематическими хештегами.
  2. MINI-POLL (125 очков)
    В рамках задачи участники проходили мини-опрос.

Врайтапы


Приведем несколько разборов интересных заданий от участников CTF.




Которова




Которова, ударение на третью «о». Таск на 250 очков из 300 возможных. Игроку дается картинка (см. выше) и странный текст, состоящий из слов «Миу», «Мяу», «ФРР» и «Лик».



Путем визуального анализа картинки (и любознательности в прошлом) мы понимаем, что исходный текст есть не что иное, как язык COW с замененными операторами. Произведя следующие замены, можно получить «коровье» послание: Миу => MOo, Мяу => MoO, ФРР => OOO, Лик => Moo. Прогоняем полученный код через онлайн-интерпретатор и получаем заветный токен:






Странный сон…


Как ни странно, но идея данного таска действительно пришла в голову одному из организаторов после пробуждения одним холодным январским утром. Описание таска:


Мне тут приснился таск, проверь на решаемость пж :3

По названию и описанию несложно догадаться, что отсылка идет к Дмитрию Ивановичу, а именно Менделееву. Теперь посмотрим, что же у нас лежит в файле:


0x53 0x49 0x54 0x49 0x53 0x7b 0x6d 0x65 Mx3c 0x65 0x6c 0x65 0x65 Mx17 0x5f 0x65 Mx21 Mx27 0x5f Mx4b Mxf Mx39 Mx3a 0x6d 0x65 Mx7 Mx75 0x7d

Hex, но со странными префиксами «М» в некоторых местах.
Переводим HEX в ASCII и немедленно получаем, на первый взгляд, поломанный флаг:




Переведя в десятичную систему счисления только Hex с префиксом “M”, получаем следующую последовательность:


60 23 33 39 75 15 57 58 7 117

Вспоминаем про описание.




Совмещаем ASCIIнутый HEX с менделеевским и получаем флаг.




Музыка


О том, как перевести текст в ноты, мы задумывались довольно давно, и наконец идея была реализована:




Прежде всего было решено перевести текст в числовое представление, используя ord()
"awsm_msic "
Пробел вначале оставлен намеренно, чтобы последние биты не испортили последний символ.


ord():  [97, 119, 115, 109, 95, 109, 115, 105, 99, 32]

Затем перевести его в байты:


>>bin():  ['01100001', '01110111', '01110011', '01101101', '01011111', '01101101', '01110011', '01101001', '01100011', '00100000']

Провести конкатенацию:


concatenate:01100001011101110111001101101101010111110110110101110011011010010110001100100000

Разбить получившийся текст на символы по три (триплеты). Поскольку в диапазоне от 000 до 111 можно закодировать 8 чисел, мы будем использовать набор нот октав C5 и C6, состоящий из 8 нот:


['011', '000', '010', '111', '011', …]
["C5","D5","E5","F5","G5","A5","B5","C6"]

Осталось совсем чуть-чуть, переводим триплеты обратно в десятичную систему счисления и составляем новый список, опираясь на индексы нот:


['F5', 'C5', 'E5', 'C6', 'F5', 'A5', 'B5', 'F5', 'F5', 'F5', 'E5', 'A5', 'C6', 'A5', 'A5', 'A5', 'F5', 'G5', 'B5', 'B5', 'G5', 'A5', 'G5', 'F5', 'D5', 'C5']

Пишем MIDI-файл, при желании можно использовать любой инструмент для придания звучания нотам.






Reverse 250


В первую очередь мы дизассемблируем программу (при помощи IDA), преобразовываем в Си и ищем подозрительные строки:




Можно сделать вывод, что v39 — это флаг, который в состоянии «ложь» выдаст нам искомую строку.
Смотрим, где происходит изменение флага:




Смотря на этот код, сложно определить, с какими переменными мы должны произвести изменения, чтобы флаг декрементировался. Нажав дважды на переменную Buffer, мы попадаем в окно просмотра стека программы. Мы должны понимать, что Buffer — это строка (так как вводить в программу мы можем что угодно), а значит, зададим такой размер, чтобы все переменные var_xxx находились в ней:




Читать код стало намного легче:




Теперь рассмотрим блок изменения символов нашей строки.




Анализируем:


  1. v38 — сумма значений символьных переменных (по условию 1231).
  2. 7 элемент строки (Buffer_6) сдвигается на 7 бит, т.е. обратное преобразование совершить невозможно (какое бы число тут не преобразовывалось, в результате будет 0).
  3. Цикл с переменными v35, v41, v34 используется для отвлечения внимания (копирует значение одной строки в другую для сохранения правильного перевода из двоичной в шестнадцатеричную систему, так как исходную строку мы изменяем).
  4. Цикл с первыми тремя символами — простое умножение на 2.
  5. С четвертого по шестой — немного сложнее. Необходимо решить уравнение (для четвертого символа будет выглядеть так: (x*2)^57=95). Хоть XOR и необратимая операция, подобрать значение с помощью перебора вполне возможно, и, обладая даже начальными навыками, это можно выполнить за несколько секунд.
  6. Изменения закончились, возвращаемся к блоку условий и составляем несложные уравнения для оставшихся элементов.

Имеем (x — неизвестное, 0 — известное): 000000x00000x. Сумма значений = 1231. Отнимаем от этого числа известные и получим, что сумма неизвестных чисел = 164. Значит, берем любые два символа, сумма которых будет равна 164. Исходя из смысла первого слова, пусть это будет ‘R’ и ‘R’.




После введения ключа получим нашу искомую фразу.




Hmmmmm


При открытии таска получаем два файла: data.txt и Hmmmm.png:






Очевидно, что первая строчка в текстовом файле представляет собой некоторую кодировку. И действительно, это обыкновенный Base64, хоть и без свойственному ему в конце знака «=».


Раскодировав, видим цифры, подозрительно похожие на градусы:




Уже на этом моменте можно догадаться, что речь идет о некоторой решетке и угле ее наклона. Но где же сам трафарет? Конечно, у нас еще остались бинарный набор чисел, в которых подавляющее число 1 и всего 8 нулей.


Проверить гипотезу очень просто. Атом говорит, что у нас 256 символов. Как раз столько же, сколько в таблице на фото, причем из этого мы можем также догадаться, что решетка квадратная.




Наверно, удобнее всего использовать Excel для обрисовки сетки. Так и поступим.


Собственно, вот она:




Предположим, и не зря, что это данное положение решетки относительно 0 градусов. Тогда при помощи манипуляций в Excel или Photoshop выпишем цифры из окошек:




Что это могут быть за цифры? Шестнадцатеричная система… Hex, конечно!




Ура, мы на верном пути, осталось повертеть решетку и выписать остальные цифры:


Выходит, что искомая последовательность — в синих ячейках, то есть:


53 49 54 49 53 7b 43 61 72 64 61 6e 6f 5f 69 73 5f 70 72 6f 75 64 5f 6f 66 5f 79 6f 75 5f 21 7d



В результате получаем: SITIS{Cardano_is_proud_ofyou!}


Да-да, это всего-навсего решетка Кардано, предложенная им еще в 16 веке. Один из простейших криптографических алгоритмов.


Тем не менее, несмотря на кажущуюся простоту и очевидность таска, решить его смогла лишь одна команда — «10x», даже несмотря на такие вот хинты:





Участники


Участниками соревнований были как закаленные CTF'еры, так и новички.


1 место, MLPWN:


Моей команде цтф понравился. Что касается заданий, нам, как довольно опытной команде, было не очень сложно их решать, было заметно, что задания расчитаны на новичков, в них встречалась ни сколько идея сложного жестокого таска, сколько посыл заинтересовать, что очень круто. По поводу организации — все было на высшем уровне, что, если честно, не всегда встречается на школьных цтфах. Желаю удачи команде SITIS в организации следующих SITIS CTF!

2 место, 10x


3 место, Inview:


Это был мой первый выездной CTF, так как до этого участвовал только в CTF в пределах СПБ. Таски были довольно интересные и непростые, но единственная проблема из-за которой часто был простой — это падение интернета. Я с радостью приехал бы в следующем году и надеюсь, что SITIS CTF будет только улучшаться. Желаю организаторам успехов как в соревнованиях, так и в организации таких мероприятий.



Победителем стала команда MLPWN — My Little Pony (Pwnie).




Среди участников было довольно много девушек =)




Борьба была нешуточная, иногда требовалась помощь организаторов:




Организаторы


Организатор мероприятия — молодой коллектив SITIS. Партнерами CTF выступили компании «Инфосистемы Джет» (генеральный партнер SITIS CTF), Group-IB, «Элефус», БКС и ФГБУ НИИ «Восход».






Для тех, кто пришел за тюленем. Он был замечен в команде победителей. Я думаю, это был знак.


LV: расскажи пару слов про ваш маскот — тюленя =)

lithium: на самом деле это не совсем наш маскот c: Мы собрали эту команду относительно недавно, до этого все (ну почти все) были в разных командах или не имели команды вообще. Теодор был в команде SEAL, чьим маскотом и является тюлень. Его и притащил Теодор. Мы на самом деле ждали, что он принесет свою пони, которую выиграл в Сириусе как Pwnie Award)



Тюлень говорит: не будь тюленем, играй в CTF, качай свои навыки!


В публикации сохранены пунктуация и орфография участников CTF.

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+30
Comments 0
Comments Leave a comment

Articles

Information

Website
jet.su
Registered
Founded
1991
Employees
1,001–5,000 employees
Location
Россия