Early Bird代碼注入可繞過殺毒軟體檢測
代碼注入惡意軟體是避免被檢測到的一種常用技術,是向合法進程中注入代碼。這樣,合法的進程就會成為惡意代碼的偽裝,反惡意軟體產品看到運行的是一個合法的進程,這樣就可以達到混淆惡意代碼的目的。
研究人員對一種新的代碼注入技術進行了研究,它允許惡意代碼中進程的主線程入口點之前就運行,所以如果安全產品的hook放在主函數線程執行復原前,這種注入就可以繞過安全產品的檢測。但是在線程代碼執行前,非同步過程調用會首先執行。
研究人員在不同的惡意軟體中都發現了這種注入技術的蹤跡,包括APT 33的後門TurnedUp。
惡意代碼注入工作流如下:
·創建一個處於suspend狀態的(合法Windows)進程;
·向該進程中分配和寫入惡意代碼;
·給該進程安排一個非同步過程調用的排隊;
·繼續進程的主線程來執行非同步過程調用。
Hooks是進程開始執行後合法的反惡意軟體產品插入的代碼塊,位於特定的Windows API調用。Hooks的目標是監控API調用的參數來找出惡意調用和調用模式。
下面講述一下非同步過程調用在暫停進程恢復的過程中的執行流程。
代碼注入技術如圖:
Early bird代碼注入技術分析
在分析樣本時,研究人員發現一個惡意軟體樣本(SHA256:9173b5a1c2ca928dfa821fb1502470c7f13b66ac2a1638361fda141b4547b792)
該.net樣本首先逆混淆自己,然後執行process hollowing然後用本地Windows圖片來過濾hollowed process。本地的Windows圖片就會注入到explorer.exe進程中。explorer.exe中的payload會創建一個suspended狀態的進程svchost.exe,然後注入。該樣本含有三種不同的注入方法。svchost.exe 中的payload的SHA256值是c54b92a86c9051172954fd64573dd1b9a5e950d3ebc581d02c8213c01bd6bf14。截止2018年3月20日,只有29家安全廠商的反惡意軟體對該payload進行了簽名。
因為process hollowing和explorer.exe注入沒有什麼價值,所以研究人員重點關注第三個技術。我們看一下在注入到svchost.exe之前都調試器內都發生了什麼。
圖1 創建的suspended狀態的svchost.exe進程
惡意軟體創建了一個suspended狀態的svchost.exe進程,常見的合法Windows進程是惡意軟體的最愛,svchost.exe是提供服務的Windows進程。
在創建了該進程後,惡意軟體會向其分配內存然後在分配的內存區域中寫入代碼。為了執行注入的代碼,需要在svchost.exe的主線程中調用NtQueueApcThread來進行非同步過程調用的排隊。然後調用NtResumeThread來減少線程的suspend數量到0。然後svchost.exe的主線程會恢復執行,如果線程處於緊急狀態,那麼APC就會首先執行。
圖2 在svchost.exe的主線程中加入APC排隊並恢複線程執行
當排隊的APC到線程後,線程首先要執行狀態為緊急的APC來執行。
如果進程是在suspended狀態創建的,而進程並沒有開始執行怎麼辦?惡意軟體如何知道線程在哪個點上緊急狀態呢?這種方法只應用於svchost.exe還是在所有suspended狀態下創建的進程都是使用的?
為了回答這幾個問題,研究人員對惡意軟體進行了修補,這樣惡意軟體就可以注入到研究人員選擇的其他進程了,然後進行觀察。
在NtQueueApcThread的調用中設置斷點,可以看到svchost.exe的APC地址為0x00062f5b。在調試器中將斷點地址設為0x00062f5b,下面是在0x000625fb處的svchost.exe進程:
圖3 svchost.exe中APC開始執行點
下面看一下線程恢復執行後的調用棧,斷點在0x00062f5b :
圖4 svchost.exe的調用棧
首先要說明每個用戶模式的線程都是以LdrInitializeThunk函數開始執行的。在調用棧的底部可以看到LdrpInitialize被調用了,LdrInitialize是通過LdrInitializeThunk調用的(圖5)。研究人員追蹤了LdrpInitialize,發現跳轉到了函數_LdrpInitialize (圖6)。在_LdrpInitialize內部,可以看到對NtTestAlert函數的調用 (圖7),該函數是負責檢查當前線程有沒有非同步過程調用排隊,如果有,就通知內核。在返回用戶模式前,內核會讓用戶模式進程跳轉到KiUserApcDispatcher,在本例中KiUserApcDispatcher會執行惡意代碼。
圖5 0x76e539c1 LdrpInitialize調用後的地址
圖6 LdrpInitialize內部有到_LdrpInitialize的跳轉
圖7 _LdrpInitialize內部有對NtTestAlert的調用
有證據顯示非同步過程調用是KiUserApcDispatcher執行的(圖8),再看一次調用棧,我們發現0x00062f5b的返回地址是0x76e36f9d,剛好是KiUserApcDispatcher的調用。
圖8 KiUserApcDispatcher執行非同步過程調用
總結一下,導致非同步過程調用執行的執行流為:
LdrInitializeThunk LdrpInitialize _LdrpInitialize NtTestAlert KiUserApcDispatcher
非常重要的一點就是該注入方法是在線程初始化的早期階段載入惡意代碼,載入惡意代碼在安全產品放置hook之前,所以惡意軟體可以繞過安全產品的檢測。
研究人員還發現使用這種技術的其他樣本 (SHA 256):
·165c6f0b229ef3c752bb727b4ea99d2b1f8074bbb45125fbd7d887cba44e5fa8
·368b09f790860e6bb475b684258ef215193e6f4e91326d73fd3ab3f240aedddb
·d17dce48fbe81eddf296466c7c5bb9e22c39183ee9828c1777015c1652919c30
·5e4a563df904b1981d610e772effcb005a2fd9f40e569b65314cef37ba0cf0c7
最後的這兩個樣本數最近發現的,是伊朗黑客組織APT33寫的後門軟體「TurnedUp」。圖9是最後一個樣本的截圖,該樣本展示了向rundll32.exe注入的過程中使用了本技術,rundll32.exe是一個合法的Windows進程,用來從dll文件運行輸出函數。
圖9 創建的suspended狀態的rundll32.exe進程,然後使用QueueUserApc注入
在本樣本中,非同步調用過程是用來維持系統的駐留。圖10中可以看到rundll32.exe中非同步過程調用的開始(0x90000)。進一步分析就會發現,惡意軟體會向Windows註冊表中寫入一個key來確保駐留(圖11),cmd命令為:
「/c REG ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v RESTART_STICKY_NOTESS /f /t REG_SZ /d 」C:\Users\ADMINI~1\AppData\Local\Temp\StikyNote.exe」「
ShellExecuteA如果位於APC調用之後,Early Bird調用和參數會在hook前躲過檢測。
圖10 rundll32.exe處非同步過程調用開始執行
圖11 調用ShellExecuteA


※My name is DEF CON CHINA,I am coming!
※累覺不愛 Mac App Store 上竟然也有偷偷奴役你電腦挖礦的應用
TAG:嘶吼RoarTalk |