
メモリダンプからX枚のスクリーンショットを抽出するVolatilityプラグイン
このvolatilityプラグインの目的は、メモリダンプからすべての開いているXウィンドウのスクリーンショットを抽出することです。
Adam Bridge (https://github.com/bridgeythegeek/linux_xwindows) が作成したvolatilityプラグイン linux_xwindows は、Xサーバのデータ構造を辿って特定される、Xに登録されているウィンドウオブジェクトから様々なメタデータを抽出します。例えば、各ウィンドウについて、ウィンドウの座標、幅と高さの寸法、ウィンドウ識別子をリストします。Adamの README にはこれらの詳細に関する良い議論があるので、興味があれば読んでみることをお勧めします!
参考として、Xの主要な構造とその相互依存関係を示す図を以下に示します:

これらのスクリーンショットを抽出するために、Xサーバコードの一部を再利用します。
プラグインは最初にXサーバのメモリマッピングをダンプします。これらのマッピングは、Adamのプラグインの出力と共に、Cプログラム (loader) への入力として与えられます。このCプログラムはXorgのメモリマッピングを(MAP_FIXEDフラグを使用して)自身のアドレス空間に 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の学生2名(Hamdi AmmarとAhmed Mkadem)によって実現されました。監督者は Fabio Pagani と Davide Balzarotti でした。