blog

技術|オープンソースツールによるLinuxメモリフォレンジック

使用 アプリケーション、ネットワーク接続、カーネルモジュール、ファイルなどについて調べてください。...

Oct 11, 2025 · 24 min. read
シェア

Volatility を使用して、アプリケーション、ネットワーク接続、カーネル・モジュール、ファイルなどについて調べます。

コンピュータのオペレーティングシステムとアプリケーションは、メインメモリを使用してさまざまなタスクを実行します。この揮発性メモリには、実行中のアプリケーションの内容、ネットワーク接続、カーネルモジュール、開いているファイルなど、ほとんどすべての情報が含まれていますが、これらの情報はコンピュータが再起動するたびに消去されます。

、プラグインを使用してこの情報を処理するオープンソースツールです。しかし、問題があります。この情報を処理する前に、物理メモリをファイルにダンプする必要がありますが、Volatilityにはその機能がありません。

そのため、この記事は2つのパートに分かれています:

  • 最初のパートは、物理メモリを取得し、それをファイルにダンプすることを扱います。
  • 第2部では、Volatilityを使ってこのメモリダンプから情報を読み取り、処理します。

このチュートリアルでは以下のテストシステムを使用しましたが、どのLinuxディストリビューションでも動作します:

  1. $ cat /etc/redhat-release
  2. Red Hat Enterprise Linux release 8.3 (Ootpa)
  3. $ uname -r
  4. 4.0.el8.x86_64

注: パート1では、カーネルモジュールのコンパイルとロードを行います。ご心配なく:言うほど難しくはありません。

いくつかのガイドラインがあります:

  • 以下の手順に従ってください。
  • 本番システムまたはプライマリコンピュータでは、これらの手順を実行しないでください。
  • ツールの使い方に慣れ、その仕組みを理解するまで、常にテストVMで試してください。

必要なパッケージのインストール

最初に必要なツールをインストールします。Debianベースのディストリビューションをいつも使っているのであれば、apt-getコマンドを使うことができます。これらのパッケージのほとんどは、必要なカーネル情報とコードをコンパイルするためのツールを提供します:

  1. $ 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を取得するには、以下のコマンドを使用します:

  1. $ git clone https://.//.it
  2. $ cd LiME/src/
  3. 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ファイルは                                                       フォーマットでリネームされます。

  1. make -C /lib/modules/4.0.el8.x86_64/build M="/root/LiME/src" modules
  2. make[1]: Entering directory '/usr/src/kernels/4.0.el8.x86_64'
  3. << >>
  4. make[1]: Leaving directory '/usr/src/kernels/4.0.el8.x86_64'
  5. strip --strip-unneeded lime.ko
  6. mv lime.ko lime-4.0.el8.x86_64.ko
  7. $ ls -l lime-4.0.el8.x86_64.ko
  8. -rw-r--r--. 1 root root 25696 Apr lime-4.0.el8.x86_64.ko
  9. $ file lime-4.0.el8.x86_64.ko
  10. lime-4.0.el8.x86_64.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1d0b5cfdbb8e46c9cf, not stripped

LiMEカーネルモジュールのロード

insmodコマンドはカーネル・モジュールをロードするのに役立ちます。ロードされると、モジュールはシステム上のメイン・メモリを読み込み、コマンドラインで指定されたパス・ディレクトリのファイルにメモリの内容をダンプします。もう一つの重要なパラメータはフォーマットです。カーネルモジュールを挿入したら、lsmodコマンドを使用して、実際にロードされていることを確認します。

  1. $ lsmod  | grep lime
  2. $ insmod ./lime-4.0.el8.x86_64.ko "path=../RHEL8.3_64bit.mem format=lime"
  3. $ lsmod  | grep lime
  4. lime                   16384  0

pathコマンドで指定されたファイルが作成され、システムの物理メモリサイズと同じサイズになっていることが確認できるはずです。メモリダンプができたら、rmmodコマンドを使ってカーネルモジュールを削除できます:

  1. $ ls -l ~/LiME/RHEL8.3_64bit.mem
  2. -r--r--r--. 1 root root Apr /root/LiME/RHEL8.3_64bit.mem
  3. $ du -sh ~/LiME/RHEL8.3_64bit.mem
  4. 4.0G    /root/LiME/RHEL8.3_64bit.mem
  5. $ free -m
  6.               total        used        free      shared  buff/cache   available
  7. Mem:           3736         220         366           8        3149        5239
  8. Swap:          4059           8        5041
  9. $ rmmod lime
  10. $ lsmod  | grep lime

