今天我想要分享關於在做Linux Memory Forensic 時會遇到的問題,現在搜尋的記憶體鑑識相關的入門文章與介紹,大多都是以分析 Windows 記憶體 Dump 為主,我個人在入門時也是從 Windows 開始,而我是參加 2025 AIS3的 CTF 組時剛好趁這個機會可以試試看學習 Linux 記憶體鑑識的部分,發現其實分析 Linux 記憶體 Dump 會出現一些有趣的問題,也藉由這次的機會跟大家分享。
今天的鐵人賽分分享會主要會用自己製作出的 Linux Memory Dump,檔案會放在 NCKUCTF ctfd 上,如果你對 Linux 的記憶體分析已經很熟悉的,可以先挑戰看看。
下載連結:
Volatility 2 : https://github.com/volatilityfoundation/volatility
Volatility 3 : https://github.com/volatilityfoundation/volatility3
經典的記憶體分析工具,利用指令可以分析 memory dump 中的關鍵訊息,像是進程、網路連線、檔案......等等。
基本的操作這邊推薦可以直接上網查有人整理好的指令doc
而Volatility分為2與3版,差別就是一個是要使用 python2 執行,另一個是用 python3 執行,並且現在Volatility 2 已經沒有在維護了,但是一些 Plugin 的完整度在目前為止還是比 Volatility 3 還要高並且豐富,所以有些人還是會比較會偏向使用 Volatility 2 ,今天分享會主要使用 Volatility 3
首先,拿到一個 Memory 檔,起手式大家可能會想要先看一下這個 Memory 檔是什麼作業系統,並且Linux 版本是什麼?所以都會先下這個指令
python3 .\vol.py -f "C:\Users\yunshiuan\Desktop\demo.mem" banners
得知了他的作業系統與版本後,接下來可能會想要用 pslist 或者 pstree 去看有什麼可疑的進程,
python3 .\vol.py -f "C:\Users\yunshiuan\Desktop\demo.mem" linux.pslist
但是有很大的機率會出現下面的錯誤
這個錯誤是什麼意思?這時候就需要提到 Volatility 是怎麼對一個記憶體進行分析的
如果有人把這個錯誤丟進GPT或者上網查,你應該會得知到說他是缺少Symbol Table
Volatility 在分析一個記憶體時會需要這張 Symbol Table ,是因為這個包含了函式的名稱,函式的偏移量以及函式的type等等,因此 Volatitily 在分析時才能定位到正確的進入點進行分析,另外他會存在volility3 指定位置中並且是json檔
其實在官網有給一些基本的 Symbol Table ,但是因為 Linux 核心更新的速度很快,因此官網給的根本完全不夠。
那怎麼辦?這邊提供兩個解決方式:
有開源者定期會去抓最新出的 Linux 核心版本的 Symbol Table 這邊推薦github 連結
https://github.com/Abyss-W4tcher/volatility3-symbols
https://github.com/Abyss-W4tcher/volatility2-profiles
這個 github repo 最近都還有持續在維護,更新的很快,可以參考看看,下載後放在volatility 指定放 Symbol 的目錄即可/volatility3/symbols/linux/
如果需要的 Symbol Table 太新了還沒有人做怎麼辦,那就是自己做的一個。
官網的 doc 中有提供製作的步驟,我們可以照著他的順序製作。這邊提供的是其中一個製作的方式,網路上其實有其他人分享其他方式,這邊給大家參考
首先就是run banners 看他的 Linux Kernel 版本以及對應的作業系統
以我們最一開始看到的 Linux Kernel 版本是 5.15.0-151 並且作業系統是 Ubuntu,上網查會發現他是Ubuntu 22.04。
我們接下來開一台 Ubuntu 22.04 環境的虛擬機,獲得官網步驟當中提到的 debug kernel 副本
首先先看一下現在環境的Linux 版本
現在是5.15.0-153,跟我們 banners 出來的版本有差別,不過沒關係因為之後我們可以選擇下載我們想要的版本。
接下來執行以下指令去下載一個叫做 vmlinux-5.15.0-151-generic 的檔案,這個檔案就是我們需要debug kernel 副本檔,因為他裡面就是存著函式的名稱,函式的偏移量以及函式的type等等
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt install ubuntu-dbgsym-keyring
sudo apt-get update
sudo apt-get install linux-image-5.15.0-151-generic-dbgsym
下載完後我們就可以在/usr/lib/debug/boot
這個路徑看到我們下載的vmlinux-5.15.0-151-generic。
接下來官方建議使用 dwarf2json 這個工具將我們剛剛下載的vmlinux 檔案轉化成 json 檔,變成 Volatility 可以讀取的 Symbol table ,然後因為他是用 Golang 寫的所以要安裝一下 Golang
git clone https://github.com/volatilityfoundation/dwarf2json
cd dwarf2json/
sudo apt install golang-go
go mod download github.com/spf13/pflag
go build
接下來工具跟檔案都用好後就可以開始進行轉換。
sudo ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0-151-generic > vmlinux-5.15.0-151-generic.json
轉換後看你要開http server 把檔案抓下來放到你自己的環境 還是要直接在裝一個volatility 在虛擬機都ok,之後把它丟進 Volatility 放 Symbol Table 的指定位置/volatility3/symbols/linux/
放好後這樣就完成了,可以驗證一下有沒有 work ,可以再跑一次pslist 看看
發現成功執行,並且驗證我們製作的Symbol Table 可以 work
在Linux 記憶體分析部分,他並沒有跟 Windows 一樣有 dumpflies 一樣的 Plugin,但是根據這個 issues 有人有整理出了dump 的方式
linux.pslist.PsList --dump
linux.elfs.Elfs --dump
linux.proc.Maps --dump
linux.pagecache.InodePages --dump
那根據他所整理出來的資訊,我們就可以跟 windows 的 dumpfiles 一樣,將 Linux 記憶體中我們想要的檔案 dump 出來。
這邊一樣用同樣的記憶體 Dump 做 demo
你如果想要把/etc/passwd dump 出來,可以先看一下怎麼用linux.pagecache.InodePages
這個Plugin
PS C:\Users\yunshiuan\Desktop\Tools\volatility3 > python3 .\vol.py -f "C:\Users\yunshiuan\Desktop\demo.mem" linux.pagecache.InodePages -h
Volatility 3 Framework 2.26.2
usage: vol.py linux.pagecache.InodePages [-h] [--find FIND] [--inode INODE] [--dump]
Lists and recovers cached inode pages
options:
-h, --help show this help message and exit
--find FIND Filename (full path) to find
--inode INODE Inode address
--dump Extract inode content
可以用--find
直接用字串搜尋想要的檔案,也可以用--inode
用Inode address 去搜尋,要用Inode address 搜尋之前需要先用linux.pagecache.Files
查詢檔案的 Inode address ,最後再下一個--dump
把檔案dump 出來
之後dump file 就可以用下面的指令
PS C:\Users\yunshiuan\Desktop\Tools\volatility3 > python3 .\vol.py -f "C:\Users\yunshiuan\Desktop\demo.mem" linux.pagecache.InodePages --find "/etc/passwd" --dump
Volatility 3 Framework 2.26.2
Progress: 100.00 Stacking attempts finished
PageVAddr PagePAddr MappingAddr Index DumpSafe Flags Output File
0xdaac04525100 0x114944000 0x9615004ade70 0 True active,has_hwpoisoned,lru,mappedtodisk,referenced,reported,uptodate inode_0x9615004adcf8.dmp
最後看一下inode_0x9615004adcf8.dmp
是不是我們要的
那我們就成功將我們想要的東西 dump 出來
其實 Windows 似乎也會遇到 Sysbol Table 缺失的問題,有機會的話我應該也會研究看看 Windows 的 Symbol Table 怎麼做,其他 Linux 記憶體分析的步驟跟 Windows 也大同小異,只是也多了一些 Plugin 可以使用,大家有興趣可以自己再嘗試看看,另外也可以去 NCKUCTF ctfd 把我放的 flag 解出來喔!
https://github.com/volatilityfoundation/volatility3/issues/1312
https://volatility3.readthedocs.io/en/latest/symbol-tables.html
https://cpuu.hashnode.dev/how-to-perform-memory-forensic-analysis-in-linux-using-volatility-3
https://daniel-schwarzentraub.medium.com/tryhackme-free-room-profiles-using-volatility3-ba94240e2f57