Volatility を使用して、アプリケーション、ネットワーク接続、カーネル・モジュール、ファイルなどについて調べます。
コンピュータのオペレーティングシステムとアプリケーションは、メインメモリを使用してさまざまなタスクを実行します。この揮発性メモリには、実行中のアプリケーションの内容、ネットワーク接続、カーネルモジュール、開いているファイルなど、ほとんどすべての情報が含まれていますが、これらの情報はコンピュータが再起動するたびに消去されます。
、プラグインを使用してこの情報を処理するオープンソースツールです。しかし、問題があります。この情報を処理する前に、物理メモリをファイルにダンプする必要がありますが、Volatilityにはその機能がありません。
そのため、この記事は2つのパートに分かれています:
- 最初のパートは、物理メモリを取得し、それをファイルにダンプすることを扱います。
- 第2部では、Volatilityを使ってこのメモリダンプから情報を読み取り、処理します。
このチュートリアルでは以下のテストシステムを使用しましたが、どのLinuxディストリビューションでも動作します:
$ cat /etc/redhat-releaseRed Hat Enterprise Linux release 8.3 (Ootpa)$ uname -r4.0.el8.x86_64
注: パート1では、カーネルモジュールのコンパイルとロードを行います。ご心配なく:言うほど難しくはありません。
いくつかのガイドラインがあります:
- 以下の手順に従ってください。
- 本番システムまたはプライマリコンピュータでは、これらの手順を実行しないでください。
- ツールの使い方に慣れ、その仕組みを理解するまで、常にテストVMで試してください。
必要なパッケージのインストール
最初に必要なツールをインストールします。Debianベースのディストリビューションをいつも使っているのであれば、apt-getコマンドを使うことができます。これらのパッケージのほとんどは、必要なカーネル情報とコードをコンパイルするためのツールを提供します:
$ yum install kernel-headers kernel-devel gcc elfutils-libelf-devel make git libdwarf-tools python2-devel.x86_64-y
パート1:LiMEを使用してメモリを取得し、ファイルにダンプします。
メモリの分析を開始するには、使用するメモリダンプが必要です。実際のフォレンジック活動では、これは侵害された、または侵害されたシステムから来る可能性があります。この情報は通常、侵入がどのように発生したか、またその影響を分析するために収集され、保存されます。利用可能なメモリ・ダンプを持っていない可能性があるため、テストVMのメモリ・ダンプを取得し、それを使用してメモリ・フォレンジックを実行することができます。
(LiME)はLinuxシステム上でメモリを取得するための非常に一般的なツールです。LiMEを取得するには、以下のコマンドを使用します:
$ git clone https://.//.it$ cd LiME/src/deflate.c & nbsp; disk.c & nbsp; hash.c & nbsp; lime.a & nbsp; main.c & nbsp; Makefile & nbsp; Makefile.sample & nbsp; tcp.c;
LiMEカーネルモジュールのビルド
srcフォルダでmakeコマンドを実行します。これで拡張子.koのカーネルモジュールが作成されます。理想的には、makeの最後に、lime.koファイルは フォーマットでリネームされます。
make -C /lib/modules/4.0.el8.x86_64/build M="/root/LiME/src" modulesmake[1]: Entering directory '/usr/src/kernels/4.0.el8.x86_64'<< >>make[1]: Leaving directory '/usr/src/kernels/4.0.el8.x86_64'strip --strip-unneeded lime.komv lime.ko lime-4.0.el8.x86_64.ko$ ls -l lime-4.0.el8.x86_64.ko-rw-r--r--. 1 root root 25696 Apr lime-4.0.el8.x86_64.ko$ file lime-4.0.el8.x86_64.kolime-4.0.el8.x86_64.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1d0b5cfdbb8e46c9cf, not stripped
LiMEカーネルモジュールのロード
insmodコマンドはカーネル・モジュールをロードするのに役立ちます。ロードされると、モジュールはシステム上のメイン・メモリを読み込み、コマンドラインで指定されたパス・ディレクトリのファイルにメモリの内容をダンプします。もう一つの重要なパラメータはフォーマットです。カーネルモジュールを挿入したら、lsmodコマンドを使用して、実際にロードされていることを確認します。
$ lsmod | grep lime$ insmod ./lime-4.0.el8.x86_64.ko "path=../RHEL8.3_64bit.mem format=lime"$ lsmod | grep limelime 16384 0
pathコマンドで指定されたファイルが作成され、システムの物理メモリサイズと同じサイズになっていることが確認できるはずです。メモリダンプができたら、rmmodコマンドを使ってカーネルモジュールを削除できます:
$ ls -l ~/LiME/RHEL8.3_64bit.mem-r--r--r--. 1 root root Apr /root/LiME/RHEL8.3_64bit.mem$ du -sh ~/LiME/RHEL8.3_64bit.mem4.0G /root/LiME/RHEL8.3_64bit.mem$ free -mtotal used free shared buff/cache availableMem: 3736 220 366 8 3149 5239Swap: 4059 8 5041$ rmmod lime$ lsmod | grep lime
メモリーダンプの中身は?
このメモリダンプファイルは、fileコマンドで見ることができるように、単なる生データです。hexdumpの出力は、最初の数バイトがEmiLであることを示しています。これは、上記のコマンドラインでリクエストフォーマットがライムであるためです:
$ file ~/LiME/RHEL8.3_64bit.mem/root/LiME/RHEL8.3_64bit.mem: data$ hexdump -C ~/LiME/RHEL8.3_64bit.mem | head4c 00 00 00 |EMiL............|ff fb 00 00 |................|b8 fe 4c cd 32 2a 2a 2a 2a 2a |..L.!D.2 ..*****|2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************|2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |************* . |00 00 00 00 |................|00 00 65 6c |............pxel|00 00 00 00 |inux.0..........|a0 00 00 00 00 |................|
パート2:ボラティリティの取得とメモリ・ダンプの分析への利用
$ git clone https://.//.it$ cd volatility/AUTHORS.txt contrib LEGAL.txt Makefile PKG-INFO pyinstaller.spec resources tools vol.pyCHANGELOG.txt CREDITS.txt LICENSE.txt MANIFEST.in pyinstaller README.txt setup.py volatility
Volatility はその機能の一部に 2 つの Python ライブラリを使用しているため、以下のコマンドを使用してそれらをインストールしてください。そうしないと、Volatility ツールを実行したときにいくつかのインポート・エラーが表示されることがあります。実行するプラグインがこれらのライブラリを必要とする場合を除き、これらのエラーは無視してかまいません:
$ pip2 install pycrypto$ pip2 install distorm3
VolatilityのLinux設定ファイルのリスト
最初に実行する Volatility コマンドは、利用可能な Linux 設定ファイルを一覧表示します。 Volatility コマンドを実行するための主なエントリーポイントは、vol.py スクリプトです。このスクリプトを Python 2 インタプリタで呼び出し、--info オプションを指定します。出力を絞り込むには、Linux で始まる文字列を探します。見ての通り、Linux の設定ファイルはあまり多くありません:
$ python2 vol.py --info | grep ^LinuxVolatility Foundation Volatility Framework 2.6.1LinuxAMD64PagedMemory - Linux-specific AMD 64-bit address space.
独自のLinux設定ファイルの構築
Linux ディストリビューションは多様で、さまざまなアーキテクチャ向けに構築されています。Volatilityは、情報を抽出する前に、メモリ・ダンプがどのシステムとアーキテクチャから取得されたかを知る必要があります。この情報を見つけることができる Volatility コマンドがありますが、この方法は時間がかかります。この方法を高速化するには、次のコマンドを使用してカスタム Linux 構成ファイルを構築します:
Volatility リポジトリの ディレクトリに移動し、make コマンドを実行します:
$ cd tools/linux//root/volatility/tools/linuxkcore & nbsp; Makefile & nbsp; Makefile.a & nbsp; module.c;make - C;make[1]: Entering directory '/usr/src/kernels/4.0.el8.x86_64'<< >>make[1]: Leaving directory '/usr/src/kernels/4.0.el8.x86_64'
新しいmodule.dwarfファイルが表示されるはずです。また、/bootディレクトリにあるSystem.mapファイルも必要です。このファイルには、現在実行中のカーネルに関連するすべてのシンボルが含まれているからです:
kcore & nbsp; Makefile & nbsp; Makefile.obj & nbsp; module.c & nbsp; module.a;$ ls -l module.dwarf-rw-r--r--. 1 root root Apr module.dwarf$ ls -l /boot/System.map-4.0.el8.x86_64-rw-------. 1 root root Sep 23 2020 /boot/System.map-4.0.el8.x86_64
カスタム構成ファイルを作成するには、Volatility ディレクトリに戻って次のコマンドを実行します。最初のパラメータには、独自の名前のカスタム .zip ファイルを指定します。私はよく、オペレーティング・システムとカーネルのバージョンを使用します。次の引数は、先ほど作成した module.dwarf ファイルで、最後の引数は /boot ディレクトリの System.map ファイルです:
$ cd volatility/$ zip volatility/plugins/overlays/linux/Redhat8.3_4.0.zip tools/linux/module.dwarf /boot/System.map-4.0.el8.x86_64adding: tools/linux/module.dwarf (deflated 91%)adding: boot/System.map-4.0.el8.x86_64 (deflated 79%)
これでカスタム構成ファイルの準備は完了です。.zip ファイルが先ほど指定した場所に作成されていることを確認してください。Volatility がこのカスタム構成ファイルを検出したかどうかを知りたい場合は、もう一度 --info コマンドを実行してください。これで、以下のリストに新しい構成ファイルが表示されるはずです:
$ ls -l volatility/plugins/overlays/linux/Redhat8.3_4.0.zip-rw-r--r--. 1 root root Apr volatility/plugins/overlays/linux/Redhat8.3_4.0.zip$ python2 vol.py --info | grep RedhatVolatility Foundation Volatility Framework 2.6.1LinuxRedhat8_3_4_0x64 - A Profile for Linux Redhat8.3_4.0 x64
ボラティリティ入門
これで、本格的なメモリ・フォレンジックを行う準備が整いました。Volatilityは、情報を取得するためにメモリ・ダンプのターゲットとすることができるカスタム・プラグインで構成されていることを覚えておいてください。コマンドの一般的な形式は次のとおりです:
python2 vol.py -f <memory-dump-file-taken-by-Lime> <plugin-name> --profile=<name-of-our-custom-profile>
この情報をもとに プラグインを実行し、メモリダンプから正しいディストロ情報を特定できるか確認してください:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_banner --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1Linux version 4.0.el8.x86_64 ([mockbuild@vm09.test.com][4]) (gcc version 8.3.1 (Red Hat 8.3.1-5) (GCC)) #1 SMP Wed Sep :10 EDT 2020
Linuxプラグインの検索
ここまではうまくいったので、次はLinuxプラグインの名前を調べる方法に興味があることでしょう。簡単なコツがあります:--infoコマンドを実行してlinux_文字列を取得します。目的に応じて様々なプラグインがあります。以下はその一部です:
$ python2 vol.py --info | grep linux_Volatility Foundation Volatility Framework 2.6.1linux_apihooks - Checks for userland apihookslinux_arp - Print the ARP tablelinux_aslr_shift - Automatically detect the Linux ASLR shift<< >>linux_banner - Prints the Linux banner informationlinux_vma_cache - Gather VMAs from the vm_area_struct cachelinux_volshell - Shell in the memory imagelinux_yarascan - A shell in the Linux memory image
linux_psauxプラグインを使って、メモリダンプ時にシステムで実行されているプロセスをチェックしてください。リストの最後のコマンドに注意してください: ダンプ時に実行したinsmodコマンドです。
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_psaux --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1Pid Uid Gid Arguments1 0 0 /usr/lib/systemd/systemd --switched-root --system --deserialize 182 0 0 [kthreadd]3 0 0 [rcu_gp]4 0 0 [rcu_par_gp]861 0 0 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P869 0 0 /usr/bin/rhsmcertd875 0 0 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files878 0 0 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files<< >>89 89 qmgr -l -t unix -u0 0 [kworker/0:0]0 0 -bash0 0 [kworker/u2:1]0 0 [kworker/0:2]0 0 [kworker/0:3]0 0 insmod ./lime-4.0.el8.x86_64.ko path=../RHEL8.3_64bit.mem format=lime0 0
システムのネットワーク・ステータスを知りたいですか? プラグインを実行すると、メモリダンプ中にネットワーク接続のステータスを見つけることができます:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_netstat --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1UNIX 18113 systemd/1 /run/systemd/privateUNIX systemd/1 /run/systemd/notifyUNIX 11413 systemd/1 /run/systemd/cgroups-agentUNIX 11415 systemd/1UNIX 11416 systemd/1<< >>
次に、 プラグインを使って、メモリダンプ中にどのファイルシステムがマウントされているかを確認します:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_mount --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexeccgroup /sys/fs/cgroup/pids cgroup rw,relatime,nosuid,nodev,noexecsystemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatimesunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime/dev/mapper/rhel_kvm--03--guest11-root / xfs rw,relatimetmpfs /dev/shm tmpfs rw,nosuid,nodevselinuxfs /sys/fs/selinux selinuxfs rw,relatime<< >>cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,relatime,nosuid,nodev,noexeccgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,relatime,nosuid,nodev,noexecbpf /sys/fs/bpf bpf rw,relatime,nosuid,nodev,noexeccgroup /sys/fs/cgroup/memory cgroup ro,relatime,nosuid,nodev,noexeccgroup /sys/fs/cgroup/cpuset cgroup rw,relatime,nosuid,nodev,noexecmqueue /dev/mqueue mqueue rw,relatime
どのカーネル・モジュールがロードされるのか気になるところですが、Volatilityはそのためのプラグイン 提供しています:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsmod --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1ffffffffc lime 40280ffffffffc binfmt_misc 40280ffffffffc sunrpc<< >>ffffffffc nfit 55636ffffffffc dm_mirror 68272ffffffffc dm_region_hash 40280ffffffffc dm_log 40280ffffffffc024bbc0 dm_mod
どのファイルがどのプロセスで開かれているか知りたいですか?この情報を一覧表示するには プラグインを使用します:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_bash --profile=LinuxRedhat8_3_4_0x64 -vVolatility Foundation Volatility Framework 2.6.1Pid Name Command Time Command-------- -------------------- ------------------------------ -------bash UTC+0000 lsmodbash UTC+0000 rm -f .logbash UTC+0000 ls -l /etc/zzzbash UTC+0000 cat ~/.vimrcbash UTC+0000 lsbash UTC+0000 cat /proc/817/cwdbash UTC+0000 ls -l /proc/817/cwdbash UTC+0000 ls /proc/817/<< >>bash UTC+0000 gcc prt.cbash UTC+0000 lsbash UTC+0000 ./a.outbash UTC+0000 vim prt.cbash UTC+0000 gcc prt.cbash UTC+0000 ./a.outbash UTC+0000 ls
どのファイルがどのプロセスで開かれているか知りたいですか?この情報を一覧表示するには プラグインを使用します:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsof --profile=LinuxRedhat8_3_4_0x64Volatility Foundation Volatility Framework 2.6.1Offset Name Pid FD Path------------------ ------------------------------ -------- -------- ----0xffff9c83fb1e9f40 rsyslogd 71194 0 /dev/null0xffff9c83fb1e9f40 rsyslogd 71194 1 /dev/null0xffff9c83fb1e9f40 rsyslogd 71194 2 /dev/null0xffff9c83fb1e9f40 rsyslogd 71194 3 /dev/urandom0xffff9c83fb1e9f40 rsyslogd 71194 4 socket:0xffff9c83fb1e9f40 rsyslogd 71194 5 /var/log/messages0xffff9c83fb1e9f40 rsyslogd 71194 6 anon_inode:0xffff9c83fb1e9f40 rsyslogd 71194 7 /var/log/secure<< >>0xffff9c insmod 0 /dev/pts/00xffff9c insmod 1 /dev/pts/00xffff9c insmod 2 /dev/pts/00xffff9c insmod 3 /root/LiME/src/lime-4.0.el8.x86_64.ko
Linuxプラグインスクリプトの場所へのアクセス
メモリダンプを読み込んでこの情報を処理することで、より多くの情報を得ることができます。Pythonを知っていて、この情報がどのように処理されるのか興味があれば、すべてのプラグインが保存されているディレクトリに行き、興味のあるプラグインを選択して、Volatilityがどのようにこの情報を取得するのかを見ることができます:
$ ls volatility/plugins/linux/apihooks.py common.py kernel_opened_files.py malfind.py psaux.pyapihooks.pyc common.pyc kernel_opened_files.pyc malfind.pyc psaux.pycarp.py cpuinfo.py keyboard_notifiers.py mount_cache.py psenv.pyarp.pyc cpuinfo.pyc keyboard_notifiers.pyc mount_cache.pyc psenv.pycaslr_shift.py dentry_cache.py ld_env.py mount.py pslist_cache.pyaslr_shift.pyc dentry_cache.pyc ld_env.pyc mount.pyc pslist_cache.pyc<< >>check_syscall_arm.py __init__.py lsmod.py proc_maps.py tty_check.pycheck_syscall_arm.pyc __init__.pyc lsmod.pyc proc_maps.pyc tty_check.pyccheck_syscall.py iomem.py lsof.py proc_maps_rb.py vma_cache.pycheck_syscall.pyc iomem.pyc lsof.pyc proc_maps_rb.pyc vma_cache.pyc
私がVolatilityについて気に入っているのは、彼が多くのセキュリティ・プラグインを提供していることです。これらは手動でアクセスするのは困難です:
linux_hidden_modules - Carves memory to find hidden kernel moduleslinux_malfind - Looks for suspicious process mappingslinux_truecrypt_passphrase - Recovers cached Truecrypt passphrases
Volatilityでは、メモリーダンプでシェルを開くこともできるので、上記のすべての代わりにシェルコマンドを実行しても同じ情報を得ることができます:
$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_volshell --profile=LinuxRedhat8_3_4_0x64 -vVolatility Foundation Volatility Framework 2.6.1Current context: process systemd, pid=1 DTB=0x1042dc000Welcome to volshell! Current memory image is:file:///root/LiME/RHEL8.3_64bit.memTo get help, type 'hh()'>>>>>> sc()Current context: process systemd, pid=1 DTB=0x1042dc000>>>
次のステップ
メモリ・ダンプは、Linux内部で何が起こっているかを確認するのに最適な方法です。Volatility のプラグインをすべて試して、その出力を詳しく調べてみてください。そして、この情報が侵入やセキュリティ問題の特定にどのように役立つかを考えてください。これらのプラグインがどのように動作するかを深く掘り下げ、さらに改良してみましょう。自分がやりたいことに対応するプラグインが見つからなければ、それを書いて Volatility に提出し、他の人にも使ってもらえるようにしましょう。