メモリーダンプの中身は?

このメモリダンプファイルは、fileコマンドで見ることができるように、単なる生データです。hexdumpの出力は、最初の数バイトがEmiLであることを示しています。これは、上記のコマンドラインでリクエストフォーマットがライムであるためです:

  1. $ file ~/LiME/RHEL8.3_64bit.mem
  2. /root/LiME/RHEL8.3_64bit.mem: data
  3. $ hexdump -C ~/LiME/RHEL8.3_64bit.mem | head
  4.   4c 00   00 00  |EMiL............|
  5.  ff fb   00 00  |................|
  6.  b8 fe 4c cd 32   2a 2a 2a 2a 2a  |..L.!D.2 ..*****|
  7.  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
  8.  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a  |************* . |
  9.   00 00   00 00  |................|
  10.   00 00   65 6c  |............pxel|
  11.   00 00   00 00  |inux.0..........|
  12. a0   00 00   00 00  |................|

パート2:ボラティリティの取得とメモリ・ダンプの分析への利用

  1. $ git clone https://.//.it
  2. $ cd volatility/
  3. AUTHORS.txt    contrib      LEGAL.txt    Makefile     PKG-INFO     pyinstaller.spec  resources  tools       vol.py
  4. CHANGELOG.txt  CREDITS.txt  LICENSE.txt  MANIFEST.in  pyinstaller  README.txt        setup.py   volatility

Volatility はその機能の一部に 2 つの Python ライブラリを使用しているため、以下のコマンドを使用してそれらをインストールしてください。そうしないと、Volatility ツールを実行したときにいくつかのインポート・エラーが表示されることがあります。実行するプラグインがこれらのライブラリを必要とする場合を除き、これらのエラーは無視してかまいません:

  1. $ pip2 install pycrypto
  2. $ pip2 install distorm3

VolatilityのLinux設定ファイルのリスト

最初に実行する Volatility コマンドは、利用可能な Linux 設定ファイルを一覧表示します。 Volatility コマンドを実行するための主なエントリーポイントは、vol.py スクリプトです。このスクリプトを Python 2 インタプリタで呼び出し、--info オプションを指定します。出力を絞り込むには、Linux で始まる文字列を探します。見ての通り、Linux の設定ファイルはあまり多くありません:

  1. $ python2 vol.py --info  | grep ^Linux
  2. Volatility Foundation Volatility Framework 2.6.1
  3. LinuxAMD64PagedMemory          - Linux-specific AMD 64-bit address space.

独自のLinux設定ファイルの構築

Linux ディストリビューションは多様で、さまざまなアーキテクチャ向けに構築されています。Volatilityは、情報を抽出する前に、メモリ・ダンプがどのシステムとアーキテクチャから取得されたかを知る必要があります。この情報を見つけることができる Volatility コマンドがありますが、この方法は時間がかかります。この方法を高速化するには、次のコマンドを使用してカスタム Linux 構成ファイルを構築します:

Volatility リポジトリの                                                      ディレクトリに移動し、make コマンドを実行します:

  1. $ cd tools/linux/
  2. /root/volatility/tools/linux
  3. kcore & nbsp; Makefile & nbsp; Makefile.a & nbsp; module.c;
  4. make - C;
  5. make[1]: Entering directory '/usr/src/kernels/4.0.el8.x86_64'
  6. << >>
  7. make[1]: Leaving directory '/usr/src/kernels/4.0.el8.x86_64'

新しいmodule.dwarfファイルが表示されるはずです。また、/bootディレクトリにあるSystem.mapファイルも必要です。このファイルには、現在実行中のカーネルに関連するすべてのシンボルが含まれているからです:

  1. kcore & nbsp; Makefile & nbsp; Makefile.obj & nbsp; module.c & nbsp; module.a;
  2. $ ls -l module.dwarf
  3. -rw-r--r--. 1 root root Apr module.dwarf
  4. $ ls -l /boot/System.map-4.0.el8.x86_64
  5. -rw-------. 1 root root Sep 23  2020 /boot/System.map-4.0.el8.x86_64

