KimsukyAPT介紹

近期,我們注意到了全球範圍內國家層次的網絡攻擊活動頻率有着大幅度增加。其中, APT34 Gamaredon Transparent Tribe 是我們在最新的幾個攻擊活動中發現的樣本。而在這篇文章中,我們將深入分析近期一個活動比較頻繁的朝鮮APT組織,該組織名爲Kimsuky,我們將對其所使用的攻擊技術以及樣本進行深入分析。

技術分析

跟其他的APT組織不同,Kimsuky所使用的攻擊鏈/感染鏈並不長,而且它在實現低檢測率方面效率非常好。

KimsukyAPT的感染開始於一個典型的可執行文件,文件後綴名爲“scr”,而這種後綴名是Windows系統用來識別屏幕保護程序組件所使用的。下面給出的是相關樣本的一些信息:

執行之後,惡意軟件會利用微軟實用程序“regsv***.exe”來在目標設備中的“%AppData%\Local\Temp”路徑下寫入一個名爲“<random_name>.tmp.db”的文件。

暫且先不管這個“.db”後綴,惡意軟件所寫入的這個文件其實是一種特殊構造的DLL文件,它可以作爲惡意軟件感染的第二階段Payload。關於該DLL文件的靜態信息如下:

接下來,這個DLL將會被拷貝到“%AppData%\Roaming\Microsoft\Windows\Defender\”目錄中,並重命名爲“AutoUpdate.dll”。

惡意軟件會通過設置“HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce\WindowsDefender”這個註冊表鍵來實現“AutoUpdate.dll”庫的持久化感染。在這裏,攻擊者所使用的文件名稱以及路徑非常狡猾,因爲它們所指向的都是Windows Defender:

除此之外,通過分析“%AppData%\Local\Temp”路徑下的文件內容,我們還發現了惡意軟件所創建的另一個臨時文件-“<random_name>.tmp.bat”,這個文件被創建完成之後會立即被刪除。通過分析該文件的內容,我們發現它的功能是用來刪除初始感染Payload(scr文件)和其自身的。

爲了隱藏其惡意操作,並避免引起不必要的懷疑,惡意軟件還會在同一目錄下創建一個包含“.scr”文件的合法文檔,文檔名爲“이력서 양식.hwp”,翻譯過來的話意思大概是“簡歷表”。關於該文檔的相關信息如下:

打開該文件後,我們會發現它貌似真的是一份簡歷表(空的):

繞過反病毒檢測

有意思的是,爲了避免被反病毒產品檢測到,“AutoUpdate.dll”還會對“explorer.exe”進程執行注入操作。通過分析其惡意代碼,我們識別出了執行該操作的方法代碼。首先,惡意軟件會設置其正確的權限,如下圖所示:

一旦獲取到了必要的權限,惡意軟件就可以繼續完成注入了。正如Elastic所發佈的分析描述,惡意軟件可以通過“VirtualAllocEx”函數將其惡意DLL的路徑寫入另一進程的虛擬地址空間。在本文所分析的樣本中,惡意軟件的注入目標爲“explorer.exe”進程,它可以通過在其中創建遠程線程來確保遠程進程成功加載惡意代碼。

爲了成功執行這些操作,惡意軟件首先需要知道目標進程的進程ID,這一步可以通過遍歷進程樹來實現,即通過CreateToolhelp32Snapshot()、Process32First()和Process32Next()這幾種Windows API來實現。接下來,惡意軟件將會調用VirtualAllocEx()函數來分配一個空間並將惡意DLL的路徑寫入進去,完成後它將會調用WriteProcessMemory()函數來將惡意DLL的路徑地址寫入到分配的內存中。

最後,惡意軟件將調用CreateRemoteThread() API來將新創建的線程鏈接到主機進程(explorer.exe)。所述邏輯的部分如下圖所示:

在注入過程中,惡意軟件會向“explorer.exe”進程中植入兩個組件,下面顯示的是我們從中提取出的兩個DLL文件信息:

通過對比兩個DLL文件的Ssdeep數據,我們會發現這兩個庫有一些重複的地方,而且它們兩個之間存在高度相似的情況。下面顯示的是哈希的不同部分:

3072:AFSYAyju5JpkC7xfYZo9cPqvTV+ql4yFa+z * +K+H/kocFAnRG5R:AFJ0qC7xAZliT004+p * 0fkoe * RG5

沒錯,在執行了簡單的二進制差異分析之後,我們會發現這兩個DLL之間僅存在非常細微的差別。

考慮到這兩個DLL之間的差異,我們決定繼續對其中一個DLL進行分析。深入到DLL中,我們注意到每當惡意軟件必須執行某個函數時,它都依賴於一個遞歸的解密程序,而這個解密程序將負責對包含了實際指令的字符串進行解密,並執行其中包含的命令。下面給出的是解密程序的樣本:

我們發現,每隔15分鐘,惡意軟件都會跟其C2服務器(suzuki.]datastore.]pe.]hu)進行一次通信,並將受感染主機的相關信息發送至服務器端。在這裏,惡意軟件所發送的三個HTTP請求使用的都是不同的URL路徑以及User-Agent。具體如下圖所示:

入侵威脅指標IoC

哈希:

757dfeacabf4c2f771147159d26117818354af14050e6ba42cc00f4a3d58e51f
caa24c46089c8953b2a5465457a6c202ecfa83abbce7a9d3299ade52ec8382c2
bbad65136d73cbd5262bc88571677b5434ceb54fc1103f2133757dae2ec4b47b
817ef0d9d3584977d1114b7e92012b653d339434a90967cbe8016899801f3751

C2:

suzuki.]datastore.]pe.]hu

持久化感染:

HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce\WindowsDefender

Yara規則

import "pe"
rule loader {
    meta:
      description = "Yara rule for the initial loader SRC"
      author = "Yoroi - ZLab"
      last_updated = "2020-03-02"
      tlp = "white"
      category = "informational"
    
strings:
      	$a1 = " goto Repeat1"
		$a2 = {84 58 43 F4 39 1B 96 32 E4 2D 63}
		$a3 = {89 04 4D 30 7A 05 10 41 EB E8 8B}
		$a4 = {80 A1 B2 F7 15 DE F0 7E 35 75}
		$a5 = {9C 0E 57 4C 77 B1 0E 06 08 5E}

	  
    condition:
      uint16(0) == 0x5A4D and pe.number_of_sections == 5 and 3 of ($a*) 
}

import "pe"
rule AutoUpdate_dll {
    meta:
      description = "Yara rule for the AutoUpdate_dll"
      author = "Yoroi - ZLab"
      last_updated = "2020-03-02"
      tlp = "white"
      category = "informational"
    
strings:
      	$a1 = {48 8B 3F 48 83 78 18 10 72}
		$a2 = {36 42 35 45 35 41 42 33 42 41 39}
		$a3 = { DD E7 FE DA C6 F7 F9 8D 7D F9 }
		$a4 = "1#SNAN"
		$a5 = "d$4D9L$t"
		$a6 = "DllRegisterServer"
		$a7 = "DllUnregisterServer"
	  
    condition:
      uint16(0) == 0x5A4D and pe.number_of_sections == 6 and (4 of ($a*)) 
}

import "pe"
rule injectedDLL {
    meta:
      description = "Yara rule for the injected DLL"
      author = "Yoroi - ZLab"
      last_updated = "2020-03-02"
      tlp = "white"
      category = "informational"
    
strings:
      	$a1 = {41 80 3E 5E 89 45 A4 75 08 49}
		$a2 = {60 03 50 02 30 58 68 01 00 70}
		$a3 = {98 F7 02 00 7B 44 00 00 91 44}
		$a4 = "/?m=b&p1="
		$a5 = "&p2=b"
		$a6 = "/?m=a&p1="
		$a7 = "AUAVAWH"
	  
    condition:
      uint16(0) == 0x5A4D and pe.number_of_sections == 6 and (4 of ($a*)) 
}

rule legit_DOC {
    meta:
      description = "Yara rule for the Legit DOC"
      author = "Yoroi - ZLab"
      last_updated = "2020-03-02"
      tlp = "white"
      category = "informational"
    
strings:
      	$a1 = "HWP Document File"
		$a2 = "UPcfZrc"
		$a3 = {D1 A9 30 1A 5D C1 16 41 15 DA DF 54}
		$a4 = {B4 D5 31 1B F9 66 7C 56 5A 15}
		$a5 = {30 30 F8 18 18 F8 00 00 E0 00 00 C8}
		$a6 = {DC 66 43 0C 53 00 65 00 63 00}
		$a7 = {05 00 48 00 77 00 70 00 53 00 75 00 6D 00 6D}
	  
    condition:
      all of them 
}

* 參考來源: yoroi ,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM

相關文章