3 Апреля, 2019

Хакинг по-древнегречески: итоги online-этапа NeoQUEST-2019

НеоБИТ

Подводим итоги online-этапа NeoQUEST-2019 : под катом расскажем про задания, посмотрим на статистику их прохождения и похвалим победителей!


Дисклеймер: продукт может содержать в себе следы арахиса и спойлеры для тех, кто еще не проходил задания, но честно собирается (а такая возможность есть – сайт on-line этапа продолжает работать!). Не рекомендуется к употреблению, если вы еще не проявили достаточно упорства, чтобы получить все ключи самостоятельно.


Кто самый лучший?


Итак, в этом году нашими победителями стали:


1 место — AV1ct0r, 952 баллов;
2 место — OLD_NA_MESTE, 766 баллов;
3 место — gurgenhopar, 505 баллов.


Ребятам почет и уважение! Надо отметить, что призеры 1-2 места определились уже с первого дня соревнования, и никому не уступали своих позиций (разве что менялись местами друг с другом). А вот борьба за третье место была жаркой: иногда «бронзовый» участник менялся несколько раз за день!


Тройку лидеров ждут заслуженные подарки, а всех, кто прошел хотя бы одно задание полностью — памятные сувениры от команды NeoQUEST! (да, кстати: если ты решил как минимум одно задание, но еще не сообщил нам, каким способом ты хочешь получить подарок — сейчас самое время это сделать, написав на support@neoquest.ru)


Раскрываем тайны


Для участников мы подготовили 10 заданий, разных по сложности и по тематике. Про некоторые расскажем подробно, а остальные скоро выйдут на Хабре в виде отдельных статей!


Задание №1 — «Немейское эхо»
В этом задании участникам был предоставлен так называемый эхо-сервер, к которому можно подключиться на определенный порт и отправлять данные. В ответ сервер присылает то же самое, что и отправили ему. Флаг лежит на сервере, его и необходимо получить, имея только IP-адрес и порт.


Задание №2 — «Мягкие и шелковистые»
История банальна — в сеть утекает очень важная информация. Участникам дается два файла: непосредственно бинарный файл, который генерировал утекающий трафик, и pcap-дамп этого самого трафика. Флаг находится в pcap-дампе, но в зашифрованном виде, и нужно разреверсить бинарный файл, чтобы расшифровать данные и достать флаг.


Разборы заданий №1 и №2 выйдут отдельными Хабрастатьями!


Задание №3 — «Связь с небесами»
Небесные связи удалось установить почти всем участникам, задание стало лидером по проходимости. Исходные данные — ссылка на телеграм-бота.


Первым шагом нужно было добавить бота и прочитать его описание. Там сказано, что бот «зависает» в своей любимой социальной сети и нигде больше. На все попытки хоть как-то с ним поговорить, бот отмахивается и просит написать ему в «Олимпии». Идем по указанному ботом адресу и попадаем на страницу с авторизацией в «божественной» (нет) социальной сети.


При общении с ботом можно получить следующее сообщение: «Я не перехожу по незнакомым ссылкам!», что может натолкнуть нас на мысль, что по знакомой ссылке бот, возможно, перейдет.


При попытке перейти куда-либо, кроме страницы авторизации (на страницу index, например), нас редиректит интересным образом (на самом деле, так делается на многих сайтах, но они нормально фильтруют параметр next):


login?next=index</b


Первое, что приходит на ум: «А нет-ли тут OpenRedirect-a?». Он есть, но работает только для авторизованного в социальной сети пользователя, коим и является бог насмешки и злословия Мом , т.к. постоянно в ней сидит. Ага, давайте поднимем свой сайт, в качестве параметра next передадим на него ссылку и посмотрим, перейдет ли бот по ссылке? Быстренько поднимаем любой сайт на бесплатном хостинге. Оправляем боту:


http://213.170.100.214?next=https://your.freeapp.kek/


Бот до страницы не дошел, редирект не сработал. Все дело в фильтре, горе-разработчики проверяют, нет ли в параметре «next» подстроки http или https, надеясь редиректить пользователя только внутри своего домена. Наивные. Оправляем:


http://213.170.100.214?next=//your.freeapp.kek/


Ииии… бот переходит на наш сайт! Но больше ничего не происходит. Бот зашел, посмотрел, и ушел (в первый день это было не так, поскольку в боте был баг: мы пробрасывали куки с сессией после редиректа на сайт атакующего, что немного упрощало прохождение задания, на второй день рано утром лазейка была закрыта).