カスタム構成ファイルを作成するには、Volatility ディレクトリに戻って次のコマンドを実行します。最初のパラメータには、独自の名前のカスタム .zip ファイルを指定します。私はよく、オペレーティング・システムとカーネルのバージョンを使用します。次の引数は、先ほど作成した module.dwarf ファイルで、最後の引数は /boot ディレクトリの System.map ファイルです:

  1. $ cd volatility/
  2. $ zip volatility/plugins/overlays/linux/Redhat8.3_4.0.zip tools/linux/module.dwarf /boot/System.map-4.0.el8.x86_64
  3.   adding: tools/linux/module.dwarf (deflated 91%)
  4.   adding: boot/System.map-4.0.el8.x86_64 (deflated 79%)

これでカスタム構成ファイルの準備は完了です。.zip ファイルが先ほど指定した場所に作成されていることを確認してください。Volatility がこのカスタム構成ファイルを検出したかどうかを知りたい場合は、もう一度 --info コマンドを実行してください。これで、以下のリストに新しい構成ファイルが表示されるはずです:

  1. $ ls -l volatility/plugins/overlays/linux/Redhat8.3_4.0.zip
  2. -rw-r--r--. 1 root root Apr volatility/plugins/overlays/linux/Redhat8.3_4.0.zip
  3. $ python2 vol.py --info  | grep Redhat
  4. Volatility Foundation Volatility Framework 2.6.1
  5. LinuxRedhat8_3_4_0x64 - A Profile for Linux Redhat8.3_4.0 x64

ボラティリティ入門

これで、本格的なメモリ・フォレンジックを行う準備が整いました。Volatilityは、情報を取得するためにメモリ・ダンプのターゲットとすることができるカスタム・プラグインで構成されていることを覚えておいてください。コマンドの一般的な形式は次のとおりです:

  1. python2 vol.py -f <memory-dump-file-taken-by-Lime> <plugin-name> --profile=<name-of-our-custom-profile>

この情報をもとに                                                       プラグインを実行し、メモリダンプから正しいディストロ情報を特定できるか確認してください:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_banner --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. Linux 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_文字列を取得します。目的に応じて様々なプラグインがあります。以下はその一部です:

  1. $ python2 vol.py --info  | grep linux_
  2. Volatility Foundation Volatility Framework 2.6.1
  3. linux_apihooks             - Checks for userland apihooks
  4. linux_arp                  - Print the ARP table
  5. linux_aslr_shift           - Automatically detect the Linux ASLR shift
  6. << >>
  7. linux_banner               - Prints the Linux banner information
  8. linux_vma_cache            - Gather VMAs from the vm_area_struct cache
  9. linux_volshell             - Shell in the memory image
  10. linux_yarascan             - A shell in the Linux memory image

linux_psauxプラグインを使って、メモリダンプ時にシステムで実行されているプロセスをチェックしてください。リストの最後のコマンドに注意してください: ダンプ時に実行したinsmodコマンドです。

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_psaux --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. Pid    Uid    Gid    Arguments                                                      
  4. 1      0      0      /usr/lib/systemd/systemd --switched-root --system --deserialize 18
  5. 2      0      0      [kthreadd]                                                      
  6. 3      0      0      [rcu_gp]                                                        
  7. 4      0      0      [rcu_par_gp]                                                    
  8. 861    0      0      /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P          
  9. 869    0      0      /usr/bin/rhsmcertd                                              
  10. 875    0      0      /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files
  11. 878    0      0      /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files      
  12. << >>
  13.  89     89     qmgr -l -t unix -u                                              
  14. 0      0      [kworker/0:0]                                                  
  15. 0      0      -bash                                                          
  16. 0      0      [kworker/u2:1]                                                  
  17. 0      0      [kworker/0:2]                                                  
  18. 0      0      [kworker/0:3]                                                  
  19. 0      0      insmod ./lime-4.0.el8.x86_64.ko path=../RHEL8.3_64bit.mem format=lime
  20. 0      0                                                                      

