Подводим итоги 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
Первое, что приходит на ум: «А нет-ли тут 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 июня, в Санкт-Петербурге, на которой пройдет финал нашего соревнования! Ждем всех самых лучших хакеров, чтобы вживую удостовериться, что вы действительно самые лучшие! А про тех, кто не приедет, мы будем думать вот так...
Следите за новостями на сайте летнего мероприятия!
Комментарии (13)
mr_umnik
03.04.2019 17:36Мне задание №5 показалось весьма некорректным.
Давать картинку с камеры, которая потом никак не используется в решении, при том, что эту самую камеру можно найти шоданом (http://62.1.13.221/). По обрезанному в исходной картинке названию камеры можно догадаться где эта камера находится и найти ее на гугл мапс (ссылка как раз показывает ракурс на котором видна и камера и телефон). При этом найденный телефон почему-то не правильный, а правильный — телефон с сайта боша…
Про логику получения кода даже писать ничего не хочется, как до этого можно догадаться и при чем тут osint для меня до сих пор загадка.
LAn0wl
03.04.2019 17:50НеБольшое фи насчет 4-го задания:
ciphertext все-таки намекает на некую криптосистему с использованием КТО и простых чисел. В данном же случае никакого ciphertext не было, а был «секрет» и намек на схему с разделением секрета. Намек весьма условный, потому как подсказка про КТО (китайскую сами знаете что) и «ciphertext» лично меня направили в сторону криптосистем — есть такая схема Рабина ( wiki_rabin ).
Два модуля из задания — p и q, некий шифртекст: причем ciphertextL < p*q. Один из модулей при делении на 4 дает остаток 3! Очень важное условие для расшифрования в данной схеме, но не обязательное (при делении второго модуля остатка 3 не получается). Для извлечения корня в кольце вычетов для второго модуля есть Алгоритм Тонелли-Шенкса ( wiki_tonelli-shenks ).
Особенность схемы Рабина (или недостаток) — неочевидность решения, потому как в кольце вычетов квадратичное сравнение имеет 4-ре решения (если имеет решение вообще).
В данном случае решения нашлись:
х1 = 6d048594d45c3a31e5dbae269d0dc89afbcd5dd5d0639e7d44b614a57cf6fb697
х2 = 6a5dda589058df947c2d25d0afe320be52259ffc1870a473ba25ae7419dc034e3a
х3 = 66a5a09e89e5861c5237a98085cedb72710d6d52e34bed43f71518adf07dc39a30
х4 = 3180e9f46d26a2af4683e923fbc973dcea4a33427e182b8113acb842e7130028d
При возведении во вторую степень этих чисел по модулю N = p*q получается ciphertext. (да-да, проверьте)
Видимо, слишкой серьезный подход к решению задачи был выбран и несерьезный к составлению подсказок и задания в целом. Спасибо.NWOcs Автор
03.04.2019 17:52Спасибо за мнение! Поработаем над заданиями и подсказками, чтобы все было более логичным :)
0ri0n
04.04.2019 09:05Как бы все хорошо Но:
А дальше — «Очная ставка» 26 июня, в Санкт-Петербурге, на которой пройдет финал нашего соревнования!
— А если люди с Дальнего востока? или Сибири… Им добираться до Питера совсем не удобно… а вы их так обижаете своим виденьем(А про тех, кто не приедет, мы будем думать вот так… — картинка)
NWOcs Автор
04.04.2019 13:36Команда NeoQUEST уверена: милый котик (пусть даже и не лев) — это ни в коем случае не обидно!
А если серьезно, «Очная ставка» проводится с 2013 года, и за это время в Петербург участники приезжали издалека: Из Новосибирска, Красноярска, из республики Беларусь и даже из Армении! Поэтому мы верим, что все смогут приехать и принять участие в финале!
Ishak92
Добрый день, спасибо за квест.
А как так получилось, что вторую часть шестого задания решило больше народу чем первую часть? При условии, что во второй нужно было ввести ключ от первой?
NWOcs Автор
Спасибо за участие! :) В задании обе части независимы друг от друга. Единственное, что первая часть задания содержала IP-адрес для второй части, но IP-адрес можно было получить и другим способом, чем, по-видимому, и воспользовались участники!
Ishak92
Но там же нужно было ввести ключ от первой части.
NWOcs Автор
Это было не обязательно, второй ключ принимался даже отдельно от первого!
Ishak92
То что табло принимало ключи независимо, конечно ясно, но ведь в веб форме второй части задания нужно было загрузить архив и ключ от первой части задания. Или это был обманный маневр? Прочитав описание 5, я конечно допускаю, что задание 6.2 резко переквалифицировалось из реверса в веб и там была SQL инъекция во втором поле веб формы. Но для человека, сделавшего первую часть, казалось логичным, что нужно дать дллки, которые отработают у вас на сервере, если разместить их в каталогах игры. А ключ от первой части задания -гаранття, что ты заставил работать игру у себя. Логика такая: первый ключ — заставить игру работать, у себя, модно патчить частично игру. Второй ключ — заставить игру корректно работать у вас, выдав вам только дллки (патчить игру уже нельзя ) +)
Все равно спасибо. Нелинейность и нестандартность заданий — это то, за что мы ценим ваш квест. Просто хочется разобраться в задании, на которое потратил много времени.