本 Volatility 插件的目标是从内存转储中提取所有打开的 X 窗口的屏幕截图。
由 Adam Bridge(https://github.com/bridgeythegeek/linux_xwindows)实现的 Volatility 插件 linux_xwindows 提取了注册到 X 的窗口对象的各种元数据,这些元数据通过遍历 X 服务器的数据结构进行识别。例如,对于每个窗口,它会列出窗口坐标、宽度和高度尺寸以及窗口标识符。Adam 的 README 对这些细节有很好的讨论,如果您感兴趣,建议阅读!
作为参考,这里有一张图展示了 X 的核心结构及其相互依赖关系:

为了提取这些屏幕截图,我们重用了部分 X 服务器代码。
该插件首先转储 X 服务器的内存映射。然后,这些映射与 Adam 插件的输出一起作为输入提供给一个 C 程序(loader)。这个 C 程序使用 MAP_FIXED 标志将 Xorg 的内存映射 mmap 到自己的地址空间。这样,我们重新创建了 Xorg 的地址空间,确保代码和数据之间的所有引用都不会被破坏。然后,加载器调用 Xorg 代码中包含的函数(compGetImage)并将结果保存到文件中。我们通过观察 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 学生实现:Hamdi Ammar 和 Ahmed Mkadem。项目指导人为 Fabio Pagani 和 Davide Balzarotti。