volatilityツールの使い方!メモリから何が分かる?

volatilityの使い方セキュリティ
アクセラレーション・ブーストで処理速度向上のフリー素材 https://www.pakutaso.com/20180110016post-14810.html

※この記事にはプロモーションが含まれています。

メモリフォレンジックツールVolatilityを用いると、メモリから様々な情報を入手することができます。今回は、Windowsのメモリファイルを用いた、解析ツールvolatilityの使い方を紹介します。

スポンサーリンク
スポンサーリンク

準備

調査対象のメモリファイル作成

テスト用にメモリファイルを作成します。
今回は、Windows 7上でFTK Imagerを使って作成しました。
メモリファイルmemdump.memは、メニューのfileCapture MemoryCapture Memoryボタンを押すことで、指定のフォルダに作成されます。

volatilityツールのインストール

メモリファイルの解析マシンとして、Kali Linuxを使用します。
下記コマンドでツールをインストールします。

sudo apt install volatility -y

使い方

環境情報を取得、設定する

初めにメモリファイルを調査し、必要なパラメータをimageinfoコマンドで取得します。

volatility imageinfo -f ./memdump.mem

以下のような情報が得られます。

          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (/media/sf_Kali/volatility/memdump.mem)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf80003241070L
          Number of Processors : 2
     Image Type (Service Pack) : 0
                KPCR for CPU 0 : 0xfffff80003242d00L
                KPCR for CPU 1 : 0xfffff880009ea000L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2020-10-13 11:29:46 UTC+0000
     Image local date and time : 2020-10-13 20:29:46 +0900

取得したパラメータを使用し、今後の調査がし易いようにvolatilityrcファイルを以下の様に、カレントフォルダに作成します。ServicePackとKDBGに着目します。

[DEFAULT]
PROFILE=Win7SP0x64
LOCATION=file:///media/sf_Kali/volatility/memdump.mem
KDBG=0xf80003241070L

通信の状況を表示する

メモリ取得時の通信状況を、netscanコマンドで表示します。
怪しい通信がないかを確認し、IPをチェックしたいときは、サイトipvoidのwhoisやブラックリストを用いると便利です。

$ volatility netscan

Offset(P)          Proto    Local Address                  Foreign Address      State            Pid      Owner          Created
0x61f3010          TCPv4    10.0.2.15:49167                192.229.232.86:80    ESTABLISHED      2500     iexplore.exe   
0x7d8068e0         UDPv6    :::5004                        *:*                                   2204     wmpnetwk.exe   2020-10-13 11:26:10 UTC+0000
0x7d823290         TCPv4    0.0.0.0:10243                  0.0.0.0:0            LISTENING        4        System         
0x7da1e470         UDPv4    0.0.0.0:3702                   *:*                                   1348     svchost.exe    2020-10-13 11:25:49 UTC+0000
...

起動中のプロセスを表示する

pstree,pslist,psscanコマンドで起動中のプロセス一覧を表示することができます。

$ volatility pslist
Offset(V)          Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit                          
------------------ -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
0xfffffa80018bf040 System                    4      0     87      558 ------      0 2020-10-13 11:25:11 UTC+0000                                 
0xfffffa8002a9b5a0 smss.exe                280      4      2       30 ------      0 2020-10-13 11:25:11 UTC+0000                                 
0xfffffa8003260a00 csrss.exe               360    348     10      552      0      0 2020-10-13 11:25:15 UTC+0000                                 
0xfffffa80018d4060 wininit.exe             408    348      3       78      0      0 2020-10-13 11:25:15 UTC+0000                                 
0xfffffa80018cd5c0 csrss.exe               420    400      8      286      1      0 2020-10-13 11:25:15 UTC+0000                                 
0xfffffa8002fe97d0 winlogon.exe            444    400      6      120      1      0 2020-10-13 11:25:15 UTC+0000                                 
$ volatility pstree

Name                                                  Pid   PPid   Thds   Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
 0xfffffa80018d4060:wininit.exe                       408    348      3     78 2020-10-13 11:25:15 UTC+0000
. 0xfffffa800339caf0:services.exe                     504    408      7    231 2020-10-13 11:25:16 UTC+0000
.. 0xfffffa8003565b30:svchost.exe                     400    504     17    505 2020-10-13 11:25:25 UTC+0000
... 0xfffffa80018cd5c0:csrss.exe                      420    400      8    286 2020-10-13 11:25:15 UTC+0000
... 0xfffffa8002fe97d0:winlogon.exe                   444    400      6    120 2020-10-13 11:25:15 UTC+0000
$ volatility psscan

Offset(P)          Name                PID   PPID PDB                Time created                   Time exited                   
------------------ ---------------- ------ ------ ------------------ ------------------------------ ------------------------------
0x000000007fa0bb30 calc.exe           1436    676 0x0000000035620000 2020-10-13 11:27:16 UTC+0000                                 
0x000000007ff0c5c0 csrss.exe           420    400 0x0000000023f3c000 2020-10-13 11:25:15 UTC+0000                                 
0x000000007ff13060 wininit.exe         408    348 0x0000000022208000 2020-10-13 11:25:15 UTC+0000                                 
0x000000007ff3e040 System                4      0 0x0000000000187000 2020-10-13 11:25:11 UTC+0000                                

