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),傳入參數為進程句柄和映像文件的基地址
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)
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服務器安全