Форензика, SQL-инъекция и многострадальный котик: разбор задания №3 online-этапа NeoQUEST-2020

vadox

Начинающий
Регистрация
Сообщения
17
Реакции
0
gdoc8fvxf7oimhxlgxvmijvuwmk.png

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

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

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

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

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

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

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

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

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

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

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

vadox

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

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

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

k3ha

Начинающий
Регистрация
Сообщения
14
Реакции
0
Вроде целиком, там просто адреса чанков немного побитые были. Из дампа реконструировать картинку пришлось скриптом, а не через стандартные плагины volatility.
 

Zews321

Начинающий
Регистрация
Сообщения
9
Реакции
0
А с чем связано у вас такое поведение?
Если я ввожу
...select author from (select * from picture) as X limit 1)…
То получаю ответ: Copyright: Man from the Ship
А если: select author from (select author from picture) as X limit 1)
то выводит Copyright:-
Хотя по идеи должно и так и так выводить первую запись.
 
Сверху