
Плагин Volatility для извлечения X скриншотов из дампа памяти
Цель этого плагина для volatility — извлечение снимков экрана всех открытых окон X из дампа памяти.
Плагин volatility linux_xwindows, реализованный Адамом Бриджем
(https://github.com/bridgeythegeek/linux_xwindows), извлекает различные
метаданные из объектов окон, зарегистрированных в X, которые идентифицируются
путём обхода структур данных X-сервера. Например, для каждого
окна он выводит координаты окна, его ширину и высоту,
а также идентификатор окна. В README
Адама есть хорошее описание этих деталей, так что мы рекомендуем прочитать его,
если вам интересно!
Для справки, вот рисунок, иллюстрирующий основные структуры X и их взаимосвязи:

Для извлечения этих снимков мы повторно используем часть кода X-сервера.
Плагин сначала дампит отображения памяти X-сервера. Затем эти
отображения подаются на вход C-программе (loader) вместе с
результатом плагина Адама. Эта C-программа mmapирует (с флагом MAP_FIXED)
отображения памяти Xorg в своё собственное адресное пространство. Таким образом
мы воссоздаём адресное пространство Xorg, гарантируя, что ни одна ссылка
между кодом и данными не нарушена. Затем загрузчик вызывает функцию
(compGetImage), содержащуюся в коде Xorg, и сохраняет результат в
файл. Мы определили эту "магическую" функцию, изучив, как X обслуживает
запрос на снимок экрана при обычном использовании. К счастью, эту функцию
всегда можно точно найти, поскольку struct _Screen содержит
указатель на неё.
Ещё одно преимущество этого подхода в том, что он позволяет получить снимок экрана, даже если экран был заблокирован на момент дампа, а также окна, скрытые за другими окнами!
После клонирования этого репозитория скомпилируйте загрузчик:
gcc -Wall -o loader loader.c
Для использования плагинов:
vol.py --plugins=$PWD/plugins/ --profile=XXX -f ./vbox.dmp linux_screenshot_xwindows --out-dir /tmp/xwds/
Для преобразования результатов из xwd в png:
find /tmp/xwds/ -type f -name "*.xwd" -exec convert {} {}.png \;
Мы успешно получили снимки экрана в следующих конфигурациях:
Ubuntu 14.04 LTS — X.Org X Server 1.15.1 (дата выпуска: 2014-04-13)
Ubuntu 16.04 LTS — X.Org X Server 1.18.4 (дата выпуска: 2016-07-19)
Debian 9 Testing — X.Org X Server 1.19.6 (дата выпуска: 2017-12-20)
Kubuntu 18.04 LTS — X.Org X Server 1.19.6 (дата выпуска: 2017-12-20)
Несколько случайных, но важных замечаний:
Чтобы ограничить процесс только "рисуемыми" изображениями, мы в плагине volatility выбираем только изображения с разумным размером.
Этот инструмент работает только если Xorg использует программный рендеринг. Обычно это не так на физических машинах, но по умолчанию он использовался на протестированных нами машинах VirtualBox.
Не забывайте, что вы без проблем выполняете код, извлечённый из дампа памяти. Злоумышленнику, вероятно, несложно подделать дамп и получить выполнение кода на вашей машине. Поэтому примите необходимые меры предосторожности.
Этот проект был выполнен в рамках семестрового проекта осенью 2017 года в Eurecom двумя студентами Eurecom: Хамди Аммаром и Ахмедом Мкадимом. Руководителями проекта были Фабио Пагани и Давиде Бальцаротти.