Volatility FAQ
0x00 前言
出於檢測Linux平臺下Rootkit的需要,試了一下很早以前知道,但一直沒有用過的工具Volatility.考慮國內伺服器的現實情況,選擇CentOS 5.5作為實驗平臺. 一個工具的使用在我想來應該是相當簡單的,但實際情況相當曲折,……經過很多實踐和教訓,寫了一些筆記,整理為FAQ,遂成此文,以供同好交流討論.
0x01 正文
Q1: Volatility 是什麼?
A1: Volatility是一個Python編寫的跨平臺,用於記憶體分析的法證工具,其目的是為了在資料犯罪中提取易失性資料 ,也可以用來進行Rootkit的檢測和協助清除.
Q2:其大致原理是什麼?
A2: Linux的System.map檔案列出了詳細的系統呼叫(syscall),而kernel-header原始碼透過dwarfdump生成的module.dwarf檔案中會包含很多kernel‘s data structure,將以上2個檔案打包為profile.再用這個profile解析dump下來的實體記憶體,就很容易找到植入Rootkit的機器活動時的程式(linux_psaux)、網路通訊(linux_netstat)、活動檔案(linux_lsof)、驅動模組(linux_lsmod)等等.
Q3: CentOS 5X中為執行volatility而安裝了python2.6,導致依賴python2.4的yum無法執行,如何處理?
A3: 編譯安裝Python2.6後執行以下操作:
#mv /usr/bin/python /usr/bin/python2.4
#ln -s /usr/local/bin/python2.6 /usr/bin/python
#vi /usr/bin/yum
將檔案開始的#!/usr/bin/python改#!/usr/bin/python2.4
Q4:執行python vol.py,報錯提示
Volatile Systems Volatility Framework 2.3.1 \***| Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
A4: Volatility需要pycrypto的支援以便進行Hash運算
#yum install pycrypto
Q5:執行yum install pycrypto後,Python仍提示
Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
A5: 列印Crypto lib庫檔案路徑,確認python2.7能夠import Crypto庫.
#python
import Crypto
import os
print(Crypto.__file__);
print (dir(Crypto));
print(os.listdir(os.path.dirname(Crypto.__file__)))
提示無法匯入Crypto庫,在python2.4中列印Crypto成功,那就
#cp -ivR /usr/lib/python2.4/Crypto/ /usr/lib/python2.7/site-packages/
Q6:執行python vol.py後提示
RuntimeWarning: Python C API version mismatch for module Crypto.Hash.MD4: This Python has API version 1013, module Crypto.Hash.MD4 has version 1012.from Crypto.Hash import MD5, MD4
A6: yum或apt安裝的pycrypto版本問題,實際不影響使用,追求完美就換版本.
#wget –v https://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.1.tar.gz
#tar zxvf pycrypto-2.6.1.tar.gz
#python setup.py install
#ll /usr/local/lib/python2.7/site-packages/Crypto/
Q7: volatility.可以正常使用了,該開始製作profile,那麼profile如何建立?
A7: 每個Linux發行版的不同核心都需要單獨建立一個profile,基本上不通用,示例如下:
#cd volatility/tools/linux
#make
#head module.dwarf
#zip volatility/volatility/plugins/overlays/linux/Ubuntu1204.zip volatility/tools/linux/module.dwarf /boot/System.map-3.2.0-23-generic
Q8:CentOS 5X似乎預設沒有dwarfdump.
A8: CentOS沒有能提供dwarfdump的源,但volatility官方提示Fedora repository的源可以提供,只要執行yum install elfutils-libelf-devel"就可以.但不幸的是,安裝了elfutils-libelf-devel,也找不到dwarfdump.所以還是自力更生吧
#wget -v http://www.prevanders.net/libdwarf-20140519.tar.gz //官網下載最新版本
#./configure
#make dd
//You may need to be root to do the following copy commands
#cp dwarfdump/dwarfdump /usr/local/bin
#cp dwarfdump/dwarfdump.conf /usr/local/lib
Q9: CentOS 5X沒有對應版本的核心標頭檔案(kernel-headers),無法編譯module.dwarf?
A9:
#yum install kernel-headers-$(uname -r) kernel-devel-$( uname -r) –y //CentOS
#apt-get install linux-headers-`uname -r` //Ubuntu
如果軟體源中沒有匹配的版本,那就手動下載安裝 一般還在支援的版本可在http://pkgs.org/download/kernel-headers#下載 否則,只能自行google了.
Q10: profile順利製作完成,開始dump記憶體.但是執行以下命令:
#dd if=/dev/mem of=/tmp/ram.dump bs=1MB count=1024
dump的記憶體只有1MB,而非1G.
A10: Linux Kernel 2.6.x某個版本後開始對記憶體訪問做了保護,無法dump出完整記憶體.可使用第三方工具Lime / fmem等來dump記憶體.
Q11: Lime原始碼編譯安裝後只生成一個ko驅動檔案,沒有ELF檔案,怎麼dump記憶體?
A11:
#insmod lime.ko “path=/tmp/mem.lime format=lime” //載入驅動就是正確使用方法
Q12: lime在ubuntu/debian的機器上使用正常,為什麼在CentOS 上提示錯誤
#insmod lime.ko “path=/tmp/mem.lime format=lime”
insmod: error inserting 'lime.ko': -1 Unknown symbol in module
A12: CentOS 下insmod命令的引數不接受雙引號,去掉即可,即執行insmod lime.ko path=/tmp/mem.lime format=lime 就好.
Q13: profile和dump記憶體都搞定了,先呼叫volatility看一下記憶體中的網路連線,在CentOS執行
#vol -f /tmp/centos.lime --profile=LinuxCentOS510.zip linux_netstat
提示
Volatility Foundation Volatility Framework 2.3.1
ERROR : volatility.addrspace: Invalid profile LinuxCentOS510.zip selected
A13: 難道profile後面需要接絕對路徑,試了一下仍不行,再次翻閱英文文件,原來profile檔案建立後被放在指定的目錄volatility/plugins/overlays/linux/中,主程式vol.py啟動時,會讀取這個目錄下的profile檔案並自動為其賦予一個新名稱,使用這個新名稱才能正常呼叫profile. 查詢已有的profile名稱的命令為:
#vol --info |grep Linux
LinuxCentOS505x64 - A Profile for Linux CentOS510 x64
linux_banner - Prints the Linux banner information
linux_yarascan - A shell in the Linux memory image
所以正確呼叫volatility外掛的命令應該為:
#vol -f /tmp/centos.lime --profile=LinuxCentOS510x64 linux_netstat
Q14: 在CentOS 5X_64上執行
#vol -f /tmp/centos.lime --profile=LinuxCentOS510x64 linux_netstat
錯誤提示:
No suitable address space mapping found
A14: 此問題涉及的相關原始碼在./volatility/plugins/overlays/linux/linux.64.py
中.
#vi linux64.py
class VolatilityDTB(obj.VolatilityMagic):
"""A scanner for DTB values."""
def generate_suggestions(self):
"""Tries to locate the DTB."""
profile = self.obj_vm.profile
yield profile.get_symbol("init_level4_pgt") - 0xffffffff80000000
出現問題的可能原因: 在CentOS_X64的的 2.6.18.x kernel中,當核心編譯時,置CONFIG_RELOCATABLE=y.實體記憶體的前2MB都被保留,獲取DTB (physical address)時,offset因此需要額外增加0x200000(2M).即DTB的地址=(“init_level4_pgt”) - 0xffffffff80000000(2G)-0x200000(2M) 所以我們需要對程式碼作如下修改:
#cd ../volatility/plugins/overlays/linux
#vi linux.py
修改第1000行將shift = 0xffffffff80000000改為shift = 0xffffffff7fe00000
#vi linux64.py
同時修改linux64.py的第38行 將
yield profile.get_symbol("init_level4_pgt") - 0xffffffff80000000
改為
yield profile.get_symbol("init_level4_pgt") - 0xffffffff7fe00000
再次執行命令,一切正常,Over.
Q15: volatility對Linux核心版本有要求嗎?適用範圍?
A15: volatility當前最新版本2.3.1支援
32-bit Linux kernels 2.6.11 to 3.5
64-bit Linux kernels 2.6.11 to 3.5
OpenSuSE, Ubuntu, Debian, CentOS, Fedora, Mandriva, etc
其它系統:
Windows 32-bit Windows XP Service Pack 2 and 3
32-bit Windows 2003 Server Service Pack 0, 1, 2
32-bit Windows Vista Service Pack 0, 1, 2
32-bit Windows 2008 Server Service Pack 1, 2
32-bit Windows 7 Service Pack 0, 1
64-bit Windows XP Service Pack 1 and 2
64-bit Windows 2003 Server Service Pack 1 and 2
64-bit Windows Vista Service Pack 0, 1, 2
64-bit Windows 2008 Server Service Pack 1 and 2
64-bit Windows 2008 R2 Server Service Pack 0 and 1
64-bit Windows 7 Service Pack 0 and 1
Mac OSX (new) 32-bit 10.5.x Leopard (the only 64-bit 10.5 is Server, which isn't supported)
32-bit 10.6.x Snow Leopard
64-bit 10.6.x Snow Leopard
32-bit 10.7.x Lion
64-bit 10.7.x Lion
64-bit 10.8.x Mountain Lion (there is no 32-bit version)
0x03 題外
為方便啟動volatility. 可執行
#ln -s /pentoo/volatility-2.3.1/vol.py /usr/bin/vol
相關文章
- kali記憶體取證-volatility2024-07-20記憶體
- Volatility:分析MS10-061攻擊2019-02-26
- Docker FAQ2019-02-23Docker
- Oracle Faq2007-02-25Oracle
- PG 函式的易變性(Function Volatility Categories)2012-10-29函式FunctionGo
- autoit《FAQ大全》2013-12-03
- Windows Phone FAQ2011-10-28Windows
- Android FAQ2011-10-10Android
- Oracle並行FAQ2019-05-28Oracle並行
- flutter基礎faq2018-09-24Flutter
- linux FAQ(zz)2013-06-18Linux
- Oracle Database Internals FAQ2008-12-12OracleDatabase
- squid官方faq2008-11-14UI
- ABAP Interview Faq's2010-06-27View
- 《Redis官方教程》-FAQ2016-04-01Redis
- Oracle Backup and Recovery FAQ2007-03-13Oracle
- MySQL複製FAQ2012-03-04MySql
- RedHatPostfix中文FAQ(轉)2007-08-11Redhat
- Android 8.0 開發者 FAQ2017-10-21Android
- FAQ寶典之RancherServer2017-11-12Server
- Microsoft .NET 框架 FAQ (轉)2007-12-12ROS框架
- 【譯】ConfigureAwait FAQ2023-04-18AI
- 資料結構FAQ (轉)2008-05-27資料結構
- PostgreSQL常見問題(FAQ)2011-02-03SQL
- FAQ: Goods Receipt sd 問題2011-07-21Go
- udev-FAQ 中文翻譯2006-08-21dev
- REDHAT 7.1 sendmail配置FAQ (轉)2007-12-10RedhatAI
- Oracle效能優化FAQ (zt)2007-12-07Oracle優化
- 轉載:Oracle iLearning FAQ2009-08-13Oracle
- RSLB2 windows下使用FAQ2019-03-13Windows
- The SAP Business Suite 4 SAP HANA FAQ2016-09-01UI
- FAQ系列|MySQL索引之聚集索引2017-08-02MySql索引
- discuz /faq.php SQL Injection Vul2015-05-23PHPSQL
- PIGOSS售前使用說明(FAQ)2016-06-01Go
- ORACLE之常用FAQ:效能調整2007-04-18Oracle
- REST實戰討論組FAQ2012-01-26REST
- MySQL主從同步加速Transfer–FAQ2016-03-24MySql主從同步
- 核心FAQ 舉例說明 (轉)2007-12-07