Сегодня рассмотрим самое противоречивое задание NeoQUEST-2020: первая его часть является рекордсменом по количеству прошедших его участников, а вторая часть покорилась лишь единицам. Что же в нем такого особенного? Разбираемся под катом!


Тебе когда-нибудь приходилось исследовать дамп оперативной памяти? А знаешь ли ты, сколько всего интересного можно оттуда извлечь? (спойлер: все, включая результаты работы запущенных скриптов, недавние фотографии, а также историю браузера).
А как насчет экзотичных SQL-инъекций? Ты загружаешь определенную картинку на сайт, а тебе выдается информация из закрытой базы данных — разве это не идеальное преступление?
В первой части статьи мы рассмотрим средства для анализа дампа оперативной памяти и научимся извлекать оттуда нужную нам информацию, а во второй части статьи наглядно покажем процесс манипуляции тегами картинки для проведения хитрой инъекции:)

Итак, задании предлагается скачать архив, который содержит бинарный файл размером 1 Гб с говорящим названием memdump.bin, исходя из чего можно предположить, что это дамп оперативной памяти. Для его исследования будем использовать фреймворк volatility. Volatility поддерживает различные плагины, которые упрощают поиск и извлечение из дампа различной полезной для шантажа аналитика информации. Для начала воспользуемся командой imageinfo и получим информацию про дамп:



Судя по выводу команды imageinfo, мы имеем дело с дампом памяти Windows 7. Далее посмотрим список запущенных процессов в системе на момент снятия дампа с помощью команды pslist:



В полученном списке можно заметить несколько интересных процессов. Начнем исследование с процесса chrome.exe — в браузере всегда можно найти что-нибудь интригующее. Для volatility существуют дополнительные плагины, которые автоматизируют извлечение информации из процессов. Например, плагин chromehistory позволит нам извлечь из дампа оперативной памяти историю посещений браузера:



В истории хрома можно заметить сразу несколько интересных вещей. Во-первых, ссылка на вторую часть задания, а также поисковые запросы про метаданные в PNG изображениях, что также является подсказкой ко второй части, но к этому обратимся позже. На текущем же этапе для нас интересны запросы про промокод на скидку к сайту и pdf-файлы, что намекает на объект дальнейших поисков (также на это нас могут натолкнуть запущенные процессы Acrobat Reader`a). Попробуем найти документы формата pdf в дампе с помощью команды filescan:



Удача! Похоже, в дампе присутствует некий promo.pdf. Попробуем вытащить его, используя команду dumpfiles:



На этом этапе могут возникнут небольшие сложности из-за того, некоторые программы просмотра pdf-документов могут не распознать только что извлеченный файл (необходимо просто удалить лишние байты в конце файла). Но разве страшны нам какие-то лишние байты?:) В конце концов открываем документ и видим QR-код, прочитав который, мы получаем флаг от первой части задания (а заодно и промокод на получение подарочка от команды NeoQUEST — ведь мы дарим памятные призы всем прошедшим хотя бы одно задание участникам!).



Далее попробуем получить второй флаг. Вернемся к сайту, ссылку на который нашли в истории браузера. Для доступа на сайт требуется ввести промокод. Вспоминаем историю поиска в браузере и описание самого документа (USE THIS TO JOIN), из чего можно предположить, что первый флаг и является нужным нам промокодом. Вводим его в поле и попадаем на сайт, где нам предлагают загрузить картинку:



Судя по тому, как часто сайт зависал, наши участники решили опытным путем проверить загрузку всех возможных типов документов. Энное количество времени спустя понимаем, что на сайт можно загружать только изображения в формате PNG. Следующей головоломкой является сообщение «Not enough data to store this image, sorry!», возникающее при попытке загрузить какую-нибудь картинку.

Возвращаясь к истории браузера, вспоминаем про запросы вида «add metadata to png file». Путем несложных умозаключений делаем вывод, что, скорее всего, для загрузки изображения на сайт в его метаданные должны быть внесены определенные значения. Начать можно с изучения формата PNG (описание есть, например, тут). Сначала проверяем список стандартных ключевых слов для метаданных PNG изображений, например: «Author», «Description» и т.д. Используя, например, утилиту convert из набора ImageMagick, добавим метаданные тестовому изображению:

convert test.png -set 'Title' '1' -set 'Author' '2' -set 'Description' '3' -set 'Copyright' '4' -set 'Creation Time' '5' -set 'Software' '6' -set 'Disclaimer' '7' -set 'Warning' '8' -set 'Source' '9' -set 'Comment' '0' out.png

Пробуем загрузить полученное изображение на сайт и радуемся успеху:



Оказывается, что необходимыми полями метаданных являются Title, Description, Author и Copyright.
Подсказку к этому, к слову, можно отыскать и в дампе памяти: можно найти упоминание файла mr_cat.png, используя volatility.



Наши участники решили, что именно с помощью мистера Кота нужно провести инъекцию на сайт (на нашу почту приходила куча сообщений с мистером Котом в сжатом, перевернутом, отраженном и иных неприглядных видах), но котик здесь вообще не причем! Он просто отвлекает внимание и намекает участникам: ну же, загляни в меня, внутри есть кое-что интересное! Внутри дампа изображение сохранилось лишь частично; однако в его остатках можно заметить нужные заполненные поля метаданных:



Идем дальше: теперь мы можем загружать файлы на сайт; однако что это дает и как искать флаг? Логично предположить, что раз для загрузки требуются метаданные, то, возможно, они каким-то образом используются для хранения загруженных файлов (например, как ключи в базе данных). Ура! Мы приближаемся к десерту: необходимо проверить сайт на возможность проведения SQL-инъекции. Выясняем, что если в один из параметров подставить двойную кавычку ("), то сайт вместо загрузки изображения оповестит нас об ошибке:



Теперь мы видим сам SQL-запрос и понимаем, какими полями можем оперировать, чтобы сконструировать инъекцию для извлечения данных из используемой БД. Что касается местоположения флага, то в данном случае логично проверить самое первое изображение, которое было загружено в базу данных. Также при эксплуатации инъекции следует обратить внимание на то, что в запросе выполняется INSERT. Это заставляет конструировать специфичные запросы, потому что нельзя одновременно с операцией вставки (INSERT) явно выполнять операцию выбора (SELECT) из той же таблицы, в которую производится вставка.

Составим запрос, с помощью которого вытащим описание (Description) первого изображения в базе данных:

convert test1.png -set 'Title' '1' -set 'Author' '",(SELECT description FROM (SELECT * FROM picture) AS x limit 0,1) ) — -' -set 'Description' '3' -set 'Copyright' '4' test.png

Загрузим полученное изображение на сайт и получим в поле Copyright описание, которое представляет собой флаг:



Ура, задание пройдено! Надеемся, что мы убедили всех в миллионный раз перепроверять пользовательский ввод данных, а также беречь как зеницу ока от создания дампа свою оперативную память:)
Закончим статью цитатой великих мудрецов: