Find the flag2

Find the flag2

Dmitry K
Основное окно


Цель задания - найти где-то флаг.

Если откроем панель разработчика в браузере, то можем увидеть, что используется технология SSG (Static Site Generators). Т.е некоторый набор данных генерируется/создается на сервере, должно кешироваться, и дальше обработанный набор данных передаются клиенту для дальнейшего отображения.

Просмотр содержимого страницы
<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"data":"FOS9A56glU64Z0k/lzYwYL3CMKMRWGveTLJWAxzY0KmOzCqQ069zHx7EM9+jdkYMnrX8FU4ypVt9DRH4LZKJFSpGaJUK5yPHga1v0kKobWISMTbZtQMur3FrUVFF8Aqs2rNx5spD02bGCWSgiXlYql12B0BU6u+UUgCj2kAOJUGmGrOZ4Sk7xG9I8FsIRaKQitrESCQflp5iZDelaBrKzGIU98xWAVgEH+x47XC44Bg2GOQOiyeOmIiyx9Q3mUqpKvpgDGeJKWjoi9w8zF6XeCsjONaXZxw/S66k4fJhvRnm6LytBol04PiIqdz2MTWO6thLtJmlqepkCkQ+BJ1j+yPZm1hNAfjCYTa50N3hg5z6bML99G1LlEXlf1VB0CwPiwAqLwTNp2+M++Bx+k35xncH2krNP+2s4ki4xlISXP6LOgBeegm0wgyVWJh/1NmRuhVCS0RS3pI4mJC5+VXB+UdImJN5bLSB2DwBuPEL/w4y9E5F3aGktvoLI7T2dps3NYPcRzi1ztJK/AwFnagFWdTEiCWVPOwxJquHL+9+eeoPXqdI3B/3LsFy1Yay8ZTAwrFJfUrgF4BpHU8QHRkcflv2tFC8voEp8AXOafZZjxVgd+4EdW+8arl3EBkKwnP8vLfzJaTGAp2H/yuVnCyPV8l6xBWVonMrvUtkybP8pJETWY5V46mn7AKiqcfWJn8kYQzNaHh2UNHWIliVJur9gA1isOqjpgyixlNt3khhL72B3XXo7vkWuQuJdoqCl4n2sdJstduBEcVhzsr5EPQ6/LspEPbU3E2QYbNB5XtFkIjZTvGgCHCq0ZHLEsE/dScH","flag":"XmLhVrj+zr3yDjv1kMf8XWC+9C0jkpSkKe5YkAnH3jU="},"__N_SSG":true},"page":"/","query":{},"buildId":"yDgRI_AFP-E7ywCE8DHqu","isFallback":false,"gsp":true,"scriptLoader":[]}</script>

Если проанализировать формат значения "flag", то можем увидеть что это base64 (в логах видел, что многие пытались сдавать декодированный флаг), но декодирование base64 не даст читаемого результата.

Простой способ решения

Был простой способ решения данного задания. Я (автор), не предусмотрел его. Но как видно из комментариев к заданию, не только я :)

Описание решения от участника

Как можно увидеть, в __NEXT_DATA__ есть еще и поле "data", и предположительно от туда данные выводятся в title. Т.е нужно было до начала исполнения JS кода, подменить значение "data", значением "flag", и в результате должны были получить флаг, выводящийся посимвольно. в title.
Подменить флаг можно было в утилите "burp suite", установив в настройках "Proxy" захват еще и ответов от веб приложения (по умолчанию только запросы).

Настройка burp suite

И, через ctrl+f5 (с очищением кеша), обновляем страницу и видим, подменяем значения.

Отправка измененного запроса на клиентскую часть

И в результате флаг должен выводвиться по символьно в title.


Решение через статический анализ JS файлов

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

После index-<hash>.js 4 файла генерируются react js и webpack. В них пользовательского кода (если не ошибаюсь), не должно быть.

А вот в папке pages, хранится то, что обрабатывается на странице.
P/s еще могут быть импорты классов и возможно чего-то еще из других JS файлов.

В рамке видим, что в переменные "c", "f", присваиваются методы библиотеки. И видим, что с = классу AES. Из чего делаем вывод, что используется шифрование AES. и если данные выводятся в title расшифрованные, значит нам нужно найти ключ и IV где-то в файле.

Просмотр index.<hash>.js

Далее можем следовать за этими переменными, и возможно там где-то будет расшировка.

И видим на линиях 101,103, что используется парсинг значений (101,102), и на 103 линии расшифровака.

Поиск ключа и IV (идентификационный вектор вроде)

Для расшировки я воспользуюсь "cyber chef" и установив правильные параметры, не забывая декодировать base64, я получаю флаг:

Получение флага

Криптография в вебе


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

Report Page