Mitre ATT&CK矩陣中的三種進程注入手法:經典的進程注入、Process Hollowing
和Process Doppelgänging
。
惡意軟體使用進程注入的主要目的大致是為了躲避殺軟的偵測或進行提權操作。這裡我們將主要針對第一種情況下的3種手段進行詳細的討論。
一:經典的進程注入(DLL注入)
這是最為經典的手段,流程也十分簡潔明了即:
OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
##二:Process Hollowing
這就是一種相當古老的手段了,中文一般譯為”創建傀儡進程”,使用該手法創建的進程可以偽裝為任意的合法進程,比如偽裝為IE,在內存中使用process hacker查看時其圖標資源、描述、數位簽章均為IE的值。這樣緊急應變人員在進行排查的時候可能難以發現。 用簡潔的語言概括該手法,即惡意進程首先創建一個掛起狀態的進程,然後取消其原先的記憶體映射並替換成事先準備的惡意程式碼,在對修改後的映像檔進行重定向後再恢復該行程的運作狀態。 實現想法:1、透過CreateProcess建立目標進程,傳入參數CREATE_SUSPENDED使進程掛起 2、透過NtQueryProcessInformation取得目標進程記憶體中映像檔的基底位址。 (PEB區塊資料結構) 3、透過NtUnmapViewOfSection清空目標進程的記憶體資料(section),傳入參數為進程句柄和映像檔的基底位址
三:Process Doppelgänging
這是一種比較新的注入手段,首次提出於2017年的歐洲black hat大會。此手段在原理及表現上與Process Hollowing是類似的,利用Process Doppelgänging創建的進程在內存中使用process hacker查看時其圖標資源、描述、數字簽名均為指定的目標程序。 該手法利用了windows事務(TxF)的特性,在事務中使用惡意文件覆蓋合法文件,此時不提交事務(即覆蓋不會在磁碟上發生),然後創建一個section(當前事務的拷貝)。在取得了section的句柄後,就將事務回滾,防止惡意檔案在磁碟上真正地覆寫合法檔案。之後就使用記憶體中section的句柄進行進程建立操作。而創建的進程是擁有合法可執行檔的資訊的。 可以看到,由於需要在事務中覆寫文件,所以該手法需要對目標文件有寫入權限。 實作想法:1、建立一個TxF交易物件(NtCreateTransaction) 2、以交易API開啟合法執行檔,即在事務物件中加入檔案(CreateFileTransacted) 3、開啟惡意檔案並為其分配記憶體空間(CreateFile、GetFileSizeEx -> NtAllocateVirtualMemory -> ReadFile) 4、用記憶體中的惡意檔案覆寫事務中的合法執行檔(WriteFile) 5、建立目前交易的section(NtCreateSection)6、回滾事務,使剛剛的覆寫恢復成合法執行檔(NtRollbackTransaction)
7、使用記憶體中的section來建立進程物件(NtCreateProcessEx )
8、取得惡意檔案的入口點,建立進程參數區塊,然後將進程區塊寫入進程記憶體中(NtQueryInformationProcess -> RtlInitUnicodeString -> RtlCreateProcessParametersEx)
9、更新PEB中的進程參數區塊,為目標進程物件建立線程,執行惡意程式碼(NtCreateThreadEx)
對抗思路:
從步驟上看,Hook關鍵函數(如NtCreateThreadEx)進行判斷即可偵測該手法。
總結
從上述3種手法的演進可以看到幾點趨勢。
第一點,記憶體中的隱藏能力越來越強,由最開始的毫無隱蔽性可言,到現在可以做到在記憶體中表現得與合法程序一致。
第二點,payload釋放到記憶體中的手段越來越難以檢測,最初payload是直接拷貝到記憶體中的,現在攻擊者可以利用一些特性(如TxF)來進一步隱藏釋放過程。
第三點,最終階段的關鍵函數幾乎沒有變化,即使payload的釋放越來越隱蔽,但是最終還是要釋放到記憶體中並且呼叫執行的。透過對有限的關鍵函數進行Hook,應該就能dump出最終的payload。
更多相關教學推薦:web伺服器安全性
#以上是Mitre ATT&CK矩陣中的三種流程注入手法的詳細內容。更多資訊請關注PHP中文網其他相關文章!