iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Security

Blue 了 Blue 了!只會看封包與log的我錯了嗎!系列 第 4

Day4 如果我獲得到了一個讀心術,我想要分析企鵝先生的記憶

  • 分享至 

  • xImage
  •  

🧂 前言

今天我想要分享關於在做Linux Memory Forensic 時會遇到的問題,現在搜尋的記憶體鑑識相關的入門文章與介紹,大多都是以分析 Windows 記憶體 Dump 為主,我個人在入門時也是從 Windows 開始,而我是參加 2025 AIS3的 CTF 組時剛好趁這個機會可以試試看學習 Linux 記憶體鑑識的部分,發現其實分析 Linux 記憶體 Dump 會出現一些有趣的問題,也藉由這次的機會跟大家分享。

今天的鐵人賽分分享會主要會用自己製作出的 Linux Memory Dump,檔案會放在 NCKUCTF ctfd 上,如果你對 Linux 的記憶體分析已經很熟悉的,可以先挑戰看看。


🍘 仙貝工具

Volatility

下載連結:

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


問題1 : Symbol Table 缺失

首先,拿到一個 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 是怎麼對一個記憶體進行分析的

什麼是Symbol Table

如果有人把這個錯誤丟進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

問題2 : HOW TO DUMPFILE ?

在Linux 記憶體分析部分,他並沒有跟 Windows 一樣有 dumpflies 一樣的 Plugin,但是根據這個 issues 有人有整理出了dump 的方式

  • Processes: linux.pslist.PsList --dump
  • ELFs: linux.elfs.Elfs --dump
  • Memory maps: linux.proc.Maps --dump
  • Files from the page cache: 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


上一篇
Day3 蛤?為什麼我做記憶體鑑識還要看evtx,我不知道我還要記Event ID啊,不鑑了,爛鑑識!
下一篇
Day5 在最近,企鵝先生的記憶又被翻出來調查了一波 ACSCCTF 2025 Please Recover My Files
系列文
Blue 了 Blue 了!只會看封包與log的我錯了嗎!11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言