今天實作 Volatility 3。
上一篇使用 Volatility 2.6 時,需要先透過 imageinfo 找出 Suggested Profile,指定對應的 Windows Profile。
Volatility 3 最大的差別之一,就是不需要自己指定 Profile,而是透過 Symbol Tables 解析 Memory Image,所以操作上會比 Volatility 2.6 簡單。
.mem 檔放到 Volatility 3 資料夾中
Memory Image 其實不一定要放在同一個資料夾,只要後面的 -f 能指定正確路徑即可。
Volatility 3 不再使用 Volatility 2.6 的 Profile,而是透過 Symbol Tables 了解不同作業系統 Kernel 中的資料結構。
所以要到 Github 下載對應的 Symbol Pack,並解壓縮後放到 volatility3-develop\volatility3\symbols 資料夾中。
先在 cmd 中 ls Volatility 3 資料夾
使用 windows.info 查看 Memory Image 的基本資訊,可以看到 Kernel Base、DTB、使用的 Symbol、系統時間、Windows 版本、系統架構等。
python .\vol.py -f [映像檔] windows.info

例如這份 Memory 可以看到:
SystemTime 2020-06-11 03:21:21+00:00
NtMajorVersion 6
NtMinorVersion 3
Is64Bit True
這個功能有點像 Volatility 2.6 的 imageinfo。
不過 Volatility 3 不會列出Suggested Profile。
使用 windows.pslist 可以列出 Memory 中的 Process,其中 --dump 參數可以導出記憶體中正在執行的進程映像。
python .\vol.py -f [映像檔] windows.pslist

輸出中可以看到 Process Name、PID、PPID、建立時間、結束時間、Thread 數量等資訊。
其中 PID 是每個 Process 的識別編號,而 PPID 則代表啟動它的 Parent Process PID,因此除了確認有哪些程式正在執行,也可以開始觀察 Process 之間的關係。
如果發現可疑 Process,也可以記下它的 PID,再利用其他 Plugin 繼續查看它的 Command Line、Network Connection、Handle 或其他相關資訊。
另外 windows.pslist 也支援 --dump,可以嘗試將指定 Process 對應的執行檔內容從 Memory 中匯出,方便後續進一步分析。
python .\vol.py -f [映像檔] windows.psxview

psxview 會利用不同的 Process Enumeration 方法交叉檢查 Memory 中的 Process,例如 pslist、psscan、thrdscan、csrss 等。
結果中會看到 True 和 False,True 代表該方法有找到這個 Process,False 則代表該方法沒有找到。
如果同一個 Process 在不同方法之間出現差異,就可以列為後續調查的對象。
不過 False 並不代表一定是 Malware 或 Rootkit,因為 Process 可能已經結束、Memory 中只剩下部分結構,或不同方法本來就會因為搜尋方式不同而出現差異。
所以還是要搭配 Process Name、PID、PPID、Process Tree、Command Line 和 Network Connection 一起判斷。
如果想知道某個程式到底是被誰啟動的,可以使用 windows.pstree。
python .\vol.py -f [映像檔] windows.pstree
pstree 會把 Process 按照 Parent / Child Relationship 排成樹狀結構。
例如:
explorer.exe
└─ cmd.exe
└─ powershell.exe
單看 cmd.exe 或 powershell.exe 其實都很正常,但如果它的 Parent Process 或 Child Process 出現不合理的組合,就值得進一步追查。
因此 pstree 很適合用來了解這個 Process 是誰啟動的?它後面又啟動了什麼?
搭配 PID 和 PPID,就可以逐步還原 Process 的執行關係。
使用 windows.netscan 可以從 Memory 中找 Network Connection。
python .\vol.py -f [映像檔] windows.netscan
輸出中通常可以看到 Local Address、Local Port、Foreign Address、Foreign Port、Connection State,以及對應的 PID 和 Process Owner。
也就是除了知道這台電腦連到哪個 IP、使用哪個 Port 以外,還可以繼續確認這條 Connection 是哪一個 Process 建立的。
例如看到某個不熟悉的 Foreign IP,就可以先記下它所對應的 PID,再回頭利用 pslist、pstree 或 cmdline 確認是哪個程式建立這條連線。
分析 Network Connection 時,可以特別注意是否有不熟悉的外部 IP、異常 Port、ESTABLISHED Connection,以及該 PID 對應的 Process 是否合理。
不過 IP 或 Port 本身只能算是線索,不能單獨拿來判斷是否為惡意行為。
找到可疑 Process 後,可以利用 windows.cmdline 查看它啟動時所使用的 Command Line。
python .\vol.py -f [映像檔] windows.cmdline

這個 Plugin 除了顯示 Process Name,還可以看到程式的完整執行路徑以及啟動時帶入的參數。
python .\vol.py -f [映像檔] windows.registry.hivelist

可以從 Memory 中找到 Registry Hive,例如:
\REGISTRY\MACHINE\SYSTEM
\SystemRoot\System32\Config\SOFTWARE
\SystemRoot\System32\Config\DEFAULT
\SystemRoot\System32\Config\SECURITY
\SystemRoot\System32\Config\SAM
NTUSER.DAT
不同 Hive 中會留下不同資訊。
例如:
SYSTEM
→ 系統設定、裝置等資訊
SAM
→ Local Account 相關資訊
SOFTWARE
→ 安裝軟體及 Windows 設定
NTUSER.DAT
→ 特定使用者的操作紀錄
Registry 也是 Windows Forensics 中非常重要的一類 Artifact。
找到 Registry Hive 後,可以再使用 windows.registry.printkey 查看指定的 Registry Key。
例如想知道使用者曾經在 Win + R 的 Run Dialog 中輸入過什麼,可以查看 RunMRU。
python .\vol.py -f [映像檔] windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU"
RunMRU 會保存近期透過 Run Dialog 輸入過的內容,因此可能看到:
cmd
regedit
powershell
notepad
在鑑識時,可以利用它了解使用者曾經透過 Run Dialog 啟動過哪些程式或輸入過哪些 Command。
不過 RunMRU 只代表這些內容曾經出現在 Run Dialog 的歷史紀錄中,不能單靠它判斷某個 Command 就是在事件發生當下執行,也不能直接判定為惡意行為。
還是需要再搭配 Process、Command Line、Timestamp 或其他 Artifact 交叉確認。