Однако, если сделать копию страницы авторизации, то бот подумает, что его разлогинило, и залогинится на вашей странице. Копируем ресурсы со страницы авторизации социальной сети и делаем фишинговую страницу. На сервере пишем в логи все введенные логины и пароли. Отправляем ссылку боту, и он по невнимательности авторизуется на поддельной странице.



Берем логин и пароль и авторизуемся в социальной сети, получаем ключ. Успех!


На это задание write-up написал один из наших участников — mr_umnik , читаем тут .


Задание №4 — «Крипота Криптовая»
Четвертое задание "Крипота Криптовая" посвящено, как это ни странно, криптографии! И речь идет не о традиционном для CTF RSA, а о шифрах Древнего Мира, когда искусство криптографии только зарождалось.
Итак, дан архив с тремя файлами. Содержимое первого файла включает в себя читаемый текст и зашифрованную строку:


Воспользуйся мудростью, которой одарила тебя богиня.
5fw909zcmxsc7sxn1m6m86wxs2xrhrx78r72333mms8rlkg1u41o4dm82n632n2c2s8r17nwx3673c6hnh8n8x3mn7dwrrdswmxm1nc3wc681d16rmdc8cx


Возникает вопрос, о какой богине идет речь? Обратимся к легенде. Единственной отсылкой является упоминание некой мудрой женщины в шлеме с копьем в руках, изображенной на медальоне Цербера. Такое облачение соответствует богине мудрости Афине, что сразу наводит на мысль об использовании созвучного аффинного шифра . Старый добрый брутфорс позволил дешифровать секретное послание:


modulus 9b6598564ebfb1fd6576cac681c87000bb51
Ciphertext 2b174f07479751ce84d60f809fa4a14160b482dcc25db6be490d9f1e2efcb29196


Ну и что делать с этим дальше? Может второй файл даст больше информации? Итак, его содержимое:


Какой еще придет в голову античный шифр? Начнем с простого…
35ub2b9slmkjonnqtsokomumqnphkinmrqlqoyz4aayvr4tzv4ax8vv19xrcvb9ayv6fayrx58vr4ayv58v3r4uayvtyz4v9v68v9v4avuayvtyz4v9vayv58v3rs5baf5b145ddyra


Первый шифр, который приходит в голову — шифр Цезаря . Благо и он с легкость поддается дешифрованию! Получаем:


modulus b45327669cb7375d596803165a9497
hint The ancient greeks gave us the Pythagorean theorem and the Chinese presented the Chinese theorem about you know what


Ага! Вот и подсказка! Причем, наводящая на Китайскую теорему об остатках . Данная теорема утверждает, что некоторое целое число можно восстановить по множеству его остатков от деления на числа из набора попарно взаимно простых чисел.
Так, так, так, у нас есть 2 модуля, а также некий Ciphertext. Может, этот Ciphertext и является тем самым восстановленным целым числом? Тогда для нахождения остатков достаточно просто привести Ciphertext по двум известным нам модулям. Получаем:


Остаток 1: C1 = Ciphertext mod (modulus 1) = 8b53bd874ebfb1fd6576cac681c86ffc36e7
Остаток 2: C2 = Ciphertext mod (modulus 2) = 14327669cb7348d59680c6595418


Что же дальше делать? Обратим внимание на третий файл:


У нас было два взаимно простых модуля, один загадочный шифртекст, наводка на некую китайскую технологию и… печать Древней Спарты.
Не то чтобы это был необходимый запас для решения загадки, но раз уж начал коллекционировать подсказки, то сложно остановиться… Может, пора уже приступить к решению?


Вроде бы тут все на месте…кроме печати Древней Спарты. К чему она тут? Может есть такой шифр? И действительно, шифром Древней Спарты называют также шифр Сцитала .
Попробуем дешифровать полученные остатки. В результате выбираем те, фрагменты которых совпадают с кусками флага, приведенными в легенде. В результате получили:


M1 = 88b78fb7161c54fcc33eda86bb6c6edf56f7
M2 = 19d64c553b9927657384640168c8


Тогда итоговый флаг принимает вид:


NQ2019 88b78fb7161c54fcc33eda86bb6c6edf56f719d64c553b9927657384640168c8


Задание №5 — «Яблочное письмо»
По легенде, у нас есть следующие данные: картинка с веб-камеры, на которой есть надпись «Robert B. GmbH». А еще — файлик с каким-то странным содержанием. Чтобы получить ключ, необходимо заполнить следующие поля формочки:



Причем герой легенды намекает, что картинка — это подсказка к номеру телефона, а файлик каким-то образом должен привести нас к id камеры.


