危險漫步博客
有時候,正是那些意想不到之人,成就了無人能成之事。
文章1443 瀏覽13811687

基于Win64系統的進程內存取證分析技術

計算機技術的迅速發展,為違法犯罪分子提供了新的作案平臺和犯罪手段,特別是隨著加密技術和無痕技術的普及,傳統的電子取證手段面臨巨大挑戰,有些如已被刪除、加密或破壞的有價值電子證據獲取起來的難度加大。內存取證技術的發展在一定程度上彌補了傳統的離線取證技術的不足,通過內存鏡像的分析,調閱當前正在內存中運行的進程、所有載入模塊和DLL庫以及運行中的設備驅動程序發現各種潛在問題,如設備驅動中是否附著惡意驅動設置底層鉤子程序、DLL庫是否劫持等。

本文將重點講述內存中運行的進程取證分析技術,通過分析進程結構體以識別各種可能的惡意行為,分析對象包括進程標準句柄以及引用的動態鏈接庫等,以攻擊者的典型攻擊手法為例,分析如何從目標主機的異常行為表現中發現問題,并提取有效證據。

Windows系統進程取證基礎

在Windows系統中,每個進程都用一個EProcess(ExecutiveProcess)結構來表示,它包含進程的可執行文件全路徑、啟動進程的命令行、當前工作目錄、進程堆指針、進程標準句柄以及指向進程相關的其他屬性和數據結構的指針。由于數據結構就是字節序列,序列中有特殊的含義和目的,所以需要調查人員對其進行分析。EProcess結構中最重要的一個成員是指向進程環境塊(PEB)的指針。進程環境塊中包含大量的信息,對取證比較重要的信息有:

(1)BeingDebugged:進程調試標志,判斷當前進程是否處于被調試狀態,一些病毒程序、安全軟件常使用此標志保護自己被反調試。

(2)指向PPEB_LDR_DATA結構(其中存放的是進程的加載器使用的數據)的指針,PPEB_LDR_DATA結構中包含進程中使用的動態鏈接庫的指針。

(3)指向可執行文件鏡像加載基地址(ImageBaseAddress,在PEB偏移0x008處)的指針,通過這個指針可以找到內存中可執行文件的起始位置。

(4)指向包含進程參數結構(ProcessParameters,在PEB偏移0x010處)的指針,該結構包含進程中加載的動態鏈接庫的路徑、可執行文件鏡像的原始路徑以及創建進程時傳遞進來的參數等信息。

通過windbg調試工具,使用dt命令可以查看ProcessParameters結構體

_RTL_PROCESS_PARAMETERS的詳細內容:
dt(_RTL_USER_PROCESS_PARAMETERS)
_RTL_USER_PROCESS_PARAMETERS(1024bytes)
…..
0x20
0x28
0x30
0x38
0x50
0x60
:StandardInput
:StandardOutput
:StandardError
:CurrentDirectory
:DllPath
[pointer64,[void]]//進程標準輸入句柄
[pointer64,[void]]//進程標準輸出句柄
[pointer64,[void]]//進程標準錯誤句柄
[_CURDIR]
//應用程序的當前工作目錄
[_UNICODE_STRING]
:ImagePathName
[_UNICODE_STRING]//進程exe文件在磁盤目錄上的全路徑名(以unicode形式編碼)
0x70
0x80
…..
:CommandLine
:Environment
[_UNICODE_STRING]
[pointer64,[void]]

進程句柄取證分析

通過分析進程標準句柄列表,可以確定進程的輸入輸出值以及報錯信息等。這些信息值在分析取證系統是否遭受遠程攻擊時,具有一定的參考價值。例如,分析系統是否遭受遠程后門shell攻擊等。攻擊者慣用的伎倆,即創建一個shell后門命令,重定向進程句柄至命名管道或網絡套接字,使得攻擊者通過telnet或netcat命令隨時與目標機建立連接。相關代碼如下所示:

_RTL_PROCESS_PARAMETERS的詳細內容:
dt(_RTL_USER_PROCESS_PARAMETERS)
_RTL_USER_PROCESS_PARAMETERS(1024bytes)
…..
0x20
0x28
0x30
0x38
0x50
0x60
:StandardInput
:StandardOutput
:StandardError
:CurrentDirectory
:DllPath
[pointer64,[void]]//進程標準輸入句柄
[pointer64,[void]]//進程標準輸出句柄
[pointer64,[void]]//進程標準錯誤句柄
[_CURDIR]
//應用程序的當前工作目錄
[_UNICODE_STRING]
:ImagePathName
[_UNICODE_STRING]//進程exe文件在磁盤目錄上的全路徑名(以unicode形式編碼)
0x70
0x80
…..
:CommandLine
:Environment
[_UNICODE_STRING]
[pointer64,[void]]

上述程序主要功能是以本地為服務端,創建一個套接字,實時監聽端口31337消息。一旦接到對方的連接請求,會自動調用accept函數接收消息,并返回客戶端套接字mySock;然后啟用標準消息塊_STRANDARD_INFORMATION中的STARTF_USETDHANDLES變量,重定向hStdError,hStdInput和hStdOutput至客戶端套接字mySock上,并創建子進程cmd.exe,設置bInheritHandles變量為TRUE使得子進程可繼承父類句柄。上述步驟完成后,攻擊者通過cmd.exe鍵入的任何命令,都會通過網絡傳輸到受控主機,并自動在受控主機中按照攻擊者意愿執行相關命令,如搜索文件并自動將搜索結果以文本方式回傳等。

在調查分析受控主機時,在查看當前正在運行的進程列表,發現cmd.exe已被啟用時,若取證分析員具有一定的敏銳性,可能會進一步分析cmd.exe的標注輸入句柄,確定進程被啟用的目的,如是否存在后門活動等;不然,可能會因此忽視一個重大的發現。具體的分析步驟如下:

(1)查看目標主機cmd.exe所有進程實例的標準輸入輸出及錯誤信息。

_RTL_PROCESS_PARAMETERS的詳細內容:
dt(_RTL_USER_PROCESS_PARAMETERS)
_RTL_USER_PROCESS_PARAMETERS(1024bytes)
…..
0x20
0x28
0x30
0x38
0x50
0x60
:StandardInput
:StandardOutput
:StandardError
:CurrentDirectory
:DllPath
[pointer64,[void]]//進程標準輸入句柄
[pointer64,[void]]//進程標準輸出句柄
[pointer64,[void]]//進程標準錯誤句柄
[_CURDIR]
//應用程序的當前工作目錄
[_UNICODE_STRING]
:ImagePathName
[_UNICODE_STRING]//進程exe文件在磁盤目錄上的全路徑名(以unicode形式編碼)
0x70
0x80
…..
:CommandLine
:Environment
[_UNICODE_STRING]
[pointer64,[void]]

從上面給出的信息,可以看出cmd.exe有三個實例進程在運行,進程ID為2160的輸入輸出和錯誤句柄消息均相同。初步判斷0x68可能被重定位到一個命名管道或者網絡套接字。

(2)進一步定位進程ID號為2160的進程,以查看句柄值0x68詳請。

$pythonvol.py-fmemory.dmp--profile=Win7SP1x64handles-p2160-tFile
VolatilityFoundationVolatilityFramework2.4
Offset(V)
Pid
Handle
Type
Details
------------------------------------------------
0xfffffa80015c4070
2160
0xcFile
\Device\HarddiskVolume1\Users\Elliot\Desktop
0xfffffa8002842130
0xfffffa80014f3af0
2160
2160
0x54
0x68
File
\Device\Afd\Endpoint
\Device\Afd\Endpoint
File

由上述內容可知,cmd.exe訪問過文件驅動Afd,AFD驅動是Windows一個網絡驅動部件,與SOCKET應用接口對接實現SOCKET調用。顯然cmd.exe是調用了網絡套接字,若發現本地是存在網絡連接,基本可以確定系統已被遠程后門利用。

(3)通過pstree工具查看進程2160對應的父進程ID號以及父進程網絡連接情況。

$pythonvol.py-fmemory.dmp--profile=Win7SP1x64handles-p2160-tFile
VolatilityFoundationVolatilityFramework2.4
Offset(V)
Pid
Handle
Type
Details
------------------------------------------------
0xfffffa80015c4070
2160
0xcFile
\Device\HarddiskVolume1\Users\Elliot\Desktop
0xfffffa8002842130
0xfffffa80014f3af0
2160
2160
0x54
0x68
File
\Device\Afd\Endpoint
\Device\Afd\Endpoint
File

cmd.exe進程ID2160對應的父進程為ID號1400,進程名memen.exe.父進程通過端口31337與遠端地址建立連接。上述例子即通過重定向輸入輸出句柄,利用子進程cmd.exe以執行遠程命令,并將執行結果通過繼承的父類進程句柄回傳給攻擊者。

DLLs隱藏與檢測技術

動態鏈接庫是windows系統中的一個共享函數庫,可被多個程序共同調用,實現代碼重用及程序的模塊化開發。但隨著技術的不斷發展,很多攻擊者開始盯上了DLLs,因為它具備運行的天然條件,可以寄宿到目標進程中,并借助目標進程的運行而加載運行。攻擊者可以構造惡意的DLLs文件,然后通過各種手段實現DLLs注入,如利用CreateRemoteThread遠程建立線程的方式注入DLL、利用HooKs技術注入、利用ring0APC注入DLL等。在DLLs注入盛行的時間里,各種安全檢測工具開始利用DLLs雙向鏈表式存儲特點遍歷進程的所有動態鏈接庫,以識別惡意偽造的DLLs.后期又開始使用斷鏈技術,將三個鏈表指

針全部斷開,以隱藏DLLs.前面基礎知識小節,簡單描述了PEB結構體中的ldr指針結構體PPEB_LDR_DATA,它包含進程中使用的動態鏈接庫的指針,基地址位于TEB偏移0x30處。PPEB_LDR_DATA結構體成員信息,通過dt命令查看顯示如下:

$pythonvol.py-fmemory.dmp--profile=Win7SP1x64handles-p2160-tFile
VolatilityFoundationVolatilityFramework2.4
Offset(V)
Pid
Handle
Type
Details
------------------------------------------------
0xfffffa80015c4070
2160
0xcFile
\Device\HarddiskVolume1\Users\Elliot\Desktop
0xfffffa8002842130
0xfffffa80014f3af0
2160
2160
0x54
0x68
File
\Device\Afd\Endpoint
\Device\Afd\Endpoint
File

該結構的后三個成員是指向LDR_MODULE鏈表結構中相應三條雙向鏈表頭的指針,分別是按照加載順序、在內存中地址順序和初始化順序排列的模塊信息結構的指針。圖標結構如圖1所示。

圖1

由上圖可知,通過上述三個指針可以依次遍歷到指定進程加載的所有DLLs,同樣為了隱藏某個DLL文件,可以斷開其中的一個鏈。為了達到完全隱藏的效果,甚至可采用三個鏈指針全部斷開的方式。

下面將重點介紹隱藏DLLs的檢測技術。利用虛擬地址描述符VAD遍歷所有DLLs文件。VAD是一棵平衡二叉搜索樹,用于管理進程的虛擬內存,其中也包含著一個進程的dll模塊信息。對于每個進程而言,_EPROCESS.VadRoot指向VAD樹的根節點。通過windbg的dt命令可選擇一個進程查看對應的VAD結構體:

$pythonvol.py-fmemory.dmp--profile=Win7SP1x64handles-p2160-tFile
VolatilityFoundationVolatilityFramework2.4
Offset(V)
Pid
Handle
Type
Details
------------------------------------------------
0xfffffa80015c4070
2160
0xcFile
\Device\HarddiskVolume1\Users\Elliot\Desktop
0xfffffa8002842130
0xfffffa80014f3af0
2160
2160
0x54
0x68
File
\Device\Afd\Endpoint
\Device\Afd\Endpoint
File

其中,0x00c,0c010分別代表該vad節點的左右孩子節點,而0x018則代表其控制區。

$pythonvol.py-fmemory.dmp--profile=Win7SP1x64handles-p2160-tFile
VolatilityFoundationVolatilityFramework2.4
Offset(V)
Pid
Handle
Type
Details
------------------------------------------------
0xfffffa80015c4070
2160
0xcFile
\Device\HarddiskVolume1\Users\Elliot\Desktop
0xfffffa8002842130
0xfffffa80014f3af0
2160
2160
0x54
0x68
File
\Device\Afd\Endpoint
\Device\Afd\Endpoint
File

結合上述分析,利用平衡二叉樹的遍歷算法以及DLL文件的偏移量,可搜索遍歷進程加載的所有DLLs文件,具體方法可先通過PsLookupProcessByProcessId函數定位到EPROCESS結構體基地址,然后再偏移0x11c找到VadRoot,再逐個根據地址偏移值定位即可。實現代碼就不再給出。除了上述方法外,還可以利用PE文件掃描技術,暴力搜索進程內存空間,尋找“MZ”簽名的所有PE文件實例。

小結

本文主要描述基于PEB結構體的內存分析取證技術,通過描述進程標準句柄輸入輸出的重定向及DLLs隱藏技術,擬分析如何結合PEB結構體的內存存儲方式,提取上述兩種行為留下的痕跡。

(完)

浙江二十选五带坐标走势图