隨著網絡攻擊和網絡犯罪技術的發展,內存取證作為計算機取證研究的重要分支,對於獲取、分析內存數據、提取網絡攻擊和網絡犯罪證據、重構網絡攻擊和網絡犯罪場景具有重要理論價值和實用價值.
在我們的上一篇 藍隊安全 : 內存取證(上-獲得內存) 中我們講解並實戰了在不同系統平臺下獲得內存的方法,本次我們就著手分析 dump 出來的內存文件,在實戰中進一步的學習內存取證的知識點.
VolatilityVolatility,作為內存取證最為常用的工具,是必須要掌握的。
Volatility 是什麼
Volatility 是一個用於事件響應和惡意軟體分析的開源內存取證框架。它是用 Python 編寫的,支持 Microsoft Windows,macOS 和 Linux,volatility 框架是一個完全開放的工具集合,在 GNU 通用許可證下用 Python 實現,用於從易失性存儲器(RAM)樣本中提取數字鏡像。提取技術完全獨立於被取證的系統而執行,但可以查看到系統運行時的狀態信息。該框架旨在向人們介紹從內存樣本中提取的數字鏡像相關的技術,並為進一步研究該領域提供一個平臺,它可以分析 .raw、.vmem、.img 後綴的文件。
支持原始數據轉儲(Raw Dump)、崩潰轉儲(Crash Dump)、休眠文件及各種其它格式,甚至可以支持多個格式之間的轉換。
Volatility 在 linux 平臺下安裝較為麻煩,下面總結了幾個常用的平臺安裝 Volatility 的方法,確保安裝成功,並支持所有模塊
如果對一些高級功能沒有要求,建議直接下載 windows 平臺的二進位文件使用,免安裝,非常方便
Ubuntu 下安裝 Volatility
apt-get install -y volatility
apt-get install -y python-dev
apt-get install -y python3-dev
python2 -m pip install distorm3 yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
cd /tmp
git clone https://github.com/gdabah/distorm
cd distorm
python2 -m pip install distorm3
volatility --infokali 下安裝 Volatility
cd /tmp
wget https://bootstrap.pypa.io/get-pip.py
python2 get-pip.py
python2 -m pip install --upgrade pip
apt-get install -y python-dev
apt-get install -y python3-dev
cd /tmp
git clone https://github.com/gdabah/distorm
cd distorm
python2 -m pip install distorm3
cd
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
python setup.py build
python setup.py install
python2 -m pip install distorm3 yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
python vol.py --infocentos 下安裝 Volatility
yum install -y kernel-devel
yum install -y make gcc gcc-c++
yum groupinstall -y "Development Tools"
yum install -y yum-utils
yum install -y pcre-devel libpcre++-devel python-devel pycrypto
pip install --upgrade pip
python2 -m pip install distorm3==3.4.4
python2 -m pip install yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
cd
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
python setup.py build
python setup.py install
python vol.py --infowindows 下安裝 Volatility
windows 比較容易,直接訪問官網下載二進位文件即可 https://www.volatilityfoundation.org/releases
Volatility 支持的插件列表windows 下支持的插件列表
amcache # 查看 AmCache 應用程式痕跡信息
apihooks # 檢測內核及進程的內存空間中的 API hook
atoms # 列出會話及窗口站 atom 表
atomscan # Atom 表的池掃描(Pool scanner)
auditpol # 列出註冊表 HKLM\SECURITY\Policy\PolAdtEv 的審計策略信息
bigpools # 使用 BigPagePoolScanner 轉儲大分頁池(big page pools)
bioskbd # 從實時模式內存中讀取鍵盤緩衝數據(早期電腦可以讀取出 BIOS 開機密碼)
cachedump # 獲取內存中緩存的域帳號的密碼哈希
callbacks # 列印全系統通知例程
clipboard # 提取 Windows 剪貼板中的內容
cmdline # 顯示進程命令行參數
cmdscan # 提取執行的命令行歷史記錄(掃描_COMMAND_HISTORY 信息)
connections # 列印系統打開的網絡連接(僅支持 Windows XP 和 2003)
connscan # 列印 TCP 連接信息
consoles # 提取執行的命令行歷史記錄(掃描_CONSOLE_INFORMATION 信息)
crashinfo # 提取崩潰轉儲信息
deskscan # tagDESKTOP 池掃描(Poolscaner)
devicetree # 顯示設備樹信息
dlldump # 從進程地址空間轉儲動態連結庫
dlllist # 列印每個進程加載的動態連結庫列表
driverirp # IRP hook 驅動檢測
drivermodule # 關聯驅動對象至內核模塊
driverscan # 驅動對象池掃描
dumpcerts # 提取 RAS 私鑰及 SSL 公鑰
dumpfiles # 提取內存中映射或緩存的文件
dumpregistry # 轉儲內存中註冊表信息至磁碟
editbox # 查看 Edit 編輯控制項信息 (Listbox 正在實驗中)
envars # 顯示進程的環境變量
eventhooks # 列印 Windows 事件 hook 詳細信息
evtlogs # 提取 Windows 事件日誌(僅支持 XP/2003)
filescan # 提取文件對象(file objects)池信息
gahti # 轉儲用戶句柄(handle)類型信息
gditimers # 列印已安裝的 GDI 計時器 (timers) 及回調(callbacks)
gdt # 顯示全局描述符表(Global Descriptor Table)
getservicesids # 獲取註冊表中的服務名稱並返回 SID 信息
getsids # 列印每個進程的 SID 信息
handles # 列印每個進程打開的句柄的列表
hashdump # 轉儲內存中的 Windows 帳戶密碼哈希(LM/NTLM)
hibinfo # 轉儲休眠文件信息
hivedump # 列印註冊表配置單元信息
hivelist # 列印註冊表配置單元列表
hivescan # 註冊表配置單元池掃描
hpakextract # 從 HPAK 文件(Fast Dump 格式)提取物理內存數據
hpakinfo # 查看 HPAK 文件屬性及相關信息
idt # 顯示中斷描述符表(Interrupt Descriptor Table)
iehistory # 重建 IE 緩存及訪問歷史記錄
imagecopy # 將物理地址空間導出原生 DD 鏡像文件
imageinfo # 查看 / 識別鏡像信息
impscan # 掃描對導入函數的調用
joblinks # 列印進程任務連結信息
kdbgscan # 搜索和轉儲潛在 KDBG 值
kpcrscan # 搜索和轉儲潛在 KPCR 值
ldrmodules # 檢測未連結的動態連結 DLL
lsadump # 從註冊表中提取 LSA 密鑰信息(已解密)
machoinfo # 轉儲 Mach-O 文件格式信息
malfind # 查找隱藏的和插入的代碼
mbrparser # 掃描並解析潛在的主引導記錄(MBR)
memdump # 轉儲進程的可尋址內存
memmap # 列印內存映射
messagehooks # 桌面和窗口消息鉤子的線程列表
mftparser # 掃描並解析潛在的 MFT 條目
moddump # 轉儲內核驅動程序到可執行文件的示例
modscan # 內核模塊池掃描
modules # 列印加載模塊的列表
multiscan # 批量掃描各種對象
mutantscan # 對互斥對象池掃描
notepad # 查看記事本當前顯示的文本
objtypescan # 掃描窗口對象類型對象
patcher # 基於頁面掃描的補丁程序內存
poolpeek # 可配置的池掃描器插件
printkey # 列印註冊表項及其子項和值
privs # 顯示進程權限
procdump # 進程轉儲到一個可執行文件示例
pslist # 按照 EPROCESS 列表列印所有正在運行的進程
psscan # 進程對象池掃描
pstree # 以樹型方式列印進程列表
psxview # 查找帶有隱藏進程的所有進程列表
qemuinfo # 轉儲 Qemu 信息
raw2dmp # 將物理內存原生數據轉換為 windbg 崩潰轉儲格式
screenshot # 基於 GDI Windows 的虛擬屏幕截圖保存
servicediff # Windows 服務列表(ala Plugx)
sessions # _MM_SESSION_SPACE 的詳細信息列表(用戶登錄會話)
shellbags # 列印 Shellbags 信息
shimcache # 解析應用程式兼容性 Shim 緩存註冊表項
shutdowntime # 從內存中的註冊表信息獲取機器關機時間
sockets # 列印已打開套接字列表
sockscan # TCP 套接字對象池掃描
ssdt # 顯示 SSDT 條目
strings # 物理到虛擬地址的偏移匹配(需要一些時間,帶詳細信息)
svcscan # indows 服務列表掃描
symlinkscan # 符號連結對象池掃描
thrdscan # 線程對象池掃描
threads # 調查_ETHREAD 和_KTHREADs
timeliner # 創建內存中的各種痕跡信息的時間線
timers # 列印內核計時器及關聯模塊的 DPC
truecryptmaster # 恢復 TrueCrypt 7.1a 主密鑰
truecryptpassphrase # 查找並提取 TrueCrypt 密碼
truecryptsummary # TrueCrypt 摘要信息
unloadedmodules # 列印卸載的模塊信息列表
userassist # 列印註冊表中 UserAssist 相關信息
userhandles # 轉儲用戶句柄表
vaddump # 轉儲 VAD 數據為文件
vadinfo # 轉儲 VAD 信息
vadtree # 以樹形方式顯示 VAD 樹信息
vadwalk # 顯示遍歷 VAD 樹
vboxinfo # 轉儲 Virtualbox 信息(虛擬機)
verinfo # 列印 PE 鏡像中的版本信息
vmwareinfo # 轉儲 VMware VMSS/VMSN 信息
volshell # 內存鏡像中的 shell
windows # 列印桌面窗口(詳細信息)
wintree # Z 順序列印桌面窗口樹
wndscan # 池掃描窗口站
yarascan # 以 Yara 籤名掃描進程或內核內存linux 下支持的插件列表
# 獲取系統進程信息相關命令
linux_pstree # 進程樹列表
linux_pslist_cache # 來自的 kmem_cache 活動進程
linux_psxview # 比較進程列表
linux_lsof # 打開文件描述符的每個活動進程
linux_pslist # 活動的進程列表
linux_psaux # 活動的進程列表(輸出內容包括更多的細節)
# 獲取系統內存信息的相關命令
linux_memmap # 內存映射文件
linux_pidhashtable # Linux 內核中的 PID 散列表
linux_proc_maps # 轉儲由-s/-vma 參數到磁碟上指定的內存範圍。
linux_dump_map # 進程內存的詳細信息,包括堆和共享庫。
linux_bash # bash 歷史文件
# 獲取網絡接口信息的相關命令
linux_arp # 顯示 arp 列表
linux_ifconfig # 顯示網絡接口詳細情況
linux_route_cache # 顯示網絡路由表
linux_netstat # 查看網絡連結情況
# 獲取系統硬體信息的相關命令
linux_cpuinfo # 顯示 cpu 的相關命令信息。
linux_dmesg # 顯示內核緩存信息。
linux_iomem # 顯示 io 設備信息。
linux_mount # 顯示/proc/mouns 的相關命令信息,主要是掛載的磁碟設備。
linux_mount_cache # 顯示 kmem_cache 的相關命令信息。
linux_slabinfo # 顯示/proc/slabinfo 的相關命令信息。
# rootkit 檢測的相關命令
linux_check_afinfo # 檢查篡改網絡協議結構。
linux_check_creds # 檢查進程共享結構。
linux_check_fop # 檢查文件操作數據結構篡改情況。
linux_check_idt # 檢查中斷描述符表(IDT)的篡改情況。
linux_check_syscall # 在系統調用表檢查功能情況。
linux_check_modules # 檢查用於從內核模塊列表中缺少在 sysfs 中的項目。
# 獲取內核模塊信息的相關命令
linux_lsmod # 加載內核模塊。
linux_tmpfs # tmpfs 的內容。
功能使用下面利用 Dumplt 工具提取 windows7 和 windows10 的相關內存鏡像,並在 windows平臺進行分析,部分操作在 kali環境下進行分析。
獲取鏡像信息
首先獲取鏡像的摘要信息,一般這是進行鏡像分析的第一步
volatility -f [image] imageinfo這其中比較有用的信息就是 Suggested Profile(s) ,這個是工具識別的系統版本,存在多個的原因是這是根據一些特徵識別的,所以可能有誤報,就把各種結果按照可能性排列出來了,一般直接選擇第一個,如果加載插件報錯的話,可以嘗試後面的。
這裡根據給出的結果選擇第一個,然後使用 pslist 插件,看一下系統中運行的進程。
按照 EPROCESS 列表列出所有正在運行的進程
volatility -f [image] --profile=[profile] pslist如圖中 lsass.exe、winlogon.exe ,在 windows 本地登錄時,用戶的密碼存儲在 %SystemRoot%\system32\config\SAM 這個文件裡。當用戶輸入密碼進行本地認證的過程中,所有的操作都是在本地進行的。他其實就是將用戶輸入的密碼轉換為 NTLM Hash,然後與 SAM 中的 NTLM Hash 進行比較。當用戶註銷、重啟、鎖屏後,作業系統會讓 winlogon 顯示登錄界面,也就是輸入框。當 winlogon.exe 接收輸入後,將密碼交給 lsass 進程,這個進程中會存一份明文密碼,將明文密碼加密成 NTLM Hash,對 SAM 資料庫比較認證。
notepad.exe 是指正在運行一個記事本程序,而 mspaint.exe 是指是微軟畫圖程序, cmd.exe 指正在運行命令行程序
以 dot 圖的形式導出
這裡可以將進程樹以 dot 圖的形式導出,這裡在 kali 中進行操作,用 xdot 工具查看生成的圖片
python vol.py -f [image] --profile=[profile] psscan --output=dot --output-file=out.dot
apt install -y xdot把進程以樹的形式顯示
volatility -f [image] --profile=[profile] pstree查看 DLL 文件
當我們發現可疑進程後,可通過此命令進行深度查看
volatility -f [image] --profile=[profile] dlllist -p [pid]轉儲出可尋址的內存數據
在上面的進程中可以看到,存在一個 mspaint.exe 的進程,它是微軟的畫圖軟體,對於這樣的情況,可以使用工具還原內存中的圖片, 來當時查看的圖片或者當時狀態的圖片,使用的工具是 gimp,可以在 linux 上安裝使用。
這裡首先將 mspaint.exe 的進程內存 dump 出來,使用 memdump 插件,在之前列舉進程的截圖中,進程名字後面一行就是該進程的 PID。
volatility -f [image] --profile=[profile] memdump -p [pid] --dump-dir ./將獲取到的 2276.dmp 文件改名為 2276.data,然後在 gime 中點擊顯示全部文件,選擇 2276.data 打開
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
sudo apt-get update
sudo apt-get install gimp # 安裝 gimp
gimp # 啟動 gimp
mv 2276.dmp 2276.data首先選擇一個固定的寬度,這裡選擇 1000,然後調節高度把屏幕鋪滿,然後再大幅度拖動 Image 下的 Offset 的滑塊,當看到圖片類似下圖時停止,可以看到隱隱約約有一張圖,但是有點重疊,這時,點擊上下箭頭緩慢調節 Width,其中 Heigth 在調節中作用是不大的,主要是 Width 和 Offset 的調節決定是否能看到圖片
微調位移為圖像的左右方向平移,大幅調節位移則是圖像的上下方向平移。而寬度不變時,始終顯示的都是同一幅圖像。
在調節時,不僅僅只能看到畫圖程序的圖片,如下圖,就調出了另一個狀態的一個系統圖片
查看系統中的文件
通過 filescan 命令,可以掃描當前狀態下的一些文件,例如桌面的文件,或者特定類型的文件,這些都是結合 grep 命令來實現的
volatility -f [image] --profile=[profile] filescan | grep -E "zip|txt|doc|pdf"查看桌面的文件
volatility -f [image] --profile=[profile] filescan | grep "Desktop"dump 掃描到的文件
在上一步中,發現了桌面的一個 flag.txt,那麼可以使用 dumpfiles 命令來將文件 dump 出來
volatility -f [image] --profile=[profile] dumpfiles -Q 0x000000007de00130 --dump-dir ./
# 這裡的 -Q 參數是前面掃描時候的第一個參數,標記了文件的轉儲的物理地址dump 出的文件默認是 dat 後綴的,可以使用 linux 下的 file 命令來查看獲取的文件類型,或者是根據之前掃描文件獲取到的文件名來修改後綴
轉儲內存中的進程裡 exe 文件
volatility -f [image] --profile=[profile] procdump -p [pid] --dump-dir ./我們這裡將 Dumplt 工具轉儲出來
Linux 下 volatility 的使用
Volatility 自帶一些 windows 系統的 profile,Linux 系統的 Profile 需要自己製作,製作的方法如下:實際是將 module.dwarf 和 system.map 打包成一個 zip 文件,接著將 zip 文件移動到 volatility/plugins/overlays/linux/ 目錄中。
這裡以 centos7 為例,先安裝 dwarfdump(必須安裝,創建 module.dwarf 文件的依賴)
yum install -y gcc make gcc-c++
yum install -y elfutils-devel
yum install -y kernel-devel
wget https://www.prevanders.net/libdwarf-20201201.tar.gz
tar -zxvf libdwarf-20201201.tar.gz
cd libdwarf-20201201
./configure
make
make install
cd ../在 volatility 目錄中的 tool/Linux 運行 make 命令來創建 module.dwarf 文件
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility/tools/linux
make
ls -l打包,將 centos7.zip 移至分析機的 volatility/plugins/overlays/linux/ 目錄中
zip centos7.zip /boot/System.map* module.dwarf在分析機上將 centos7.zip 至 volatility/plugins/overlays/linux/ 目錄中
mv centos7.zip /pentest/volatility/plugins/overlays/linux/
python vol.py --info | grep "centos7"實戰 linux 分析◇
住:這裡 LiME 導出的無法成功解析,不知道原因
」直接複製 centos7 的內存文件,放到分析機上,查看進程樹列表
python vol.py -f tmp.vmem --profile=Linuxcentos7x64 linux_pstree顯示網絡接口詳細情況
python vol.py -f tmp.vmem --profile=Linuxcentos7x64 linux_pstree總結
本文總結了如何使用 volatility 工具分析windows系統的內存轉儲文件,並實驗打包 Linux 系統的 Profile,分析centos系統的內存轉儲。目前 volatility 項目已不更新 Linux Profile 文件,大部分都需要自行打包,對於專業進行內存分析的人員,建議在其基礎上構建自己的內存分析庫。
關於我們江蘇智慧安全可信技術研究院是為了落實江蘇省南通市崇川區人民政府、江蘇省南通市工業與信息化局和公安部信息安全等級保護評估中心共建"長三角網絡安全產業園"具體工作而成立的新型科研機構,作為信息安全等級保護關鍵技術國家工程實驗室工業網際網路安全分實驗室的落地載體,負責"長三角網絡安全產業園"的具體運營工作。
我院安全研究團隊,長期從事攻防技術研究,積極開拓安全領域前瞻性技術研究。精湛的專業技術水平、豐富的問題處置經驗,為研究院產品的研發和升級、承擔國家重大安全項目和客戶服務提供了強有力的技術支撐。
人才招聘一、安全研究員(WEB漏洞挖掘方向)
工作地點:
崗位職責:
任職要求:
除python外至少掌握一門程式語言,如C/C++/Perl/PHP/Go/Java等。精通Web安全漏洞原理及利用技術(SQL注入、xss、文件上傳、csrf、文件包含、越權、SSRF、SSTI、反序列化等);熟悉滲透測試的流程、方法,具有豐富的滲透測試經驗。加分項:
在freebuf/t00ls等安全社區發表過安全文章;二、安全研究員(CTF方向)
工作地點:
崗位職責:
任職要求:
除python外至少掌握一門程式語言,如C/C++/Perl/PHP/Go/Java等。至少精通一項CTF技能,如 Web、Crypto、PWN、RE;加分項:
感興趣的小夥伴請聯繫張女士或HR部門,或將簡歷及應聘職位投送至下方郵箱。(請註明來源「研究院公眾號」)
聯繫人:張女士 郵箱:zhangm@nantongsec.com聯繫人:HR部門 聯繫電話 0513-85797588◇本文作者 r0fus0d
」