システムのネットワーク・ステータスを知りたいですか?                                                       プラグインを実行すると、メモリダンプ中にネットワーク接続のステータスを見つけることができます:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_netstat --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. UNIX 18113              systemd/1     /run/systemd/private
  4. UNIX              systemd/1     /run/systemd/notify
  5. UNIX 11413              systemd/1     /run/systemd/cgroups-agent
  6. UNIX 11415              systemd/1    
  7. UNIX 11416              systemd/1    
  8. << >>

次に、                                                       プラグインを使って、メモリダンプ中にどのファイルシステムがマウントされているかを確認します:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_mount --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. tmpfs                     /sys/fs/cgroup                      tmpfs        ro,nosuid,nodev,noexec                  
  4. cgroup                    /sys/fs/cgroup/pids                 cgroup       rw,relatime,nosuid,nodev,noexec        
  5. systemd-1                 /proc/sys/fs/binfmt_misc            autofs       rw,relatime                            
  6. sunrpc                    /var/lib/nfs/rpc_pipefs             rpc_pipefs   rw,relatime                            
  7. /dev/mapper/rhel_kvm--03--guest11-root /                                   xfs          rw,relatime                
  8. tmpfs                     /dev/shm                            tmpfs        rw,nosuid,nodev                        
  9. selinuxfs                 /sys/fs/selinux                     selinuxfs    rw,relatime
  10.                                                      
  11. << >>
  12. cgroup                    /sys/fs/cgroup/net_cls,net_prio     cgroup       rw,relatime,nosuid,nodev,noexec        
  13. cgroup                    /sys/fs/cgroup/cpu,cpuacct          cgroup       rw,relatime,nosuid,nodev,noexec        
  14. bpf                       /sys/fs/bpf                         bpf          rw,relatime,nosuid,nodev,noexec        
  15. cgroup                    /sys/fs/cgroup/memory               cgroup       ro,relatime,nosuid,nodev,noexec        
  16. cgroup                    /sys/fs/cgroup/cpuset               cgroup       rw,relatime,nosuid,nodev,noexec        
  17. mqueue                    /dev/mqueue                         mqueue       rw,relatime                            

どのカーネル・モジュールがロードされるのか気になるところですが、Volatilityはそのためのプラグイン                                                      提供しています:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsmod --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. ffffffffc lime 40280
  4. ffffffffc binfmt_misc 40280
  5. ffffffffc sunrpc
  6. << >>
  7. ffffffffc nfit 55636
  8. ffffffffc dm_mirror 68272
  9. ffffffffc dm_region_hash 40280
  10. ffffffffc dm_log 40280
  11. ffffffffc024bbc0 dm_mod

どのファイルがどのプロセスで開かれているか知りたいですか?この情報を一覧表示するには                                                       プラグインを使用します:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_bash --profile=LinuxRedhat8_3_4_0x64 -v
  2. Volatility Foundation Volatility Framework 2.6.1
  3. Pid      Name                 Command Time                   Command
  4. -------- -------------------- ------------------------------ -------
  5.   bash                 UTC+0000   lsmod
  6.   bash                 UTC+0000   rm -f .log
  7.   bash                 UTC+0000   ls -l /etc/zzz
  8.   bash                 UTC+0000   cat ~/.vimrc
  9.   bash                 UTC+0000   ls
  10.   bash                 UTC+0000   cat /proc/817/cwd
  11.   bash                 UTC+0000   ls -l /proc/817/cwd
  12.   bash                 UTC+0000   ls /proc/817/
  13. << >>
  14.   bash                 UTC+0000   gcc prt.c
  15.   bash                 UTC+0000   ls
  16.   bash                 UTC+0000   ./a.out
  17.   bash                 UTC+0000   vim prt.c
  18.   bash                 UTC+0000   gcc prt.c
  19.   bash                 UTC+0000   ./a.out
  20.   bash                 UTC+0000   ls

