С 5 по 16 марта проходил online-этап соревнования по кибербезопасности NeoQUEST-2018. Под катом подробно расскажем о заданиях (но не обо всех, некоторые пойдут отдельными write-up'ами) и статистике их прохождения, а также о том, почему все 11 дней соревнования участники заваливали команду NeoQUEST картинками
Общие итоги
Online-этап включал в себя 11 заданий, которые, по легенде, содержали в себе части ключа к сокровищам таинственной Атлантиды! Получить все ключи не удалось никому — второй ключ к заданию №11 «Cat Fur Grows» так и остался непокоренным!
Первое место занял mityada, набрав 1527 баллов и получив все ключи, кроме злополучного ключа №2 из задания 11! «Серебро» получил bay, собрав те же ключи, но слегка уступив во времени, его результат — 1508 баллов. «Бронза» оказалась у hackzard — все задания, кроме 11ого, и 1429 баллов!
Поздравляем ребят! Борьба за 1 место была очень напряженной, бывало так, что за день лидер сменялся 3 раза. Тройку лидеров ждут крутые подарки, а всех, кто прошел хотя бы одно задание полностью — памятные сувениры от команды NeoQUEST!
Подробно о заданиях и маааленькой пасхалочке!
Сайт с заданиями будет доступен еще некоторое время, так что шанс разобраться в них еще есть!
Задание №1 — «Зелёное объединение»
Вижу зелёное — понимаю, что речь идет об Android!
Участникам предоставлялся APK файл, представляющий собой приложение, разработанное с использованием фреймворка Unity3D. В главном окне приложения есть кнопка, которая при нажатии показывает 2 случайных байта.
При декомпиляции приложения и просмотре директории \assets\bin\Data находились запакованные ассеты для Unity, их можно просмотреть с помощью программы Unity Assets Bundle Extractor:
Внимательное изучение директорий позволяло обнаружить один GameObject с именем e4e623ca0e06d69d7d63a7daae5fb27f — похоже на ключ? Так это он и есть! Этот лёгкий первый ключ получили целых 112 участников.
Также в данной сборке были расположены различные текстуры, на каждой из которых изображались 2 байта, именованные от 1 до 24. По-видимому, это ни что иное, как части флага! Эти текстуры, пользуясь этой же программой, можно (и нужно!) было импортировать в формат png. Теперь необходимо понять, все ли части используются во втором флаге, и в каком порядке?
Для этого декомпилируем C# сборку \assets\bin\Data\Managed\Assembly-CSharp.dll. После тщательного анализа видим функцию GetSeqKey, которая нигде не вызывается. Подозрительно!
В данной функции выполняется XOR строки и массива, но при этом, в исходном коде нет верных значений строк и массива.
Зато в массиве есть подсказка «what's with the button?». Если внимательно посмотреть на кнопку, можно увидеть странную текстуру:
Получаем значения высоты каждого столбика в px, это и есть наш массив для XOR (0x68, 0x5b, 0x59, 0x00, 0x59, 0x58, 0x40, 0x44, 0x17, 0x58, 0x48, 0x57, 0x14, 0x47, 0x45, 0x48, 0x16, 0x58, 0x4f, 0x11, 0x5c, 0x55, 0x00, 0x5b, 0x49, 0x41, 0x40, 0x45, 0xc, 0xe, 0x11, 0x2, 0x0, 0x19). Но это лишь часть ключа!
Чтобы найти вторую часть, внимательно смотрим на состав пакета с ассетами и видим там 3D-объект с именем text, импортируем его в формате *.obj и открываем, например, в Photoshop. Видим текст «You hold the key to my heart...». Для получения правильной последовательности делаем XOR полученных ключей и получаем последовательность: 14, 17, 7, 24, 16, 11, 3, 21, 1, 7. Осталось извлечь все части флага и собрать целый, согласно полученной последовательности!
Со вторым ключом дело было сложнее: его получили всего 49 участников!
Задание №2 — «Пара-пара-пар!»
В этом задании участникам был дан файл “input”, являющийся дампом Bluetooth-трафика между телефоном и Bluetooth-гарнитурой. Кроме служебной информации, в трафике были еще и аудиоданные, передаваемые по RTP/SBC протоколу. Участникам нужно было извлечь аудиоданные, в которых с использованием азбуки Морзе было зашифровано слово, SHA1 от которого и было ключом!
С этим заданием успешно справились 78 участников!
Задание №3 — «Найти Ихтиандра»
Мы любим задания на OSINT, и знаем, что вы их тоже любите! Наш участник mr_umnik уже написал по нему write-up, но только у нас есть любопытные подробности об этом задании! Ведь кто, как не вы, дорогие участники, проявили бурную фантазию и загружали нам настолько удивительные фото, что мы даже собрали коллекцию!
Всё, что было дано в этом задании — никнейм andr_ihtiandr и ссылка на «анкету». Поиск ВКонтакте сразу давал результат! Из фото в профиле находилось название организации (AtlanticNeoSecurity) и подсказка, куда двигаться дальше — в «защищенный мессенджер», то есть, в Telegram!
Попытки пообщаться с пользователем @andr_ihtiandr ни к чему не привели бы, зато в фотографии профиля был намек на следующую социальную сеть: Ask.fm! Оттуда удается узнать фамилию основателя компании, в которой работает Ихтиандр: Nobody.
Однако, профиль ВКонтакте содержал не только намек на Telegram, но и фразу «And sometimes I write interesting things on text storage site =)». А это уже указатель на Pastebin, и действительно — там мы тоже находим Ихтиандра! Его профиль содержит одну-единственную запись, которая, на самом деле, картинка в формате .jpg, закодированная в Base64!
Картинка выглядела вот так (тут-то фантазия участников и расцвела буйным цветом). «Продолжай» относилось к дальнейшему анализу картинки, которая (раз уж она .jpg) открывалась еще и как RAR-архив!
Содержимое архива (подробнее об этом читайте тут) состояло из текстового файла и картинки, открыв которую блокнотом или HEX-редактором, участники находили подсказку о том, что именно эта картинка поможет им найти год основания компании!
И действительно, поиск Google по картинкам выдавал результаты с новостью о найденных в 2009 году останках Атлантиды!
Осталось всего-то ничего для получения ключа: загрузить файл. И не просто файл, а, как мы специально написали в onine-анкете, «фото того, кто спрятался на почти чёрно-белой картинке».
И надо же такому случиться, что деятельный ум проходящих задание связал Чёрного властелина и фразу «почти чёрно-белой»… По такой логике — действительно, спрятаться за Чёрного властелина мог только… белый раб!
В итоге команда NeoQUEST с ужасом наблюдала, как среди загружаемых фотографий растёт число полуобнаженных мужчин! Помимо них, к счастью, были и абстрактные картинки, и даже вариации на тему Ихтиандра! Из странного, но приличного мы составили коллаж:
И только потом, наконец-то, стали появляться котики! Да-да, именно они! Ведь на почти чёрно-белой картинке ВКонтакте было изображено жёлтое такси, а еще цветным были выделены буквы: «c», «a», «T». Cat — вот чье фото мы так долго ждали!
Коты тоже радовали разнообразием, и мы не поленились сделать подборку самых интересных:
При загрузке правильного фото участники получали ключ. С заданием справились 76 человек!
Задание №4 — «Дирижабль? Ага!»
В этом задании участников ждала распределенная сеть ZeroNet, и по этому заданию уже тоже есть write-up от Nokta_strigo.
Для получения первого ключа было достаточно просто изучить принципы работы ZeroNet. Чтобы получить второй, участникам приходилось попотеть, взламывая шифр на основе регистра сдвига с линейной обратной связью.
Задание №5 — «Замучай ослика!»
Входные данные к этому заданию — адрес сайта, представляющий собой страничку «техподдержки», на которой можно создать обращение и загрузить PDF-файл. Через некоторое время на обращение приходил ответ, содержащий первую страницу загруженного PDF-файла и — в самом конце — фразу «Answered from Internet Explorer 11». Все это намекало на то, что администратор открывает PDF в Internet Explorer 11.
Для открытия PDF в IE11 существует плагин Adobe Reader, но пока что это никак не помогало в поисках ключа. Внимательно исследуя страницу, можно было найти скрытый элемент меню «GET KEY», который выполнял перенаправление на страницу /setkey.php.
В данной форме всего один элемент – логин пользователя. В различных ситуациях выдаются разные сообщения, но при вводе корректного логина участник получал такое сообщение:
По-видимому, нужно, чтобы это действие осуществил администратор. Как же это сделать?
Тут на помощь приходил сканер уязвимостей (любой) — при сканировании формы обнаруживалось, что она не защищена от CSRF! Что ж, осталось только подготовить специальный PDF-файл.
Один из возможных вариантов — написать на языке FormCalc POST-запрос, используя адрес сайта (213.170.100.210):
var b = Post("https://213/170.100.210/setkey.php", "login=test&setKey=Выдать ключ", "application/x-www-form-urlencoded")
Вроде бы все верно, но… ключа нет. Тут нужно было вспомнить о том, что у сайта — невалидный SSL-сертификат! Тут как раз помогла часть подсказки «А для открытия Ваших файлов у него установлен плагин Adobe. Он работает на том же сервере, на котором размещён Web-сервер». Смотрим настройки безопасности Internet Explorer — и точно! Сайт localhost является безопасным. Меняем адрес сайта 213.170.100.210 на localhost — и вот он, ключ!
С заданием успешно справились 16 участников.
Задание №6 — «Кто тут инженер?»
Участникам был дан лог показаний акселерометра смартфона, а по легенде можно было узнать про некоторое сообщение в формате RTTY и параметры RTTY-кодирования: несущая частота — 100 Гц, смещение 70 Гц.
Проанализировав лог акселерометра, участники могли увидеть, что значения ускорения устройства измерялись только по одной из осей координат 600 раз в секунду, а показания ускорения выглядят вполне адекватно: 0-60 м/с2.
Основная идея задания заключалась в том, что по имеющимся значениям ускорения можно вычислить местоположения устройства, а много-много измерений местоположения за единицу времени — это вполне себе слышимая звуковая дорожка! Далее — дело техники: вспомнив основы численного интегрирования, участникам нужно было вычислить множество пар «таймстемп-местоположение» и «перегнать» полученные данные в звуковой wav-файл. Оставалось только немного пошаманить с амплитудой звука и, усилив сигнал, раскодировать RTTY-послание, в котором был ключ!
Инженерами оказались 29 участников.
Задание №7 — «Адский реверсер — моё ампЛУА!»
Задание №7 было посвящено поиску и эксплуатации use-after-free уязвимости, кроме того, в самом задании был намек на использование языка Lua.
Подробный разбор этого задания (и не только его!) сделал GH0st3rs, write-up доступен тут! С заданием справились только четверо участников!
Задание №8 — «Блокчейн добрался даже до Атлантиды...»
В этом задании участникам был дан клиент для взаимодействия с простым блокчейном. Для получения ключа нужно было смайнить блок, содержащий ник участника. Но стандартный алгоритм майнинга был слишком медленным! Чтобы увеличить скорость, участникам нужно было найти уязвимость в хэш-функции, которая использовалась для проверки блоков.
Задание прошли только 10 участников, и мы разберем его подробнее, ждите write-up!
Задания №9 — «QEMU+eCos=QECOS» и №10 — «Spectre»
На эти два задания активный GH0st3rs тоже уже успел написать write-up! Читайте их по ссылке. Скажем лишь, что задание №9 было посвящено работе с непривычной для многих операционной системой eCos, оно содержало в себе 2 ключа, первый из которых получили всего 5 участников, а второй — и того меньше: четверо участников!
Название задания №10 сразу говорило о том, что без уязвимости Spectre тут не обошлось! Участникам NeoQUEST нужно было извлечь ключи (целых 3 штуки!) из сломанного приложения, предварительно найдя в нем ошибки и «починив» его.
Первый и третий ключи получили по 29 участников, а второй оказался сложнее и был найден только 19-ю участниками.
Задание №11 — «Cat Fur Grows»
Этим необычным названием мы усиленно намекали участникам на то, что без обхода механизма защиты Windows под названием Control Flow Guard (CFG) здесь не обойтись! В задании нужно было найти/нафаззить уязвимости и получить ReadWrite примитив для обхода всего, что есть в последней Windows — DEP, ASLR, CFG, и т.д.
Первый из двух ключей получили только четверо участников, а вот второй ключ так и не покорился никому. Именно этому заданию мы посвятим отдельную хабрастатью, ведь, помимо того, что оно самое сложное, у него было несколько вариантов прохождения!
Пасхалка
За несколько дней до окончания соревнования один из наших разработчиков решил сделать небольшой сюрприз участникам и придумал небольшую инженерную пасхалку. В тексте легенды некоторые символы были выделены жирным шрифтом:
Введение – НА (на часы)
Задание 1 – ЖМ (содерЖиМое), И (экспедициИ)
Задание 2 – НА (но НАм все это)
Задание 3 – СТ (мое соСТояние)
Задание 5 – АР (в них не обнАРужив)
Задание 6 – Т (смарТфон)
Задание 7 – 7 (из IP-адреса)
Задание 8 – Р (шикаРный), АЗ (АналиЗ)
Собрав все символы вместе, участники получали такую фразу: «НАЖМИ НА СТАРТ 7 РАЗ».
Да-да, на тот самый старт, что под дирижаблем!
После 7 нажатий открывалась вот такая страничка:
Чтобы получить недостающий кусочек ссылки, участникам нужно было найти попиксельную разницу между картинками. Способов сделать это — достаточно, но самый простой — найти онлайн-тулзу, например, вот эту, она нашла вот такую разницу:
Фраза «W3Are1n1AMMn0W!11» отражала радостные эмоции разработчика в связи с тем, что его родная кафедра «Информационная безопасность компьютерных систем» СПбПУ (один из организаторов NeoQUEST!) перешла в состав Института прикладной математики и механики. Что ж, абитуриенты, бакалавры и аспиранты — теперь вы знаете, где нас найти! Тем более, что успешное участие в NeoQUEST учитывается при поступлении на кафедру «ИБКС»!
Но довольно лирики, ведь пасхалка еще не пройдена до конца! Перейдя по полученной ссылке, участники получали новую загадку:
Шестерёнки, формулы… Непонятно. Хотя вскоре, приглядевшись, участники понимали, что верхняя формула — не что иное, как отношение числа зубчиков на самой большой шестеренке к числу зубчиков на самой маленькой! Теперь вся сложность заключалась в том, чтобы верно подсчитать зубчики (63 и 16, соответственно), разделить одно на другое (3,9375), умножить на 104 и взять SHA1 от получившегося значения (6246a5c59e9cd5944ab1b196dcb9d950c2172254)!
«Пасхалку» прошли 46 участников, каждый получил 10 баллов — динамическая шкала на это задание не действовала.
А теперь — статистика!
В соревновании приняли участие 1253 человека, хотя бы один ключ получили 167 участников. Изменения в турнирной таблице — в нашей традиционной гифке:
Также мы собрали статистику по сложности заданий (учитывалось число участников, прошедших задание полностью):
И еще — статистику по заданиям с несколькими ключами! Всего их было 5:
- Задание №1, «Зелёное объединение» — 2 ключа;
- Задание №4, «Дирижабль? Ага!» — 2 ключа;
- Задание №9, «QEMU+eCos=QECOS» — 2 ключа;
- Задание №10, «Spectre» — 3 ключа;
- Задание №11, «Cat Fur Grows» — 2 ключа;
За весь период online-этапа NeoQUEST-2018 было получено 594 ключей! Самым легким оказался первый ключ к заданию с Android (№1, «Зелёное объединение»).
Впереди — «Очная ставка»!
В этом году «Очная ставка» состоится в Петербурге не летом, а осенью — в конце сентября. Однако это — не все перемены, которые ждут гостей и участников!
Мы оставим самое крутое и любимое: доклады, воркшопы и демонстрации атак и добавим новенького! Впервые NeoQUEST пройдет вместе с научно-технической конференцией «Методы и технические средства обеспечения безопасности информации»! Гости NeoQUEST-2018 узнают много нового о взаимосвязи науки и практики кибербезопасности, о важности научного research для специалиста по защите информации и о том, как с научной точки зрения работают современные механизмы защиты информации!
При этом, желающие смогут принять участие не только в NeoQUEST, но и в научных секциях конференции! Чтобы узнать подробнее про участие с докладом или воркшопом на NeoQUEST, пишите на на support@neoquest.ru, а подробнее про конференцию «Методы и технические средства обеспечения безопасности информации» узнавайте на объединенном сайте, по всем вопросам обращайтесь на mitsobi@neobit.ru.
Впереди — write-up'ы нескольких заданий и активная подготовка к «Очной ставке»! Кстати, участники, прошедшие целиком хотя бы одно задание, — проверяйте почту, в скором времени начнем рассылку!
Agel_Nash
Это что нужно курить, чтобы по подсказке cat найти нужную фотографию? В статье с прохождением, mr_umnik берет фото из wiki. НО! Со страницы на русском языке. При этом все подсказки были на другом языке. Но и это еще пол беды. Почему для решения потребовалась не первая и даже не последняя фотография из текста?
Даже в вашей подборке кошечек есть фото из ТОП-10 выдачи картинок в гугле. ИМХО, авторы этих картинок прошли квест.
Agel_Nash
Хотя, все конечно может быть намного проще — модерация проходила в ручном режиме. И любая фотография кошки принималась как верная.
NWOcs Автор
Модерация проходила не в ручном режиме, мы использовали специально обученную нейронную сеть, способную отличить фото/изображение кошки от любого другого. Подходили фото котов, взятые как при русскоязычном, так и при англоязычном запросе. Корректно обрабатывались даже загруженные участниками фотографии своих домашних котов, просто мы не включили их в подборку.
danbes1
А исходники можно глянуть?) Академический интерес=)
NWOcs Автор
Это была не наша реализация нейросети, мы использовали проект tensorflow! Вот ссылка: www.tensorflow.org/tutorials/image_recognition
danbes1
Спасибочки=) До tensorflow добраться не успел, но галочка «на будущее» уже как неделю стоит=) Сначала OpenCV))
Пользуясь случаем, хочу сказать, что задания получились крутые=)
NWOcs Автор
Спасибо большое! Мы старались :)
Agel_Nash
Об этом можно было бы упомянуть в данной статье, а то появлялся некий когнитивный диссонанс…