Сегодня рассмотрим самое противоречивое задание NeoQUEST-2020: первая его часть является рекордсменом по количеству прошедших его участников, а вторая часть покорилась лишь единицам. Что же в нем такого особенного? Разбираемся под катом!
Тебе когда-нибудь приходилось исследовать дамп оперативной памяти? А знаешь ли ты, сколько всего интересного можно оттуда извлечь? (спойлер: все, включая результаты работы запущенных скриптов, недавние фотографии, а также историю браузера).
А как насчет экзотичных SQL-инъекций? Ты загружаешь определенную картинку на сайт, а тебе выдается информация из закрытой базы данных — разве это не идеальное преступление?
В первой части статьи мы рассмотрим средства для анализа дампа оперативной памяти и научимся извлекать оттуда нужную нам информацию, а во второй части статьи наглядно покажем процесс манипуляции тегами картинки для проведения хитрой инъекции:)
Итак, задании предлагается скачать архив, который содержит бинарный файл размером 1 Гб с говорящим названием memdump.bin, исходя из чего можно предположить, что это дамп оперативной памяти. Для его исследования будем использовать фреймворк volatility. Volatility поддерживает различные плагины, которые упрощают поиск и извлечение из дампа различной полезной для
Судя по выводу команды imageinfo, мы имеем дело с дампом памяти Windows 7. Далее посмотрим список запущенных процессов в системе на момент снятия дампа с помощью команды pslist:
В полученном списке можно заметить несколько интересных процессов. Начнем исследование с процесса chrome.exe — в браузере всегда можно найти что-нибудь интригующее. Для volatility существуют дополнительные плагины, которые автоматизируют извлечение информации из процессов. Например, плагин chromehistory позволит нам извлечь из дампа оперативной памяти историю посещений браузера:
В истории хрома можно заметить сразу несколько интересных вещей. Во-первых, ссылка на вторую часть задания, а также поисковые запросы про метаданные в PNG изображениях, что также является подсказкой ко второй части, но к этому обратимся позже. На текущем же этапе для нас интересны запросы про промокод
Удача! Похоже, в дампе присутствует некий 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 описание, которое представляет собой флаг:
Ура, задание пройдено! Надеемся, что мы убедили всех в миллионный раз перепроверять пользовательский ввод данных, а также беречь как зеницу ока от создания дампа свою оперативную память:)
Закончим статью цитатой великих мудрецов:
mark_ablov
Вроде целиком, там просто адреса чанков немного побитые были. Из дампа реконструировать картинку пришлось скриптом, а не через стандартные плагины volatility.
3t3rn1ty
А как Вы вытащили cat.png? Команда
volatility --profile=Win7SP1x86 -f memdump.bin -Q 0x000000003fbfed28 dumpfiles -D ./
вообще ничего не сохранила. (где 0x000000003fbfed28 — адрес \Device\HarddiskVolume2\Users\user\Desktop\mr_cat.png\mr_cat.png.png)
mark_ablov
Она не сохраняет, потому что адреса невалидные (насколько я помню, там добавлено 0x200000000 было). Я использовал флаг
--unsafe
и--summary-file
чтобы получить эти адреса, а затем: