4ensiX

4ensiX

FPと言ったものはFPを選んだが表示はTPになっていることに気づいた。

redhat系Linuxのvolatility3プロファイルの作成 rocky linuxでの作業例

volatility3のプロファイル

volatility3でWindowsのメモリ解析を行う場合には,解析時にインターネットから自動的に必要なプロファイルがダウンロードされる.
Linuxの場合はメモリに合わせたプロファイルを作成する必要がある.

Linuxの場合には,基本的に対応するバージョンのカーネルデバッグに関するパッケージをインストールし,
vmlinuxを用いて専用ツールでプロファイルを作成する.
プロファイルの作成は,基本的にメモリダンプを取得したマシン自体のイメージは必要無い.
同じカーネルバージョンのマシンを用意してプロファイル作成を行う.
おそらく,メモリ解析対象のマシンがカスタムカーネルを利用している場合には,
対象マシンのvmlinuxを利用してプロファイルの作成が必要となる.(カスタムカーネルは未検証)

メモリはvolatility3のbanners.Bannersにより,メモリを取得したシステムのバージョンなどを取得することができる.

rocky linux 8.6のメモリプロファイル作成例

$ python3 volatility3/vol.py -f rock19-1/rock19-1.mem banners.Banners
Volatility 3 Framework 2.4.2
Progress:  100.00       PDB scanning finished                      
Offset  Banner

0xb800100   Linux version 4.18.0-372.19.1.el8_6.x86_64 (mockbuild@dal1-prod-builder001.bld.equ.rockylinux.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)) #1 SMP Tue Aug 2 16:19:42 UTC 2022

上記のようなrocky linux 8.6,Linux version 4.18.0-372.19.1.el8_6.x86_64のメモリのプロファイルを作成する.
rocky linuxの場合には http://dl.rockylinux.org/vault/rocky/ にインストールイメージや過去のパッケージ等が公開されている.

まずは,rocky linux 8.6のインストールする.例えば, http://dl.rockylinux.org/vault/rocky/8.6/Live/x86_64/ からliveイメージをダウンロードできる.
インストール作業の後に http://dl.rockylinux.org/vault/rocky/8.6/BaseOS/x86_64/debug/tree/Packages/k/ から対応したバージョンの必要なパッケージを取得する.

1.カーネルバージョンを合わせる

結局のところvmlinuxを取得できれば良いので合わせる必要は無い可能性もあるが,
念のためプロファイル作成を行うマシンのカーネルバージョンをLinux version 4.18.0-372.19.1.el8_6.x86_64に合わせる.

$ uname -a
Linux localhost.localdomain 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$ sudo yum --releasevre=8.6 updateinfo list kernel
(snip)
RLSA-2022:~~~ kernel-4.18.0-372.19.1.el8_6.x86_64
(snip)
$ sudo yum --releasever=8.6 update kernel-4.18.0-372.19.1.el8_6.x86_64
$ reboot
# 4.18.0-372.19.1.el8_6.x86_64を選択して起動

再起動後にはインストールしたカーネルバージョンを指定して起動する.

2.プロファイル作成に必要なvmlinuxの取得

$ uname -r # バージョンの確認
4.18.0-372.19.1.el8_6.x86_64
$ sudo yum install wget git #必要なパッケージのインストール
$ wget http://dl.rockylinux.org/vault/rocky/8.6/BaseOS/x86_64/debug/tree/Packages/k/kernel-debuginfo-common-x86_64-4.18.0-372.19.1.el8_6.x86_64.rpm #必要なrpmパッケージの取得
$ wget http://dl.rockylinux.org/vault/rocky/8.6/BaseOS/x86_64/debug/tree/Packages/k/kernel-debuginfo-4.18.0-372.19.1.el8_6.x86_64.rpm
$ wget http://dl.rockylinux.org/vault/rocky/8.6/BaseOS/x86_64/debug/tree/Packages/k/kernel-debug-debuginfo-4.18.0-372.19.1.el8_6.x86_64.rpm
$ sudo rpm -i kernel-debuginfo-common-x86_64-4.18.0-372.19.1.el8_6.x86_64.rpm #rpmパッケージのインストール
$ sudo rpm -i kernel-debuginfo-4.18.0-372.19.1.el8_6.x86_64.rpm
$ sudo rpm -i kernel-debug-debuginfo-4.18.0-372.19.1.el8_6.x86_64.rpm

3.プロファイル作成のためのツールの取得

プロファイル作成のためにvolatility公式で配布されているgoで書かれたツールを利用する.

$ sudo yum install golang
$ git clone https://github.com/volatilityfoundation/dwarf2json
$ cd dwarf2json/
$ go mod download github.com/spf13/pflag
$ go build

注意:インストールしたgolangが14.0より低い場合にはgoのツールをビルドできない場合がある.
もしもgo buildが上手くいかなかった場合には,go mod download github.com/spf13/pflagが正常に実行されたこと,
goのバージョンを確認する.

4.プロファイルの作成

2までが正常に行われていれば,/usr/lib/debug/usr/lib/modules/以下の目的のカーネルバージョンのディレクトリに目的のvmlinuxが生成されている.
vmlinuxとdwarf2jsonを用いて,プロファイルを作成する.

また,プロファイルの作成には少なくとも4GBではメモリ不足でプロファイル作成に失敗する.
正確には最低限必要なメモリ量は分かっていないが,今回のプロファイル作成であれば8GBならば正常に実行できる.

$ cp /usr/lib/debug/usr/lib/modules/4.18.0-372.19.1.el8_6.x86_64/vmlinux /tmp/vmlinux #念のためコピーを作成
$ ls -alh /tmp/vmlinux 
-rwxr-xr-x. 1 user user 884M May 27 22:04 /tmp/vmlinux
$ ./dwarf2json linux --elf /tmp/vmlinux > rocky-linux_4.18.0-372.19.1.el8_6.x86_64.json #プロファイルの命名は,お好みで

作成したプロファイルの設置

volatility3をソースから実行している場合には,volatility3/volatility3/framework/symbols/linux/以下置くことでプロファイルが自動的に適用される.
setup.pyを用いてインストールしている場合には,
例えばvol -vvv -f memory.mem banners.Bannersのように-vvvオプションを用いて実行すると
プロファイル(~/symbol/)やプラグイン(~/plugin/)を設置するためのディレクトリパスが分かる.

linux.pstreeによって正しくプロセスツリーが取得できていれば正常に作成できている.
例えば,rocky linux 8.6の場合.

$ cp rocky-linux_4.18.0-372.19.1.el8_6.x86_64.json ./volatility3/volatility3/framework/symbols/linux/.
$ python3 ../volatility3/vol.py -f rock19-1.mem linux.pstree
Volatility 3 Framework 2.4.2
Progress:  100.00       Stacking attempts finished                 
OFFSET (V)  PID TID PPID    COMM

0x8b110189a800  1   1   0   systemd
* 0x8b11066ad000    687 687 1   systemd-journal
(snip)
* 0x8b1106f08000    863 863 1   sssd
** 0x8b1104688000   885 885 863 sssd_be
** 0x8b1105c00000   893 893 863 sssd_nss
* 0x8b1105c05000    890 890 1   chronyd
* 0x8b110468d000    897 897 1   firewalld
* 0x8b11065dd000    898 898 1   ModemManager
* 0x8b1103a05000    914 914 1   systemd-logind
* 0x8b1103a00000    915 915 1   accounts-daemon
* 0x8b1102d9a800    982 982 1   NetworkManager
* 0x8b1103d90000    993 993 1   tuned
* 0x8b11044b2800    1210    1210    1   rsyslogd
* 0x8b1103d92800    1217    1217    1   atd
* 0x8b1106cf8000    1219    1219    1   crond
* 0x8b1102d9d000    1220    1220    1   lightdm
** 0x8b11062ba800   1252    1252    1220    Xorg
** 0x8b1107aba800   1706    1706    1220    lightdm
*** 0x8b1103d95000  1727    1727    1706    xfce4-session
**** 0x8b1107ab8000 1739    1739    1727    ssh-agent
**** 0x8b1107bad000 1806    1806    1727    xfwm4
**** 0x8b11078b8000 1810    1810    1727    xfsettingsd
**** 0x8b1107978000 1813    1813    1727    xfce4-panel
(snip)

他のredhat系について

他のredhat系に関しても同様に3つのパッケージをインストールすることで,プロファイルの作成ができると考える.

  • kernel-debuginfo-common-XXXXXX.rpm
  • kernel-debuginfo-XXXXXX.rpm
  • kernel-debug-debuginfo-XXXXXX.rpm

Redhat -> How can I download or install kernel debuginfo packages for RHEL systems? - Red Hat Customer Portal
Centos -> CentOS Debuginfo Mirror