Hack You ’17 — разбор некоторых заданий

С 08.10.17 по 14.10.17 проходило CTF-соревнование Hack You '17, в котором я принимал участие. В этой статье я разберу несколько заданий с прошедшего события, поехали.

Web 10 - Palevo
Нам дана следующая ссылка: https://hy17-palevo.spb.ctf.su/. Пройдя по ней и посмотрев исходный код страницы, а также потыкавшись наугад, мы ничего особенного не находим. Время запустить какой-нибудь брутфорс веб-директорий, например, DIRB. Через некоторое время он обнаруживает путь /server-status, свидетельствующий о том, что на сервере включен mod_status.


Переходим по этому пути (/server-status) и обнаруживаем секретную страницу с флагом (/secret_admin/B0pdwqU3YB).

Forensic 10 - Attic
Мы получаем ссылку на архив с фотографиями перфокарт - https://hackyou.ctf.su/files/attic.zip. Раскодировать данные с них можно руками, единственное, что можно сделать для удобства - либо распечатать и взять линейку, чтобы не путаться со столбцами, либо повернуть примерно на 3 градуса по часовой стрелке изображение и провести вертикальные линии в каком-либо графическом редакторе. Раскодировать требуется только последнее изображение, так как именно оно содержит флаг. Используется кодировка IBM 029. В процессе может помочь следующий сервис - http://www.masswerk.at/keypunch/.

CTB 10 - ProtSSH
В задании указаны следующие данные:

После успешной авторизации по SSH, получаем следующую картину:


Можно было бы попробовать подобрать пароль, однако простое нажатие комбинации Ctrl+C позволяет попасть в систему без ввода пароля, флаг наш.

Reverse 10 - Old School
В этом задании выдается исходный код на языке Logo: https://hackyou.ctf.su/files/oldschool.txt. Берем какой-либо интерпретатор по ссылке со страницы в Википедии. Далее нам потребуется заменить все команды pe на pu и заменить setpc 9 на pd setpc 9 (http://derrel.net/ep/logo/logo_com.htm). Получившийся код запускаем в интерпретаторе. Флаг получен.