Разберемся сначала с картинкой. Поиск ее в интернете ни к чему не приводит. А вот надпись «Robert B. GmbH» после первого запроса в Гугле подсказывает нам, что производитель этой камеры – немецкая компания Bosch, основателем которой и является Роберт Бош. И тут самое время вспомнить, что в веб-форме возле поля «Телефон» была пометочка «(.gr)». Ну и действия происходят в Греции, логично же. Поэтому после недолгих раздумий переходим на греческий сайт Bosch . И телефон, указанный там (+30 210 5701360) – как раз то, что нам нужно!


Переходим ко второму файлу. В нем есть следующего вида запись:


...c6d1eb6f29d739176bdbe79c3d3b504c9d64fecb...olympic_shot.png


Нужно было догадаться, что перед нами находится magnet-ссылка в самом простом ее формате, в которой присутствует хэш, используемый в самой распространенной сети BitTorrent! Осталось правильно восстановить формат magnet-ссылки.


magnet:?xt=urn:btih:c6d1eb6f29d739176bdbe79c3d3b504c9d64fecb&dn=olympic_shot.png


Эту ссылку добавляем в торрент-клиент, скачиваем картинку:



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


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


Исходный код на Си
#include "AncientGreece.h"  void eat (int who, int *whom) {     *whom = 0; }  int BirthOfAthena() {     int Zeus = 10000;     int Metis = 1000;     int Athena = Zeus + Metis;     eat(Zeus, &Metis);     Athena = 0;     bool headache = TRUE;     int kick = -1000;     do     {         kick++;         if (kick = Athena)         {             Athena = 1000;             headache = FALSE;         }     }     while (headache);     return Athena; }  int  ApplesOfTheHesperides() {     int labour = 0;     int Heracles = 100;     int heaven = 100000;     int Atlas = 1000;     int golden_apples = 8222; /*why?*/     bool trick = TRUE;     while(!Heracles_is_here)     {         Atlas = Atlas + heaven;         if (labour == 10) break;         labour++;     }        Heracles_is_here = TRUE;     Atlas = Atlas - heaven;     Heracles = Heracles + heaven;     Atlas = Atlas + golden_apples;     trick = TRUE;     Atlas = Atlas - golden_apples;     Heracles = Heracles - heaven;     Atlas = Atlas + heaven;     return Heracles + golden_apples }  void BirthOfZeus() {     int Cronus = 1000;     int newborn_gods[] = {1000, 1000, 1000, 1000, 1000, 1000};     int i = 0;     for (i = 0; i < 6; i++)     {         eat(Cronus, &newborn_gods[i]);     }     int Zeus = newborn_gods[6] + 10000;     bool battle = TRUE;     bool peace = FALSE;     int Thetis = newborn_gods[0] + 1000;         int Hera = newborn_gods[2] + 1000;     int Hades = newborn_gods[3] + 1000;     int Demeter = newborn_gods[1] + 1000;     int Poseidon = newborn_gods[4] + 1000;     Cronus = 0;     battle = FALSE;     peace = TRUE; }  void main() {     BirthOfZeus();     BirthOfAthena();     ApplesOfTheHesperides(); }

Находим функцию main() и понимаем, что рассматривать функции необходимо в порядке их вызовов в main().Числа в данном задании имеют свое значение: нерожденный/мертвый человек/бог обозначен числом 0, человек – числом 100, все боги и титаны – 1000, а Зевс-Громовержец – 10000.


Идем в функцию BirthOfZeus(). Логично предположить, что эта функция рассказывает о рождении Зевса, а также о его борьбе за власть. Итак, прочитав миф о рождении Зевса, смотрим на код, и видим, что цикл от 0 до 6 в данном случае является семантической ошибкой – Кронос съел не шестерых своих детей, а только пятерых. Осталось понять, как из этого составить ключ: ключ составляется по номерам строк с ошибками. Первая часть ключа – номер строки – равен 60. Идем дальше.


Следующая ошибка поджидает нас в строке с номером 64 – тут все просто, выход за границы массива.


Следующая ошибка в строке 67. Дело в том, что Thetis, а именно богиня Фетида, не была дочерью Кроноса и сестрой Зевса. Вместо нее там должна быть богиня Гестия.


В функции BirthOfAthena() нас поджидает ошибка для очень внимательных: в условии на строке 20 написан один знак равно, а по стандарту языка Си необходимо два знака равно для сравнения.


Самой замысловатой оказалась функция ApplesOfTheHesperides(). Буквально сразу же возникает ответвление от прямой задачи. Почему int golden_apples = 8222? Пока непонятно.


В посте ВКонтакте тоже есть несколько подсказок к этому заданию:


1) Где искать ответ? В открытии, которое случилось первого марта.


