取證通常作為一個公司的事件響應調查人員或者司法調查的取證人員,通過調查被入侵的機器,將被入侵者的行為軌跡梳理出來,還原整個入侵的過程。對於入侵者而言,了解電子取證,可以更全面的了解到自己能夠在系統中留下的痕跡,從而具有針對性的消除痕跡,而對於取證人員來說,電子取證無疑是了解整個入侵過程的關鍵。電子取證近年來也發展為了一個獨立的學科,其中在安全競賽中,電子取證也作為一部分考察內容,被納入到雜項的大類中,也有隻考察取證的競賽。下面從技術層面介紹Windows取證的相關知識。
取證的分類活取證死取證獲取內存工具在活取證中,可以使用內存dump工具,將被入侵的機器的內存保存下來,其中在Windows中經常使用的工具是Dumpit
DumpIt 是一款綠色免安裝的 windows 內存鏡像取證工具。利用它我們可以輕鬆地將一個系統的完整內存鏡像下來,並用於後續的調查取證工作
在dump內存後,獲取到的文件大小約等於主機內存的大小,所以在自己進行測試的時候,可以儘量把測試機的內存調小一點。
Dump內存這裡使用上面說的Dumpit工具,下載之後放到虛擬機中,雙擊之後輸入y即可獲取當前的狀態的內存文件,保存後是一個raw格式的文件,這裡我在測試機上dump了一下內存,獲取到了一個文件,用於下面的示例講解,大家可以根據下面的講解自己創建鏡像進行測試。
取證工具在取證工具中,比較有名的是Volatility,他是一個用於事件響應和惡意軟體分析的開源內存取證框架。它是用Python編寫的,支持Microsoft Windows,macOS和Linux,volatility框架是一個完全開放的工具集合,在GNU通用許可證下用Python實現,用於從易失性存儲器(RAM)樣本總提取數字鏡像。提取技術完全獨立於被取證的系統而執行,但可以查看到系統運行時的狀態信息。該框架旨在向人們介紹從內存樣本中提取的數字鏡像相關的技術,並為進一步研究該領域提供一個平臺,它可以分析 .raw、.vmem、.img後綴的文件
安裝方法在windows中可以直接下載exe的程序,放入環境變量中使用,而linux下需要進行安裝,這裡介紹linux下的安裝方法
首先下載文件
git clone https://github.com/volatilityfoundation/volatility.git
Volatility需要使用python2環境,所以需要保證使用的是python2
cd volatility
python setup.py build
python setup.py install
安裝完成後可以在volatility目錄下執行 python vol.py --info 來測試是否安裝成功可以將Volatilty的目錄放入環境變量中,這樣就可以在任意目錄下執行 vol.py
如果在運行中報錯或者提示錯誤信息,可以根據提示下載相應的模塊,例如下面幾個
Distorm3:反編譯庫
pip install distorm3
Yara:惡意軟體分類工具
pip install yara
PyCrypto:加密工具集
pip install pycrypto
PIL:圖片處理庫
pip install Pillow
OpenPyxl:讀寫excel文件
pip install openpyxl
ujson:JSON解析
pip install ujson
在進行安裝時,部分模塊可能會報錯,這就需要到https://pypi.org/project/搜索相應版本的模塊的源碼,進行手動安裝
基本使用Volatility命令的基本格式如下
python vol.py -f [image] ‐-profile=[profile][plugin]
其中 -f 後面加的是要取證的文件, --profile 後加的是工具識別出的系統版本, [plugin] 是指使用的插件,其中默認存在一些插件,另外還可以自己下載一些插件擴充。
可以使用 -h 參數獲取使用方法和插件介紹,這裡只列舉幾個常用到的
imageinfo:顯示目標鏡像的摘要信息,這常常是第一步---獲取內存的作業系統類型及版本,之後可以在 –profile 中帶上對應的作業系統,後續操作都要帶上這一參數
pslist:該插件列舉出系統進程,但它不能檢測到隱藏或者解鏈的進程,psscan可以
notepad:查看當前展示的 notepad 文本
editbox:顯示有關編輯控制項的信息
screenshot:保存基於GDI窗口的偽截屏
psscan:可以找到先前已終止(不活動)的進程以及被rootkit隱藏或解鏈的進程
pstree:以樹的形式查看進程列表,和pslist一樣,也無法檢測隱藏或解鏈的進程
mendump:提取出指定進程,常用foremost 來分離裡面的文件(歷年美亞杯有此題)
filescan:掃描所有的文件列表
hashdump:查看當前作業系統中的 password hash,例如 Windows 的 SAM 文件內容(實際中沒有mimikatz效果好)
svcscan:掃描 Windows 的服務
connscan:查看網絡連接
cmdscan:可用於查看終端記錄
dlllist: 列出某一進程加載的所有dll文件
dumpfiles:導出某一文件(指定虛擬地址)
hivelist: 列出所有的註冊表項及其虛擬地址和物理地址
timeliner: 將所有作業系統事件以時間線的方式展開
下面使用Volatility對前面獲取的內存鏡像進行分析
首先獲取鏡像的摘要信息,一般這是進行鏡像分析的第一步
python vol.py -f TEST-PC.raw imageinfo
這其中比較有用的信息就是Suggested Profile(s) ,這個是工具識別的系統版本,存在多個的原因是這是根據一些特徵識別的,所以可能有誤報,就把各種結果按照可能性排列出來了,一般直接選擇第一個,如果加載插件報錯的話 可以嘗試後面的。
這裡根據給出的結果選擇第一個,然後使用 pslist 插件,看一下系統中運行的進程。
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 pslist
圖中標紅的是幾個需要注意的點,其中前兩個說明系統運行著 http 和 mysql 服務,後面的 notepad.exe 是指正在運行一個記事本程序,而 mspaint.exe 是指是微軟畫圖程序, cmd.exe 指正在運行命令行程序, DumpIt.exe 是之前說的用於獲取內存鏡像的工具。下面針對說到的幾個進行進行分析。
獲取記事本數據在上面介紹插件的時候,其中有兩個關於記事本的插件 notepad 、 editbox
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 notepad
顯示該這個插件不支持這個系統,這時可以使用 editbox 查看
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 editbox
可以看到這樣就能查看到當前打開的記事本中的內容了
查看當前桌面截圖可以使用 screenshot 查看查看當前桌面的偽截圖,其中會顯示桌面上窗口的框,不會顯示其中的內容
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 screenshot -D ./tmp
其中 -D 參數是導出的地址
在保存下來的圖片中可以看到有一張顯示了當時桌面的狀態
可以看到有一個DumpIt.exe 的窗口,還有另外兩個窗口
查看畫圖圖像在上面的進程中可以看到,存在一個 mspaint.exe 的進程,它是微軟的畫圖軟體,對於這樣的情況,可以使用工具還原內存中的圖片,來當時查看的圖片或者當時狀態的圖片,是用的工具是gimp,可以在linux上安裝使用。
這裡首先將 mspaint.exe 的進程內存dump出來,使用 memdump 插件,在之前列舉進程的截圖中,進程名字後面一行就是該進程的PID。
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 memdump -p 1616 -D ./
將獲取到的1616.dmp文件改名為1616.data,然後在gime中點擊顯示全部文件,選擇1616.data打開
調節技巧
首先選擇一個固定的寬度,這裡選擇1000,然後調節高度把屏幕鋪滿,然後再大幅度拖動Image下的Offset的滑塊,當看到圖片類似下圖時停止,可以看到隱隱約約有一張圖,但是有點重疊,這時,點擊上下箭頭緩慢調節Width,其中Heigth在調節中作用是不大的,主要是Width和Offset的調節決定是否能看到圖片
當調節到一定程度後,可以看到大致恢復出了畫圖程序當時的圖像,但是有點傾斜,如果更加細緻的調節,是可以調正的,同樣也可以找到彩色界面圖片。
當參數調節為以下時,可以看到當時圖片的彩色圖片,這時僅僅是圖片,沒有畫圖程序的界面。
在調節時,不僅僅只能看到畫圖程序的圖片,如下圖,就調出了另一個狀態的一個系統圖片
獲取系統中的用戶以及密碼Hash,一般翻譯為"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射,pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
使用hashdump插件可以獲取計算機內存中的用戶hash
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 hashdump
可以看到系統中存在六個帳戶,後面三個是隱藏帳戶,可能是入侵者創建的,下面介紹一下Windows下的Hash密碼值的格式
Windows系統下的hash密碼格式為:用戶名稱: RID:LM-HASH值:NT-HASH 值,例如:
Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC::: 表示
用戶名稱為:Administrator
RID 為:500
LM-HASH值為:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH 值為:683020925C5D8569C23AA724774CE6CC
所以可以將獲取的hash值拿到破解網站獲得明文,類型選擇NTLM
另外還可以從註冊表中,獲取系統中的用戶,
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 printkey -K "SAM\Domains\Account\Users\Names"
可以看到這裡獲取到的結果與使用hashdump獲取的不同,通過hashdump可以看到系統中共存在三個隱藏帳戶,其中的W4$僅僅是通過添加了$來進行了隱藏,這時,通過net user命令是看不到此用戶的,如下圖所示
但是在註冊表中,還存在該用戶的信息,所以可以通過查看註冊表的方式來找出該用戶。
而HomeGroupUser和hacker兩個用戶在添加了$符號的同時,還在註冊表中刪除了信息,所以通過註冊表是無法獲取到這兩個用戶的
在NT/2000/XP下有一個叫HideAdmin的工具,可以自動創建隱藏的具有管理員權限的用戶,創建後,通過net user命令和註冊表都無法看到用戶,甚至在計算機管理中,也無法看到隱藏用戶,如下圖
獲取運行過的命令在上面查看進程時,可以看到存在一個cmd進程,那麼可以使用cmdscan插件來查看運行過的命令。
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 cmdscan
可以看到執行了whoami、ifconfig、ipconfig這三個命令
查看系統中的文件通過filescan命令,可以掃描當前狀態下的一些文件,例如桌面的文件,或者特定類型的文件,這些都是結合grep命令來實現的
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 filescan | grep -E "zip|txt|doc|pdf"
查看桌面的文件
vol.py -f TEST-PC.raw --profile=Win7SP1x64 filescan | grep "Desktop"
這裡可以看到桌面有一個yep.txt的文件,下一步把它dump出來
dump掃描到的文件在上一步中,發現了桌面的一個yep.txt,那麼可以使用dumpfiles命令來將文件dump出來
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003d87bf20 -D ./
這裡的 -Q 參數是前面掃描時候的第一個參數標記了文件的轉儲的物理地址
dump 出的文件默認是dat後綴的,可以使用linux 下的 file 命令來查看獲取的文件類型,或者是根據之前掃描文件獲取到的文件名來修改後綴。
修改後可以看到文件的內容
總結本篇文章僅是簡單介紹了一下電子取證以及Volatility的簡單用法,實際電子取證還有很多內容,Volatility也有很多其他功能,想要詳細了解還需要繼續深入學習,並且多找機會練習,多積累經驗,這樣在拿到一個鏡像後,才有分析的方向。在上面的示例講解中,對使用Volatility取證的步驟做了簡單的介紹,並對notepad、editbox、memdump、hashdump printkeyfilescan、dumpfiles、cmdscan插件的使用做了相關示例的講解 另外介紹了gime的一個功能,在後面的文章中將會更深入介紹取證工具的使用和針對不同環境的取證方法。