Check Point安全研究人員針對UPAS Kit與Kronos銀行木馬的分析(二)
在上一篇文章中,我介紹了Kronos和UPAS Ki之間的一些區別。今天,我再來介紹剩餘的其他區別,比如惡意有效載荷的注入,Rootkit功能,C2通信過程。
惡意有效載荷的注入
同樣,在注入之後執行的惡意有效載荷將根據底層系統架構而有所不同。對於32位進程,注入的有效載荷將執行以下操作:
1.根據傳遞給有效載荷的config_struct來分配全局變數;
2.載入dll的原始映像;
3.使用注入過程設置的互斥對象名稱創建互斥對象;
4.檢查是否有卸載標誌,如果沒有,則分為以下兩種情況:
4.1 創建一個線程將自己注入所有其他進程中,並將hook函數設置為在注入時應執行的函數;
4.2 創建一個線程,負責通過USB渠道傳播惡意軟體;
4.3 進入與C2伺服器通信的無限循環過程;
64位進程的有效載荷的過程與32位進程的有效載荷非常類似,區別就在於,它不檢查卸載標誌,這意味受害者無法執行惡意軟體的卸載。另外,64位進程的有效載荷也不會將其注入到其他進程中,使rootkit失效,兩個有效載荷的比較可以在下圖中看得清清楚楚:
注入到explorer.exeiexplore.exe後,UPAS Kit所調用的函數
由於接下來,研究人員將重點討論UPAS Kit的hook機制和C2通信過程,因此我們只會在這裡看到通過USB渠道所進行的傳播過程。其具體過程就是先通過註冊一個新的窗口類(使用前面描述的互斥對象的名稱),然後輸入一個無限循環的消息。
註冊的USB擴展線程的窗口類
每個截獲的消息將由一個專門的函數處理,該函數將檢查截獲的消息是否表示的是插入的USB傳播渠道,如果是,則會啟動傳播操作並將其報告給C2伺服器。
處理USB傳播窗口類的程序
傳播過程啟動後,通過將惡意軟體文件複製到USB驅動器並使用字元串「[autorun]
open=_a.exe
」生成新的autorun.inf文件。然後,惡意擴展模塊將會開始查找任何.lnk文件,並將用以下路徑替換它們的路徑:
『/C start 」」 」\」 && start 」」 」_l.exe」『.
這將導致原始文件和惡意軟體文件同時被執行,原因是它們的快捷執行方式都是一樣的。路徑替換是使用IShellLinkW COM類完成的,如下所示。
替換.lnk文件中的路徑
Rootkit功能的實現
Rootkit是一種特殊的惡意軟體,它的功能是在安裝目標上隱藏自身及指定的文件、進程和網路鏈接等信息,比較多見的是Rootkit一般都和木馬、後門等其他惡意程序結合使用。
UPASKit使用了一個非常直接的inline hook機制(內存注入的一種),inline hook的核心思想是:通過替換目標函數頭部指令實現在函數執行之前跳轉到其他的指令區域,執行完畢跳轉回到原來的函數,跳轉到的指令區域通常是我們自己編寫的函數,inline hook技術對於編寫外掛和外掛式補丁意義重大。具體工作流程如下:
1.檢查目標函數是否已進行了hook,通過將目標函數的第一個位元組與0xE9(即jmp指令)進行比較;
2.如果沒有進行hook,則inline hook就開始分解函數的第一個位元組,一般情況下至少會有5個位元組被如此處理。為此,inline hook會使用一個簡單的反彙編引擎(disassembly engine),該引擎僅計算每條指令的反彙編位元組數,這些位元組被稱為被盜位元組(stolen bytes)。
3.inline hook技術會準備一個具有21個NOP位元組(0x90)的緩衝區,然後將偷來的位元組注入該緩衝區。此外,inline hook技術還會修改NOP位元組的最後5個位元組,並跳轉到被盜位元組的地址。最後,inline hook技術還會將緩衝區的保護設置為用於原始位元組(即應該是可執行的)的保護。
4.將原始函數的被竊位元組部分設置為0,並將前該函數的前5個位元組替換為跳轉過來的hook函數。
以下就是進行了hook的ntdll.dll函數,目的是隱藏惡意軟體的構件,從而使其隱蔽工作:
1.NtResumeThread:將攔截的二進位注入到惡意軟體新創建的進程中;
2.NtQuerySystemInformation:檢查請求的信息類是否是SystemProcessInformation,如果是,則將請求的PID與列入白名單的explorer.exe PID進行比較。如果內容匹配,它將把SYSTEM_PROCESS_INFORMATION條目(與rogue explorer.exe之前的進程對應)設置成指向explorer.exe的後續進程。
3.NtQueryDirectoryFile:隱藏惡意軟體副本所在的目錄;
4.NtEnumerateValueKey:隱藏與惡意軟體相對應的註冊表運行項;
5.NtDeleteValueKey:同NtEnumerateValueKey;
6.NtSetValueKey:如果請求項是惡意軟體的運行項,則會停止該操作;
7.NtSetInformationFile:檢查文件信息類是否與以下之一函數進行對應:FileDispositionInformation,FileRenameInformation,FileEndOfFileInformation或FileAllocationInformation。如果對應,請將文件名稱與白名單中的惡意軟體的副本二進位文件進行比較,如果匹配則避免該操作。
8.NtOpenProcess:如果請求的PID是惡意explorer.exe進程的PID,則避免該操作。
9.NtWriteFile:如果目標文件是惡意軟體的二進位文件,則避免該操作。
值得注意的是,與UPAS KIT不同,Kronos使用的hook方法則截然不同。雖然兩者都進行了inline hook,但Kronos的使用顯然更穩定和更安全。不過inline hook會引發了一個並發問題,即在所有被盜的位元組被覆蓋之前發生的上下文切換可能會導致系統崩潰,原因就是彼此的代碼不一致。因此,Kronos的hook方法是使用"lock cmpxch8b"指令對序言位元組進行原子寫入(atomic write),許多並發演算法中都顯示了原子的讀-修改-寫組合。從這個意義上說,UPAS kit的hook引擎就要簡單得多,它使用的是WriteProcessMemory函數執行不安全的寫入操作。
但即便如此,研究人員還是能夠發現其中的相似性,這就是使用的hook函數是一樣的。上述8個hook函數在Kronos中也出現過,並且作用也完全相同。這表明,這些二進位文件中的部分rootkit組件可能被重複使用了。
C&C伺服器通信
與C&C伺服器的交互,是使用HTTP協議完成的。大部分通信是在惡意軟體執行所有其他操作(即注入,hook和USB傳播)之後完成的。在這個通信序列中,惡意軟體會無限循環地將信號發送到伺服器,並使用以下信息更新它:
1.系統架構;
2.指示%TEMP%目錄中的惡意軟體副本是否仍然存在的標誌;
3.操作系統版本;
4.惡意操作版本(本文是1.0.0.0);
不過,伺服器會響應「卸載」和「下載」兩個命令,其中, 「下載」還包含兩個子命令:「更新」和「執行」。在一個響應中可以同時發送多個命令,由「|」字元分隔,命令序列將在第一次出現「!」字元後開始,其中,每個命令的參數由空格分隔。
另一個可能發送到C2伺服器的消息是USB傳播內容的更新,一旦將自動運行文件和惡意軟體二進位文件複製到USB上,C2伺服器就會接收到更新的內容。
實質上,這是UPASKit的核心內容所在,即充當其他模塊的秘密下載和傳播程序。2012年傳播的UPAS Kit的部分模塊是可以在exploit.in論壇的以下主題中找到的。
雖然目前,研究人員還沒有調查其他模塊,但從他們的描述中可以看出,它們與ZeuS及其一些變體使用的模塊類似。
IOCs
所用的UPAS Kit樣本:1e87d2cbc136d9695b59e67f37035a45a9ad30f5fccc216387a03c0a62afa9d4
※被植入惡意代碼的Emotet Downloader細節分析
※盤點迄今為止Mirai的7大變種
TAG:嘶吼RoarTalk |