Путем недолго просмотра событий первого марта (а можно сразу же найти необходимое, вспомнив пост и упоминание об алхимии) находится открытие Периодической системы Д. И. Менделеева. Отлично, переходим далее!


2) Что использовать при составлении части ключа? (необходимо учитывать расположение загадки в тексте)


• Что объединяет следующие три слова: Мнемозина, Океан, Гюйгенс?
• Кто подарил людям огонь?


Гуглим и находим ответ: ТИТАН ПРОМЕТЕЙ. Как и сказано в задании, это поможет при составлении ключа. Осталось понять, почему именно 8222. Не зря мы искали информацию про таблицу Менделеева: очевидно, что ответ необходимо искать там. Вспомнив химию, находим порядковый номер золота = 79.


А что же с яблоком? Вероятно, здесь тоже как-то пригодится химия. Выясняем, что в яблоке больше всего калия. Его порядковый номер – 19. Подходим к великой тайне: почему 8222, а не 7919? Ну конечно, старый добрый шифр Цезаря. Сдвигаем на 3 вправо каждый элемент, получаем наше значение 8222.


Осталась мелочь: зашифровать ТИТАН ПРОМЕТЕЙ по таблице Менделеева. Оба этих элемента есть в таблице, получаем: 2564. Замечательно, переходим к дальнейшему нахождению ошибок в коде.


В этой же функции нас ожидает неинициализированная переменная в cтроке 38, семантическая ошибка в строке 41 (это же был 12 подвиг Геракла!) и отсутствие точки с запятой в строке 52. Фух, мы справились. Получившийся код = 606467202564384152. Это и есть id нашей камеры. Странный, но в Древней Греции чего только не бывает.


Вводим эти два значения в форму, доказываем всему миру, что мы не робот, и получаем заветный ключик!


Задание №6 — «Идет, бычок, качается»
Задание №6 в этом году было очень непростым, но интересным. Его мы подробно разберем в отдельной Хабрастатье, а пока что вкратце скажем: нужно было поиграть с Минотавром, используя приложение, в котором чего-то не хватает.


Задание №7 — «Вам поострее? Нет, побыстрее!»
В этом задании (на которое тоже выйдет отдельный write-up!) участникам предлагалось разобраться с приложением, которое шифрует введенные данные с помощью значения параметров акселерометра устройства, снятых во время нажатия кнопок на клавиатуре. Для прохождения задания нужно было вводить различные данные в приложение, и внимательно анализировать полученные смещения.


Задание №8 — «Божественный интерпретатор»
Наши постоянные участники, возможно, узнали это задание — оно осталось с прошлого года. Тогда вторую часть не прошел никто, и мы решили дать ему второй шанс. По первой части задания существует наш Write-up на Хабре, там рассказывается в основном про поиск уязвимостей. В этом году акцент задания был сосредоточен не на поиске, а именно на эксплуатации уязвимостей — и под это мы, опять же, выделим отдельную Хабрастатью.


Суть такова — на сетевом порту сервера вертится программа-интерпретатор команд. Бинарник программы прилагается к заданию. На сервере стоит Windows Server 2016, и помимо прочего там включен механизм защиты CFG. Про ключ известно только то, что он состоит из 70 символов и лежит в файле key.txt рядом с исполняемым файлом на сервере.


Задания №9 — «Игра в ящик»
В этом задании у нас есть два сервера. На сервер №1 можно отправлять RAR-архивы, которые там распаковываются, и могут помочь получить ключ, спрятанный на сервере №2.


Задание №10 — «Не бей, Одиссей»
Это задание было одним из самых сложных – его осилил только один участник. Исходные данные — архив с инфраструктурой сети, все нужные файлики в котором оказались зашифрованы. А раз зашифровано, то путь один — расшифровать!


Разборы заданий №9 и №10 тоже выйдут отдельными Хабрастатьями!


Британские ученые установили


Небольшая статистика этого года:


  • Количество зарегистрированных участников — 1014 чел.
  • Количество пройденных заданий — 10/10
  • Количество участников, прошедших хотя бы одно задание полностью – 33 чел.

Количество верных ключей к каждому заданию



Количество верных ключей в каждый день соревнования



За весь период online-этапа NeoQUEST-2019 было получено 94 ключа.



А что дальше?


А дальше — «Очная ставка» 26 июня, в Санкт-Петербурге, на которой пройдет финал нашего соревнования! Ждем всех самых лучших хакеров, чтобы вживую удостовериться, что вы действительно самые лучшие! А про тех, кто не приедет, мы будем думать вот так...



Следите за новостями на сайте летнего мероприятия!