メモリフォレンジックツールVolatilityを用いると、メモリから様々な情報を入手することができます。今回は、Windowsのメモリファイルを用いた、解析ツールvolatilityの使い方を紹介します。
準備
調査対象のメモリファイル作成
テスト用にメモリファイルを作成します。
今回は、Windows 7上でFTK Imagerを使って作成しました。
メモリファイルmemdump.memは、メニューのfile–Capture MemoryでCapture 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ツールの使い方の紹介でした。
コメント