どのファイルがどのプロセスで開かれているか知りたいですか?この情報を一覧表示するには                                                       プラグインを使用します:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsof --profile=LinuxRedhat8_3_4_0x64
  2. Volatility Foundation Volatility Framework 2.6.1
  3. Offset             Name                           Pid      FD       Path
  4. ------------------ ------------------------------ -------- -------- ----
  5. 0xffff9c83fb1e9f40 rsyslogd                          71194        0 /dev/null
  6. 0xffff9c83fb1e9f40 rsyslogd                          71194        1 /dev/null
  7. 0xffff9c83fb1e9f40 rsyslogd                          71194        2 /dev/null
  8. 0xffff9c83fb1e9f40 rsyslogd                          71194        3 /dev/urandom
  9. 0xffff9c83fb1e9f40 rsyslogd                          71194        4 socket:
  10. 0xffff9c83fb1e9f40 rsyslogd                          71194        5 /var/log/messages
  11. 0xffff9c83fb1e9f40 rsyslogd                          71194        6 anon_inode:
  12. 0xffff9c83fb1e9f40 rsyslogd                          71194        7 /var/log/secure
  13. << >>
  14. 0xffff9c insmod                                  0 /dev/pts/0
  15. 0xffff9c insmod                                  1 /dev/pts/0
  16. 0xffff9c insmod                                  2 /dev/pts/0
  17. 0xffff9c insmod                                  3 /root/LiME/src/lime-4.0.el8.x86_64.ko

Linuxプラグインスクリプトの場所へのアクセス

メモリダンプを読み込んでこの情報を処理することで、より多くの情報を得ることができます。Pythonを知っていて、この情報がどのように処理されるのか興味があれば、すべてのプラグインが保存されているディレクトリに行き、興味のあるプラグインを選択して、Volatilityがどのようにこの情報を取得するのかを見ることができます:

  1. $ ls volatility/plugins/linux/
  2. apihooks.py              common.py            kernel_opened_files.py   malfind.py          psaux.py
  3. apihooks.pyc             common.pyc           kernel_opened_files.pyc  malfind.pyc         psaux.pyc
  4. arp.py                   cpuinfo.py           keyboard_notifiers.py    mount_cache.py      psenv.py
  5. arp.pyc                  cpuinfo.pyc          keyboard_notifiers.pyc   mount_cache.pyc     psenv.pyc
  6. aslr_shift.py            dentry_cache.py      ld_env.py                mount.py            pslist_cache.py
  7. aslr_shift.pyc           dentry_cache.pyc     ld_env.pyc               mount.pyc           pslist_cache.pyc
  8. << >>
  9. check_syscall_arm.py     __init__.py          lsmod.py                 proc_maps.py        tty_check.py
  10. check_syscall_arm.pyc    __init__.pyc         lsmod.pyc                proc_maps.pyc       tty_check.pyc
  11. check_syscall.py         iomem.py             lsof.py                  proc_maps_rb.py     vma_cache.py
  12. check_syscall.pyc        iomem.pyc            lsof.pyc                 proc_maps_rb.pyc    vma_cache.pyc

私がVolatilityについて気に入っているのは、彼が多くのセキュリティ・プラグインを提供していることです。これらは手動でアクセスするのは困難です:

  1. linux_hidden_modules       - Carves memory to find hidden kernel modules
  2. linux_malfind              - Looks for suspicious process mappings
  3. linux_truecrypt_passphrase - Recovers cached Truecrypt passphrases

Volatilityでは、メモリーダンプでシェルを開くこともできるので、上記のすべての代わりにシェルコマンドを実行しても同じ情報を得ることができます:

  1. $ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_volshell --profile=LinuxRedhat8_3_4_0x64 -v
  2. Volatility Foundation Volatility Framework 2.6.1
  3. Current context: process systemd, pid=1 DTB=0x1042dc000
  4. Welcome to volshell! Current memory image is:
  5. file:///root/LiME/RHEL8.3_64bit.mem
  6. To get help, type 'hh()'
  7. >>>
  8. >>> sc()
  9. Current context: process systemd, pid=1 DTB=0x1042dc000
  10. >>>

次のステップ

メモリ・ダンプは、Linux内部で何が起こっているかを確認するのに最適な方法です。Volatility のプラグインをすべて試して、その出力を詳しく調べてみてください。そして、この情報が侵入やセキュリティ問題の特定にどのように役立つかを考えてください。これらのプラグインがどのように動作するかを深く掘り下げ、さらに改良してみましょう。自分がやりたいことに対応するプラグインが見つからなければ、それを書いて Volatility に提出し、他の人にも使ってもらえるようにしましょう。

Read next