プロセスをファイルに出力したい場合、下記のprocdumpコマンドを使います。怪しいプロセスを発見したら、サイトvirustotalでウイルスか否かをチェックすることができます。

$ volatility procdump -D . -p 1436

また、userassistコマンドを用いれば、ユーザーが実行したアプリの履歴を表示することができます。

$ volatility userassist

----------------------------
Registry: \??\C:\Users\userx\ntuser.dat 
Path: Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count
Last updated: 2020-10-13 11:29:04 UTC+0000

REG_BINARY    %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Calculator.lnk : 
Count:          9
Focus Count:    0
Time Focused:   0:00:00.509000
Last updated:   2020-10-13 04:18:40 UTC+0000

DLLを表示する

各プロセスがロードしたDLLは、dlllistコマンドで表示します。

$ volatility dlllist

************************************************************************
calc.exe pid:   1436
Command line : calc


Base                             Size          LoadCount LoadTime                       Path
------------------ ------------------ ------------------ ------------------------------ ----
0x00000000ffef0000            0xe3000             0xffff 1970-01-01 00:00:00 UTC+0000   C:\Windows\system32\calc.exe
0x0000000077890000           0x1ab000             0xffff 1970-01-01 00:00:00 UTC+0000   C:\Windows\SYSTEM32\ntdll.dll
0x0000000077670000           0x11f000             0xffff 2020-10-13 11:27:16 UTC+0000   C:\Windows\system32\kernel32.dll
0x000007fefd8a0000            0x6b000             0xffff 2020-10-13 11:27:16 UTC+0000   C:\Windows\system32\KERNELBASE.dll
0x000007fefec00000           0xd86000             0xffff 2020-10-13 11:27:16 UTC+0000   C:\Windows\system32\SHELL32.dll
0x000007fefe820000            0x9f000             0xffff 2020-10-13 11:27:16 UTC+0000   C:\Windows\system32\msvcrt.dll
0x000007fefe560000            0x71000             0xffff 2020-10-13 11:27:16 UTC+0000   
...

DLLをファイルに出力したい場合、dlldumpコマンドを利用します。

$ volatility dlldump -D . -p 1436

レジストリを表示する

下記hivelistコマンドでハイブ一覧を表示します。

$ volatility hivelist

Virtual            Physical           Name
------------------ ------------------ ----
0xfffff8a002f1f010 0x00000000284b5010 \SystemRoot\System32\Config\DEFAULT
0xfffff8a005db1010 0x0000000022068010 \SystemRoot\System32\Config\SECURITY
0xfffff8a00000e010 0x000000002cf0f010 [no name]
0xfffff8a000024010 0x000000002cf9a010 \REGISTRY\MACHINE\SYSTEM
0xfffff8a00004e200 0x000000002ad04200 \REGISTRY\MACHINE\HARDWARE
0xfffff8a0009f5010 0x0000000028650010 \SystemRoot\System32\Config\SOFTWARE
0xfffff8a000aa9010 0x00000000285e0010 \Device\HarddiskVolume1\Boot\BCD
0xfffff8a000c0c010 0x000000001fa1e010 \SystemRoot\System32\Config\SAM
0xfffff8a000ca2420 0x0000000021676420 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0xfffff8a000d1d010 0x000000001c645010 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0xfffff8a001051010 0x00000000164b4010 \??\C:\Users\userx\ntuser.dat
0xfffff8a0011b9010 0x000000000bfcc010 \??\C:\Users\userx\AppData\Local\Microsoft\Windows\UsrClass.dat
0xfffff8a001682010 0x000000006740a010 \??\C:\System Volume Information\Syscache.hve

また、下記printkeyコマンドで指定レジストリの値を確認できます。
各レジストリに不正なエントリが登録されていないかをチェックします。

$ volatility printkey -K 'Microsoft\Windows\CurrentVersion\Run'

----------------------------
Registry: \SystemRoot\System32\Config\SOFTWARE
Key name: Run (S)
Last updated: 2020-10-13 04:22:07 UTC+0000

Subkeys:

Values:
REG_EXPAND_SZ VBoxTray        : (S) %SystemRoot%\system32\VBoxTray.exe

その他、有用なコマンド

malfindコマンドは、マルウェア対策として、隠し及びインジェクションコードの痕跡を探します。出力結果を精査することで、マルウェア検出の取っ掛かりとして役立ちます。

$ volatility malfind

Process: svchost.exe Pid: 836 Address: 0xd40000
Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE
Flags: CommitCharge: 16, MemCommit: 1, PrivateMemory: 1, Protection: 6

0x00d40000  41 ba 80 00 00 00 48 b8 f8 7c b6 ff fe 07 00 00   A.....H..|......
0x00d40010  48 ff 20 90 41 ba 81 00 00 00 48 b8 f8 7c b6 ff   H...A.....H..|..
0x00d40020  fe 07 00 00 48 ff 20 90 41 ba 82 00 00 00 48 b8   ....H...A.....H.
0x00d40030  f8 7c b6 ff fe 07 00 00 48 ff 20 90 41 ba 83 00   .|......H...A...