Misc 10 - Tonal
Выдается файл (https://hackyou.ctf.su/files/tonal.txt) с какими-то "слогами" и вопросом, кто автор приведенной цитаты.
Название задания является подсказкой, что используется Tonal System. Преобразуем в соответствии с этой системой содержимое файла.

Получаем набор строк:

Никаких особых криптографических операций делать с ним не нужно, это список MD5-хэшей, которые можно найти в Google. В результате получаем фразу You need chaos in your soul to give birth to a dancing star, автор цитаты: Friedrich Nietzsche

csiM 10 - Lonely
Выдается следующая картинка: https://hackyou.ctf.su/files/lonely.png. Нам потребуется утилита stegsolve. Открываем изображение в ней и на Alpha plane 0 обнаруживаем QR-код, который и является флагом.

Network 10 - Weirdie
Описание задания в общем-то раскрывает всю суть:

Воспользуемся утилитой socat для этой цели.

Теперь с помощью Netcat совершаем GET-запрос, подключившись к localhost:1337


Повторно посылаем запрос к /flag.html и узнаем, что окончательный путь /flag.png. Запрашиваем этот файл echo -ne "GET /flag.png HTTP/1.0\r\n\r\n" | nc -v localhost 1337 > flag.png, удаляем в начале фрагмент ответа веб-сервера и получаем флаг.

Если честно, то мне ужасно лениво описывать все 28 заданий, поэтому из оставшихся опишу несколько выборочно.

csiM 100 - Masks
В задании выдается архив с изображениями https://hackyou.ctf.su/files/masks.tar.gz. С помощью утилиты convert XOR'им изображения между собой следующим образом:

Получаем изображение, где можно прочесть флаг.

Web 100 - Wait, wait, wait
Дана следующая ссылка: https://hackyou.ctf.su/files/web100_waitwaitwait/index.html. Беглый просмотр JavaScript-кода... а впрочем воспользуемся встроенным в любой веб-браузер отладчиком. Поставим точку остановки и введем что угодно в поле.


Посмотрим, что сравнивается в данном фрагменте кода:


А вот и флаг.

Web 200 - Wrongsec
Теперь нам дана такая ссылка: https://hy17-wrongsec.spb.ctf.su/. Сайт практически пустой, попытка подставить кавычку оканчивается полным фиаско, а сканер директорий грустно молчит. Подсказкой является изображение снизу с текстом Acusensor. На помощь приходит следующая статья: https://dustri.org/b/playing-with-the-acusensor.html. Откуда взять пароль? Всё просто, обратимся по одному из следующих путей:

Получив пароль и ознакомившись с вышеприведенной статьей, совершаем следующий запрос с помощью curl:


Декодируем фрагмент содержимого из Base64.


Это нам дает путь к файлу с флагом (https://hy17-wrongsec.spb.ctf.su/encrypted_password.txt) и способ его декодирования:

Что и позволяет получить флаг.

Reverse 200 - L33t Hard
Это задание весьма своеобразно, даже не знаю, при чем тут реверс. Нам дается: исходник, видео и информация:

Исходный код написан на VHDL, но скачивать инструменты для работы с ним мне не хотелось, поэтому на Github был найден код для эмуляции семисегментного индикатора для C# (https://github.com/dbrant/SevenSegment), VHDL-код переписан на C#, а также пришлось подобрать, какие биты включают какие элементы индикатора. Оказалось вот так:

Теперь у нас есть эмулятор, где можно экспериментировать и подбирать необходимую комбинацию нажатий.

Проект для Visual Studio можно скачать тут: SevenSegment-master. Путем несложных манипуляций выяснилось, что содержимое переменной accumulator должно равняться 0x9f0d0d1f, чтобы соответствовать значению 1337. При этом максимальное число нажатий составляет 7, так как на 8 нажатие внутреннее состояние сбрасывается. Чуть-чуть изменив код, получаем простенький брутфорс, который за несколько секунд выдаст правильную комбинацию: 1443343.

Network 300 - Unlock with Watch
Раздражает меня эта категория, надо было ее назвать Network 1/3, Coding 2/3. В общем, дан сайт: https://hy17-watch.spb.ctf.su/. При вводе IP-адреса он запускает ping, причем, если время ответа достаточно маленькое, то получаем в ответ:


Но это не проблема, можно замедлить время ответов с помощью простой команды на Linux:

После этого получаем token, который понадобится во второй части задания. Также важно упомянуть, что целевой IP должен быть под вашем контролем, так как придется некоторым образом модифицировать ICMP-пакеты.
Вводим token и IP в нижнее поле и получаем, что мы слишком далеко, нужно быть максимум в 10 см от цели. В чем суть? Ну, есть одно отличие в работе ping на Linux и Windows, Linux отправляет timestamp внутри ICMP-заголовка, который и используется в данном случае для "проверки дистанции".


Поэтому нам необходимо как-то перехватывать и модифицировать пакеты, либо написать свой сервер, который будет отвечать на них. Для этой цели я воспользовался Python и библиотекой pypacker, а штатные ответы на ICMP-пакеты заблокировал:

ГовноКод вышел таким:

Суть сводится к тому, что мы модифицируем поле, которое содержит, timestamp и прибавляем 1 секунду. Запускаем скрипт, снова вводим token и IP на сайте - получаем флаг.

Web 300 - Combo
Дана следующая ссылка: https://hy17-combo.spb.ctf.su/. Сканер директорий показывает следующие доступные индексируемые пути:

По адресу /create.php мы можем создавать заметки и прикреплять к ним файлы по uuid, а по следующей ссылке можно просматривать содержимое заметок: /paste.php?id=6, где вместо 6 - идентификатор любой другой заметки. В этом скрипте присутствует SQL-инъекция, которая легко эксплуатируется с помощью sqlmap:

Мы узнаем, что есть две полезные нам таблицы: pastes и docs. Причем в docs содержится информация о файлах, где нас интересует колонка meta, так как она является потенциальным кандидатом на XXE. Небольшая сложность состоит в том, что в данном случае мы столкнулись с SQL-инъекцией второго порядка или Routed SQL Injection.

То есть нам необходимо, чтобы запрос:

Вернул определенные данные, которые бы позволили нам провести XXE через поле meta. Повозившись, получаем следующий запрос:

Теперь закодируем его в hex и проэксплуатируем.


Таким образом, мы получили содержимое файла в Base64, которое содержит искомый флаг.

CTB 300 - Ton'o'funcs

Проанализируем ELF-файл в IDA.

Из очевидного - перед нами проверка на равенство волшебному числу 0xDB9DD0C664BE732, куча функций слева и переполнение буфера через gets. Чтобы его проэксплуатировать, нужно ввести правильные индексы функций, такие что:

Сами функции однотипные – XOR аргумента с константой, что делает простым извлечение констант функций из исполняемого файла. Или можно просто нажать в IDA Create C file… и переписать main под перебор индексов:

Вот и полный код перебора. Получаем номера 3389 и 4337. Теперь можно строить ROP-цепочку:

В итоге получаем следующий эксплоит, что и приводит нас к флагу:

Вот и все задания, которые я хотел разобрать. Наконец, хочу передать привет и поблагодарить: d_x, Felis Sapiens, beched, rrock, yarbabin.

Hack You ’17 — разбор некоторых заданий: 3 комментария

Добавить комментарий для Игорь Отменить ответ

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