
Linux Memory Grabber Linuxメモリをダンプし、Volatility(TM)プロファイルを作成するためのスクリプト。 Hal Pomeranz ([email protected])、2020-02-01
「もし私が遠くを見たのなら、それは巨人の肩の上に立っているからです。」 ~ アイザック・ニュートン
このシンプルな小さなツールを可能にしてくれた多くの人々に感謝します。
-- AVMLを利用可能にしてくれたMicrosoftの皆さん
-- LiMEに関する研究をしてくれたJoe Sylve
-- 継続的な活動を続けるVolatility(TM)開発チーム全体。 特に、私のツール開発中に多くの厄介な質問に答えてくれたAndrew Caseに感謝します。
-- libdwarfおよびdwarfdumpへの継続的なサポートを提供してくれたDavid Anderson
-- MoonSolsのMatt Suiche。 ツールをまとめる際、デザイン目標は「DumpItと同じくらい使いやすくすること」でした(Windowsメモリをキャプチャする必要がある場合、これより使いやすいツールは知りません)。インスピレーションをありがとう、Matt!
-- ツールを改善するためのアイデアやコードを提供してくれた人々:
Julien -- 代替の出力/ビルドディレクトリとケースIDラベル、rootで実行されていない場合は中断
Jonathon Poling -- Julienのアイデアと同様
Jeff Bryner -- 各キャプチャ用のvolatilityrcファイルの作成
これらのすべての取り組みによりコミュニティはより良くなっています。私は自分のツールをクリエイティブ・コモンズ「表示」ライセンス(CC BY)の下で利用可能にすることを選びました。これにより、可能な限り広く利用できるようにしています。
Linuxメモリを解析するには、まずLinuxメモリをキャプチャできる必要があります。AVMLはうまく機能しますが、システムに/proc/kcoreや/dev/crashがない場合、Joe SylveのLinux Memory Extractor(LiME)が必要になります。しかし、RAMを取得したいシステムのカーネル用にコンパイルされたLiMEモジュールが必要です。
Volatility(TM)はLinuxメモリイメージの解析に優れています。しかし、メモリがキャプチャされたシステムと一致するプロファイルが必要です。プロファイルを構築するには、適切なシステム上でCプログラムをコンパイルし、dwarfdumpを使って重要なカーネルデータ構造のアドレスを取得する必要があります。また、/bootディレクトリからSystem.mapファイルのコピーも必要です。
ターゲットシステムの複製がある場合は、その複製上でVolatility(TM)プロファイルを構築し、必要に応じてLiMEをビルドしてターゲットのメモリをキャプチャ・解析できます。しかし、ターゲットシステムの複製が利用できない状況は多くあります。そのため、ターゲットマシン上でVolatility(TM)プロファイルとLiMEを構築しなければならない場合があります。
そして、これは初心者向けではありません。多くの手順があり、かなり低レベルのLinuxコマンドが含まれています。私の目標は、(専門家が)USBメモリにインストールし、現場のエージェントに配布できるパッケージを作成することでした。USBメモリのユーザーは、USBメモリを挿入し、単一のコマンドを実行するだけで、ターゲットマシンのメモリイメージと動作するVolatility(TM)プロファイルを正常に取得できるようにする必要があります。その結果が、lmg(Linux Memory Grabber)スクリプトです。
フォレンジックの純粋性にこだわる方には、このツールは適さないかもしれません。私のツールがターゲットシステムと相互作用する方法についていくつか説明します。
リムーバブルメディア -- このツールは、USBメモリなどのポータブルUSBデバイスから実行するように設計されています。書き込み可能なデバイスをターゲットシステムに接続することになりますが、そのデバイスはシステム上の悪意のあるユーザーやマルウェアの標的になる可能性があります。デバイスをシステムに接続する行為自体がマシンの状態を変更します(例:ログエントリ、mtabエントリの作成など)。デバイスがオペレーティングシステムによって自動マウントされない場合、ユーザーはrootシェルから手動でデバイスをマウントする必要があります。
コンパイル -- Volatility(TM)プロファイルの作成には、ターゲットマシン上でのコードのコンパイルが必要です。同様に、AVMLが動作しない場合のLiMEのビルドも同様です。そのため、gccが実行され、ヘッダファイルが読み込まれ、ライブラリがリンクされるなどが行われます。lmgは、TMPDIRをlmgが実行されているUSBデバイス上のディレクトリに設定することで、ターゲットマシンのファイルシステムへの影響を最小限に抑えようとします。つまり、コンパイラによって作成された中間ファイルは、ターゲットマシンのローカルファイルシステムではなく、USBメモリに書き込まれます。
依存関係 -- Linux上でカーネルコードをコンパイルするには、gcc、makeなどの動作する開発環境、および適切なインクルードファイルと共有ライブラリがターゲットマシンに存在する必要があります。特に、カーネルヘッダファイルがローカルマシンに存在する必要があります。これらの依存関係がターゲットに存在しない場合があります。その場合、ユーザーは適切な依存関係をインストールする(可能であれば)か、システムのVolatility(TM)プロファイルを構築できないかの選択を迫られます。
マルウェア -- lmgはターゲットマシン上の/bin/bash、gcc、zip、その他多くのプログラムを使用します。システムが侵害されている場合、lmgが使用するアプリケーションは信頼できない可能性があります。より完全な解決策は、ポータブルUSBデバイス上にlmgのための安全な実行環境を作成することですが、これは最初の概念実証の範囲を超えていました。
メモリ -- 実行されるすべてのコマンドにより、ターゲットシステムのメモリが変更されます。RAMのキャプチャ行為自体は常にアーティファクトを作成しますが、この場合、RAMダンパーの実行に加えて、広範なコンパイル、ファイルシステムへのアクセスなどが行われます。
以上のことから、lmgは、スキルの低いエージェントがターゲットシステムから有用なメモリ分析データを取得するための非常に便利なツールです。
AVMLが失敗した場合、lmgはUSBデバイス上に、ターゲットマシンのカーネルバージョンとプロセッサアーキテクチャに一致する既存のLiMEモジュールを探します。見つかった場合、lmgは再コンパイルしません。同様に、ターゲットシステムへの影響を最小限にするために、lmgがVolatility(TM)プロファイルを作成しないように選択することもできます。
lmgはgccやzipなどのプログラムを呼び出す際に相対パス名を使用します。したがって、これらのプログラムを代替メディアから実行したい場合は、lmgを実行する前に$PATHを適宜更新してください。
まず、lmgに付属のINSTALLドキュメントの指示に従ってUSBメモリを準備します。
RAMを取得するには、USBメモリをターゲットシステムに挿入します。ほとんどのLinuxシステムでは、新しいUSBデバイスは自動的に/mediaの下にマウントされます。例として、デバイスが/media/LMGにマウントされたと仮定します。
次に、rootとして「/media/LMG/lmg」を実行します。これは対話型モードで、lmgがシステム用のLiMEモジュールをビルドしたりVolatility(TM)プロファイルを作成する前に、ユーザーに確認を求めます。確認を求められたくない場合は、「/media/LMG/lmg -y」を使用します。
その他はすべて自動化されています。スクリプトの実行後、USBメモリ上に次の名前の新しいディレクトリが作成されます。
".../capture/-YYYY-MM-DD_hh.mm.ss"
lmgは、デフォルトの「-YYYY-MM-DD_hh.mm.ss」ディレクトリの代わりに使用するケースIDディレクトリ名を指定するための-cオプションをサポートしています。
使用されるディレクトリ名に関係なく、そのディレクトリには以下が含まれます。
-YYYY-MM-DD_hh.mm.ss-memory.lime -- RAMキャプチャ -YYYY-MM-DD_hh.mm.ss-profile.zip -- Volatility(TM)プロファイル -YYYY-MM-DD_hh.mm.ss-bash -- ターゲットの/bin/bashのコピー volatilityrc -- プロトタイプのVolatility設定ファイル
volatilityrcファイルは、キャプチャされたメモリとプラグインの適切な場所を定義します。このファイルの使用方法については、以下の使用例を参照してください。
/bin/bashのコピーは、メモリキャプチャ内のbashプロセスのメモリにあるシェル履歴データ構造のアドレスを特定するのに役立ちます。この実行可能ファイルの使用方法の詳細については、https://github.com/volatilityfoundation/volatility/wiki/Linux-Command-Reference#linux_bash を参照してください(または以下の使用例を参照)。
lmgを実行しているメディアにデータを書き込みたくない場合があることに注意してください。たとえば、lmgツールがDVD-ROMのような読み取り専用メディアにある場合などです。lmgは、別の出力ディレクトリを指定するための-dオプションをサポートしています。デフォルトでは、すべてのコンパイルはターゲットディレクトリで行われますが、ユーザーは-Bオプションで代替のコンパイルディレクトリを指定することもできます。
以下はlmgツールの使用例です。これには、USBメモリから直接Volatility(TM)を使用してキャプチャしたイメージを分析することも含まれています。私のテストマシンでは、USBメモリは/dev/sdbにあり、オペレーティングシステムによって自動マウントされませんでした。そのため、すべて手動で行いました。
[root@localhost ~]$ sudo -s [sudo] password for lab: [root@localhost lab]# mkdir -p /mnt/usb [root@localhost lab]# mount /dev/sdb1 /mnt/usb
[root@localhost lab]# /mnt/usb/lmg -y AVML is /mnt/usb/avml/avml-x86_64 Dumping memory in "lime" format to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 This could take a while...Done! Grabbing a copy of /bin/bash...Done! Writing volatilityrc to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55...Done! make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' rm -f module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build CONFIG_DEBUG_INFO=y M="/mnt/usb/volatility-master/tools/linux" modules make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CC [M] /mnt/usb/volatility-master/tools/linux/module.o Building modules, stage 2. MODPOST 1 modules WARNING: modpost: missing MODULE_LICENSE() in /mnt/usb/volatility-master/tools/linux/module.o see include/linux/module.h for more information CC /mnt/usb/volatility-master/tools/linux/module.mod.o LD [M] /mnt/usb/volatility-master/tools/linux/module.ko make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' dwarfdump -di module.ko > module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CLEAN /mnt/usb/volatility-master/tools/linux/.tmp_versions CLEAN /mnt/usb/volatility-master/tools/linux/Module.symvers make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' adding: module.dwarf (deflated 90%) adding: boot/System.map-4.18.0-147.3.1.el8_1.x86_64 (deflated 79%)
[root@localhost lab]# cd /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ls localhost.localdomain-2020-02-01_08.16.55-bash localhost.localdomain-2020-02-01_08.16.55-memory.lime localhost.localdomain-2020-02-01_08.16.55-profile.zip volatilityrc [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_banner Volatility Foundation Volatility Framework 2.6.1 Linux version 4.18.0-147.3.1.el8_1.x86_64 ([email protected]) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jan 3 23:55:26 UTC 2020
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# gdb localhost.localdomain-2020-02-01_08.16.55-bash GNU gdb (GDB) Red Hat Enterprise Linux 8.2-6.el8_0 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: http://www.gnu.org/software/gdb/bugs/. Find the GDB manual and other documentation resources online at: http://www.gnu.org/software/gdb/documentation/.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from localhost.localdomain-2020-02-01_08.16.55-bash...Missing separate debuginfo for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash
Try: dnf --enablerepo='debug' install /usr/lib/debug/.build-id/b6/858d77c486b7b596f22956149bbc9f8058d98d.debug
Reading symbols from .gnu_debugdata for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash...(no debugging symbols found)...done.
(no debugging symbols found)...done.
(gdb) disass history_list
Dump of assembler code for function history_list:
0x00000000000ccea0 <+0>: endbr64
0x00000000000ccea4 <+4>: mov 0x24b09d(%rip),%rax # 0x317f48
0x00000000000cceab <+11>: retq
End of assembler dump.
(gdb) quit
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_bash -H 0x317f48
Volatility Foundation Volatility Framework 2.6.1
Pid Name Command Time Command
13822 bash 2020-01-30 20:25:39 UTC+0000 uname -a 13822 bash 2020-01-30 20:25:39 UTC+0000 ls 13822 bash 2020-01-30 20:25:39 UTC+0000 sudo -s 13822 bash 2020-01-30 20:25:39 UTC+0000 fg [... more output not shown ...]