0x00d40000 41               INC ECX
...

modulesコマンドは、システム権限で動作するカーネルモジュール一覧を表示します。

$ volatility modules

Offset(V)          Name                 Base                             Size File
------------------ -------------------- ------------------ ------------------ ----
0xfffffa800183d890 ntoskrnl.exe         0xfffff80003058000           0x5dd000 \SystemRoot\system32\ntoskrnl.exe
0xfffffa80018370f0 hal.dll              0xfffff8000300f000            0x49000 \SystemRoot\system32\hal.dll
0xfffffa800183d7b0 kdcom.dll            0xfffff80000bb2000             0xa000 \SystemRoot\system32\kdcom.dll
...

modscanコマンドは、カーネルモジュールリストからアンロードされたモジュールを探すような場合に使用します。

$ volatility modscan

Offset(P)          Name                 Base                             Size File
------------------ -------------------- ------------------ ------------------ ----
0x000000007de04980 tcpipreg.sys         0xfffff88002916000            0x12000 \SystemRoot\System32\drivers\tcpipreg.sys
0x000000007de0dd70 srvnet.sys           0xfffff880028e9000            0x2d000 \SystemRoot\System32\DRIVERS\srvnet.sys
0x000000007de66f20 srv2.sys             0xfffff88002928000            0x69000 \SystemRoot\System32\DRIVERS\srv2.sys
0x000000007de68930 spsys.sys            0xfffff88002a57000            0x71000 \SystemRoot\system32\drivers\spsys.sys
0x000000007e001220 rspndr.sys           0xfffff88000dda000            0x18000 \SystemRoot\system32\DRIVERS\rspndr.sys
0x000000007e118240 HTTP.sys             0xfffff88002432000            0xc8000 \SystemRoot\system32\drivers\HTTP.sys
...

svcscanコマンドは、サービス一覧を表示します。

$ volatility svcscan

Offset: 0xc70ce0
Order: 380
Start: SERVICE_AUTO_START
Process ID: 912
Service Name: wuauserv
Display Name: Windows Update
Service Type: SERVICE_WIN32_SHARE_PROCESS
Service State: SERVICE_RUNNING
Binary Path: C:\Windows\system32\svchost.exe -k netsvcs
...

handlesコマンドは、プロセスが使用するハンドル一覧を表示します。

$ volatility handles -p 1436

Offset(V)             Pid             Handle             Access Type             Details
------------------ ------ ------------------ ------------------ ---------------- -------
0xfffff8a000ac0eb0   1436                0x4                0x3 Directory        KnownDlls
0xfffffa80033f54b0   1436                0x8           0x100020 File             \Device\HarddiskVolume2\Users\userx
0xfffff8a0021f8690   1436               0x1c                0x1 Key              MACHINE\CONTROLSET001\CONTROL\SESSION MANAGER
0xfffffa8001a64480   1436               0x20              0x804 EtwRegistration  
0xfffffa8002a19470   1436               0x24          0x21f0003 Event            
0xfffffa80032948a0   1436               0x28            0xf037f WindowStation    WinSta0
0xfffffa800337b120   1436               0x2c            0xf01ff Desktop          Default
...

ldrmodulesコマンドは、Virtual Address DescriptorテーブルとProcess Environmentブロック情報を用いて、アンロードされたモジュールを探します。

$ volatility ldrmodules -p 1436

Pid      Process              Base               InLoad InInit InMem MappedPath
-------- -------------------- ------------------ ------ ------ ----- ----------
    1436 calc.exe             0x0000000003c60000 False  False  False \Windows\IME\IMEJP10\DICTS\IMJPST.DIC
    1436 calc.exe             0x0000000003510000 False  False  False \Windows\System32\oleaccrc.dll
    1436 calc.exe             0x000007feff990000 True   True   True  \Windows\System32\ole32.dll
    1436 calc.exe             0x000007fefe2a0000 True   True   True  \Windows\System32\oleaut32.dll
    1436 calc.exe             0x00000000053c0000 False  False  False \Windows\IME\IMEJP10\DICTS\imjptk.dic

Windowsのパスワードを解析する

volatilityから得られた情報を用いて、Windowsユーザーのパスワードを解析してみます。
まず、先のhivelistの結果から下記が分かります。

  • SYSTEMハイブは、0xfffff8a000024010
  • SAMハイブは、0xfffff8a000c0c010

2値を使って、hash.txtを取得しjohn ripperを実行すると、以前の記事同様にパスワードを解析することができる場合があります。

$ volatility hashdump -y 0xfffff8a000024010 -s 0xfffff8a000c0c010 > hash.txt

$ sudo john --format=nt hash.txt

Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
123456789        (userx)
                 (Administrator)
                 (Guest)
Proceeding with incremental:ASCII

まとめ

メモリフォレンジックツールvolatilityを利用することで、メモリから様々な情報を入手することができます。本ツールには、他にも多くのコマンドを備えていますので、使いこなせるように学習を続けていきましょう。

以上、volatilityツールの使い方の紹介でした。

コメント