![](https://habrastorage.org/webt/gd/oc/8f/gdoc8fvxf7oimhxlgxvmijvuwmk.png)
Сегодня рассмотрим самое противоречивое задание NeoQUEST-2020: первая его часть является рекордсменом по количеству прошедших его участников, а вторая часть покорилась лишь единицам. Что же в нем такого особенного? Разбираемся под катом!
Тебе когда-нибудь приходилось исследовать дамп оперативной памяти? А знаешь ли ты, сколько всего интересного можно оттуда извлечь? (спойлер: все, включая результаты работы запущенных скриптов, недавние фотографии, а также историю браузера).
А как насчет экзотичных SQL-инъекций? Ты загружаешь определенную картинку на сайт, а тебе выдается информация из закрытой базы данных — разве это не идеальное преступление?
В первой части статьи мы рассмотрим средства для анализа дампа оперативной памяти и научимся извлекать оттуда нужную нам информацию, а во второй части статьи наглядно покажем процесс манипуляции тегами картинки для проведения хитрой инъекции:)
Итак, задании предлагается скачать архив, который содержит бинарный файл размером 1 Гб с говорящим названием memdump.bin, исходя из чего можно предположить, что это дамп оперативной памяти. Для его исследования будем использовать фреймворк volatility. Volatility поддерживает различные плагины, которые упрощают поиск и извлечение из дампа различной полезной для
![](https://habrastorage.org/webt/8b/po/2n/8bpo2nbfia9ykmdpqohz8zt4w0a.png)
Судя по выводу команды imageinfo, мы имеем дело с дампом памяти Windows 7. Далее посмотрим список запущенных процессов в системе на момент снятия дампа с помощью команды pslist:
![](https://habrastorage.org/webt/ja/1n/py/ja1npywtltvjjnzwwhbs7mkk1ho.png)
В полученном списке можно заметить несколько интересных процессов. Начнем исследование с процесса chrome.exe — в браузере всегда можно найти что-нибудь интригующее. Для volatility существуют дополнительные плагины, которые автоматизируют извлечение информации из процессов. Например, плагин chromehistory позволит нам извлечь из дампа оперативной памяти историю посещений браузера:
![](https://habrastorage.org/webt/lx/oo/o7/lxooo7skzcqwcxf-hw_njv5rmdk.png)
В истории хрома можно заметить сразу несколько интересных вещей. Во-первых, ссылка на вторую часть задания, а также поисковые запросы про метаданные в PNG изображениях, что также является подсказкой ко второй части, но к этому обратимся позже. На текущем же этапе для нас интересны запросы про промокод
![](https://habrastorage.org/webt/sb/ro/qk/sbroqkdf1jetkddyzac1rhasqh0.png)
Удача! Похоже, в дампе присутствует некий promo.pdf. Попробуем вытащить его, используя команду dumpfiles:
![](https://habrastorage.org/webt/-w/gn/iz/-wgnizdzvl_kszkhof-z1bldwxu.png)
На этом этапе могут возникнут небольшие сложности из-за того, некоторые программы просмотра pdf-документов могут не распознать только что извлеченный файл (необходимо просто удалить лишние байты в конце файла). Но разве страшны нам какие-то лишние байты?:) В конце концов открываем документ и видим QR-код, прочитав который, мы получаем флаг от первой части задания (а заодно и промокод на получение подарочка от команды NeoQUEST — ведь мы дарим памятные призы всем прошедшим хотя бы одно задание участникам!).
![](https://habrastorage.org/webt/xp/84/od/xp84odjm5frx774wqy9ka75rjws.png)
Далее попробуем получить второй флаг. Вернемся к сайту, ссылку на который нашли в истории браузера. Для доступа на сайт требуется ввести промокод. Вспоминаем историю поиска в браузере и описание самого документа (USE THIS TO JOIN), из чего можно предположить, что первый флаг и является нужным нам промокодом. Вводим его в поле и попадаем на сайт, где нам предлагают загрузить картинку:
![](https://habrastorage.org/webt/n9/kb/vu/n9kbvuleozzylxcgoa2hxy5trhq.png)
Судя по тому, как часто сайт зависал, наши участники решили опытным путем проверить загрузку всех возможных типов документов. Энное количество времени спустя понимаем, что на сайт можно загружать только изображения в формате 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
Пробуем загрузить полученное изображение на сайт и радуемся успеху:
![](https://habrastorage.org/webt/sa/7o/pw/sa7opwndturwyzaqse9f4qah83g.png)
Оказывается, что необходимыми полями метаданных являются Title, Description, Author и Copyright.
Подсказку к этому, к слову, можно отыскать и в дампе памяти: можно найти упоминание файла mr_cat.png, используя volatility.
![](https://habrastorage.org/webt/ix/bw/cn/ixbwcn3pzw3ndqxlbnfb6btadyk.jpeg)
Наши участники решили, что именно с помощью мистера Кота нужно провести инъекцию на сайт (на нашу почту приходила куча сообщений с мистером Котом в сжатом, перевернутом, отраженном и иных
![](https://habrastorage.org/webt/zv/4h/0o/zv4h0ogsh94higmrsqslbzbxzby.png)
Идем дальше: теперь мы можем загружать файлы на сайт; однако что это дает и как искать флаг? Логично предположить, что раз для загрузки требуются метаданные, то, возможно, они каким-то образом используются для хранения загруженных файлов (например, как ключи в базе данных). Ура! Мы приближаемся к десерту: необходимо проверить сайт на возможность проведения SQL-инъекции. Выясняем, что если в один из параметров подставить двойную кавычку ("), то сайт вместо загрузки изображения оповестит нас об ошибке:
![](https://habrastorage.org/webt/f7/s2/bf/f7s2bfigyph9mkfj9jfg6wfxhxc.png)
Теперь мы видим сам 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 описание, которое представляет собой флаг:
![](https://habrastorage.org/webt/vz/k8/6x/vzk86xyosytdwsvc9orcwkypybi.png)
Ура, задание пройдено! Надеемся, что мы убедили всех в миллионный раз перепроверять пользовательский ввод данных, а также беречь как зеницу ока от создания дампа свою оперативную память:)
Закончим статью цитатой великих мудрецов:
![](https://habrastorage.org/webt/qg/9i/un/qg9iunp8zncqovjy3_qg990lmlc.png)
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
чтобы получить эти адреса, а затем: