首頁  >  文章  >  運維  >  Mitre ATT&CK矩陣中的三種流程注入手法

Mitre ATT&CK矩陣中的三種流程注入手法

王林
王林轉載
2019-11-26 10:02:213157瀏覽

Mitre ATT&CK矩陣中的三種流程注入手法

Mitre ATT&CK矩陣中的三種進程注入手法:經典的進程注入、Process HollowingProcess Doppelgänging

惡意軟體使用進程注入的主要目的大致是為了躲避殺軟的偵測或進行提權操作。這裡我們將主要針對第一種情況下的3種手段進行詳細的討論。

一:經典的進程注入(DLL注入)

這是最為經典的手段,流程也十分簡潔明了即:

OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread

Mitre ATT&CK矩陣中的三種流程注入手法

##二:Process Hollowing

這就是一種相當古老的手段了,中文一般譯為”創建傀儡進程”,使用該手法創建的進程可以偽裝為任意的合法進程,比如偽裝為IE,在內存中使用process hacker查看時其圖標資源、描述、數位簽章均為IE的值。這樣緊急應變人員在進行排查的時候可能難以發現。

用簡潔的語言概括該手法,即惡意進程首先創建一個掛起狀態的進程,然後取消其原先的記憶體映射並替換成事先準備的惡意程式碼,在對修改後的映像檔進行重定向後再恢復該行程的運作狀態。

實現想法:

1、透過CreateProcess建立目標進程,傳入參數CREATE_SUSPENDED使進程掛起

1 (2).jpg

2、透過NtQueryProcessInformation取得目標進程記憶體中映像檔的基底位址。 (PEB區塊資料結構)

Mitre ATT&CK矩陣中的三種流程注入手法

3、透過NtUnmapViewOfSection清空目標進程的記憶體資料(section),傳入參數為進程句柄和映像檔的基底位址


Mitre ATT&CK矩陣中的三種流程注入手法

4、透過VirtualAllocEx申請新的記憶體(起始位址為先前映像檔的基底位址,大小則為payload的大小)

5、透過WriteProcessMemory寫入記憶體payload

6、將寫入記憶體中的payload進行基址重新導向

7、透過GetThreadContext取得目標執行緒的上下文,將上下文的eax暫存器修改為正確的程式碼入口點

8、透過SetThreadContext設定入口點

9、透過ResumeThread喚醒進程,執行payload

對抗想法:

#從實現思路中可以看出,步驟1、4、5、6、7、8、9是常規的創建一個過程然後自己注入的手段。只有步驟2、3是比較特殊的。用常規的檢測手段如Hook關鍵函數進行判斷即可檢測。

三:Process Doppelgänging

這是一種比較新的注入手段,首次提出於2017年的歐洲black hat大會。此手段在原理及表現上與Process Hollowing是類似的,利用Process Doppelgänging創建的進程在內存中使用process hacker查看時其圖標資源、描述、數字簽名均為指定的目標程序。

該手法利用了windows事務(TxF)的特性,在事務中使用惡意文件覆蓋合法文件,此時不提交事務(即覆蓋不會在磁碟上發生),然後創建一個section(當前事務的拷貝)。在取得了section的句柄後,就將事務回滾,防止惡意檔案在磁碟上真正地覆寫合法檔案。之後就使用記憶體中section的句柄進行進程建立操作。而創建的進程是擁有合法可執行檔的資訊的。

可以看到,由於需要在事務中覆寫文件,所以該手法需要對目標文件有寫入權限。

實作想法:

1、建立一個TxF交易物件(NtCreateTransaction)

Mitre ATT&CK矩陣中的三種流程注入手法

2、以交易API開啟合法執行檔,即在事務物件中加入檔案(CreateFileTransacted)

Mitre ATT&CK矩陣中的三種流程注入手法

3、開啟惡意檔案並為其分配記憶體空間(CreateFile、GetFileSizeEx -> NtAllocateVirtualMemory -> ReadFile)

4、用記憶體中的惡意檔案覆寫事務中的合法執行檔(WriteFile)

Mitre ATT&CK矩陣中的三種流程注入手法

5、建立目前交易的section(NtCreateSection)

Mitre ATT&CK矩陣中的三種流程注入手法

6、回滾事務,使剛剛的覆寫恢復成合法執行檔(NtRollbackTransaction)

Mitre ATT&CK矩陣中的三種流程注入手法

7、使用記憶體中的section來建立進程物件(NtCreateProcessEx )

Mitre ATT&CK矩陣中的三種流程注入手法

8、取得惡意檔案的入口點,建立進程參數區塊,然後將進程區塊寫入進程記憶體中(NtQueryInformationProcess -> RtlInitUnicodeString -> RtlCreateProcessParametersEx)

9、更新PEB中的進程參數區塊,為目標進程物件建立線程,執行惡意程式碼(NtCreateThreadEx)

對抗思路:

從步驟上看,Hook關鍵函數(如NtCreateThreadEx)進行判斷即可偵測該手法。

總結

從上述3種手法的演進可以看到幾點趨勢。

第一點,記憶體中的隱藏能力越來越強,由最開始的毫無隱蔽性可言,到現在可以做到在記憶體中表現得與合法程序一致。

第二點,payload釋放到記憶體中的手段越來越難以檢測,最初payload是直接拷貝到記憶體中的,現在攻擊者可以利用一些特性(如TxF)來進一步隱藏釋放過程。

第三點,最終階段的關鍵函數幾乎沒有變化,即使payload的釋放越來越隱蔽,但是最終還是要釋放到記憶體中並且呼叫執行的。透過對有限的關鍵函數進行Hook,應該就能dump出最終的payload。

更多相關教學推薦:web伺服器安全性

#

以上是Mitre ATT&CK矩陣中的三種流程注入手法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:freebuf.com。如有侵權,請聯絡admin@php.cn刪除