0x00 前言
今年年初,卡巴斯基實(shí)驗(yàn)室在安全掃描過程中,檢測(cè)到了幾個(gè)影響了自家內(nèi)部系統(tǒng)的網(wǎng)絡(luò)入侵行為。
接著我們大范圍調(diào)查了這些入侵事件。我們分析發(fā)現(xiàn)了一個(gè)全新的木馬平臺(tái),這個(gè)平臺(tái)出自Duqu APT小組之手。Duqu APT小組是世界上最神秘,水平最高的APT小組。這個(gè)小組從2012年開始銷聲匿跡,直到今天又卷土重來。我們分析了這新一輪攻擊,結(jié)果表明這是2011年Duqu木馬的升級(jí)版,懷疑與Stuxnet木馬有關(guān)。我們把這個(gè)新木馬和相關(guān)的平臺(tái)命名為"Duqu 2.0"。
Duqu利用了0-day漏洞CVE-2015-2360(WindowsKernel中的漏洞)和另外兩個(gè)0-day漏洞,攻擊了卡巴斯基實(shí)驗(yàn)室。微軟在2015年6月9日修復(fù)了第一個(gè)漏洞,另兩個(gè)漏洞在近期也得到了修復(fù)。
0x01 木馬剖析
Filename:隨機(jī) / 根據(jù)具體樣本而定
MD5 (根據(jù)具體樣本而定): 14712103ddf9f6e77fa5c9a3288bd5ee
Size: 503,296 bytes
文件屬性
MSI文件具有一下屬性
Composite Document File V2 Document
Little Endian
OS: Windows, Version 6.1
Code page: 1252
Title: {7080A304-67F9-4363-BBEB-4CD7DB43E19D} (randomly generated GUIDs)
Subject: {7080A304-67F9-4363-BBEB-4CD7DB43E19D}
Author: {7080A304-67F9-4363-BBEB-4CD7DB43E19D}
Keywords: {7080A304-67F9-4363-BBEB-4CD7DB43E19D}
Comments: {7080A304-67F9-4363-BBEB-4CD7DB43E19D}
Template: Intel;1033
Last Saved By: {7080A304-67F9-4363-BBEB-4CD7DB43E19D}
Revision Number: {4ADA4205-2E5B-45B8-AAC2-D11CFD1B7266}
Number of Pages: 100
Number of Words: 8
Name of Creating Application: Windows Installer XML (3.0.5419.0)
Security: 4
其他攻擊中使用的MSI文件可能具有另外一些屬性。例如,我們還發(fā)現(xiàn)了另外幾個(gè)字段:
Vendor: Microsoft or InstallShield
Version: 1.0.0.0 or 1.1.2.0 or 2.0.0.0
在Windows資源管理器的文件屬性對(duì)話框中,可以查看某些字段。
這個(gè)MSI數(shù)據(jù)包中有兩個(gè)二進(jìn)制文件:
ActionDll是一個(gè)dll文件,ActionData0是一個(gè)經(jīng)過Camellia加密,LZJB壓縮的數(shù)據(jù)payload(不同情況下的加密算法和壓縮算法也不同)。實(shí)際上,經(jīng)過加密或壓縮的二進(jìn)制數(shù)據(jù)塊中,會(huì)有好幾層可執(zhí)行代碼。
在后面的文章中,我們?cè)敿?xì)地說明了這些組件。
第一層:ActionDLL(msi.dll)
原文件名: msi.dll
MD5: e8eaec1f021a564b82b824af1dbe6c4d
Size: 17’920 bytes
Link時(shí)間: 2004.02.12 02:04:50 (GMT)
類型: 64-bit PE32+ executable DLL for MS Windows
這個(gè)DLL只有一個(gè)StartAction導(dǎo)出函數(shù),msiexec.exe進(jìn)程的上下文會(huì)調(diào)用這個(gè)函數(shù)。當(dāng)這個(gè)函數(shù)被調(diào)用時(shí),這個(gè)函數(shù)就會(huì)獲取一個(gè)MSI屬性-PROP,并用這個(gè)值來解密actionData0包。
接下來,這段代碼會(huì)遍歷12個(gè)需要解密并啟動(dòng)的payload。這些payload是MSI的一部分,可能會(huì)包含以下名稱:ActionData0, ActionData1, ActionData2。
我們的這個(gè)數(shù)據(jù)包中只包含一個(gè)paylioad-“ActionData0”。
第二層:ActionData0
主代碼會(huì)被壓縮和加密到這個(gè)二進(jìn)制數(shù)據(jù)包中。這個(gè)二進(jìn)制的組成包括可執(zhí)行程序,位置無關(guān)代碼塊,和內(nèi)嵌的數(shù)據(jù)對(duì)象。這些代碼似乎遵循著某種框架,使用了很多輔助結(jié)構(gòu)。輔助結(jié)構(gòu)中包含了一些系統(tǒng)API的指針和內(nèi)部數(shù)據(jù)塊的偏移量。這些結(jié)構(gòu)能反映出開發(fā)者的風(fēng)格。當(dāng)代碼初始化時(shí),一個(gè)字段(一般是前四個(gè)字節(jié))中的magic值就會(huì)識(shí)別結(jié)構(gòu)的狀態(tài)和類型。
這名編碼員還喜歡根據(jù)模塊和輸出名稱的哈希來導(dǎo)入系統(tǒng)API。在可執(zhí)行代碼的很多層上都使用了這個(gè)哈希算法。通過兩個(gè)DWORD常量就能識(shí)別:0x8A20C27和0x67F84FC6。
一般情況下,ActionData0中的代碼會(huì)在一個(gè)內(nèi)嵌的可執(zhí)行程序-“klif.dll”上運(yùn)行,由這個(gè)DLL文件的導(dǎo)出函數(shù)表上的第二個(gè)函數(shù)執(zhí)行。也就是說,函數(shù)名稱無所謂,就是要按照函數(shù)表上的順序。當(dāng)調(diào)用這個(gè)導(dǎo)出函數(shù)時(shí),下一階段的輔助結(jié)構(gòu)指針就會(huì)傳遞到這個(gè)函數(shù)上,這樣指針就能使用上一層中設(shè)置的一些值。
但是,在klif.dll執(zhí)行之前,代碼會(huì)嘗試另一條路徑。首先,代碼會(huì)查找“api-ms-win-shell-XXXX.dll”,其中X可以是任意的十進(jìn)制數(shù)。如果當(dāng)前進(jìn)程中沒有這種名稱形式的模塊,名稱就是無效的。這樣的話,代碼就會(huì)遍歷查找任何符合名稱形式的模塊,首先從api-ms-win-shell-0000.dll, api-ms-win-shell-0001.dll, api-ms-winshell-0002.dll開始。這應(yīng)該是Duqu平臺(tái)組件的一個(gè)依賴選項(xiàng)。
在找到名稱后,代碼會(huì)嘗試按照名稱來映射內(nèi)核(section kernel object)對(duì)象,這些名稱是使用PRNG算法生成的。節(jié)名稱的格式“BaseNamedObjects{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}”,其中X是根據(jù)當(dāng)前系統(tǒng)的啟動(dòng)時(shí)間生成的十六進(jìn)制數(shù)字。到目前為止,節(jié)名稱都是根據(jù)“machine/boot time” 來確定的,這樣每個(gè)節(jié)名稱都不一樣,但是如果有其他模塊的進(jìn)程也使用了相同的名稱生成算法,進(jìn)程就能定位這樣的節(jié)。以O(shè)SBoot節(jié)為例,一旦生成了節(jié)名稱,代碼就會(huì)打開節(jié),如果能找到節(jié),代碼就會(huì)從節(jié)中選取幾個(gè)值,然后嘗試打開特定的設(shè)備,并把ICTL代碼發(fā)送到驅(qū)動(dòng)上。驅(qū)動(dòng)設(shè)備的名稱和IOC代碼都在KMART.dll 內(nèi)的一個(gè)節(jié)中。
這名編碼員非常喜歡用節(jié)來訪問數(shù)據(jù)。在映射klif.dll的代碼/數(shù)據(jù)時(shí),還是要用節(jié)。另外也可以通過硬編碼magic QWORD數(shù): 0xA1B5F8FC0C2E1064來找到這個(gè)節(jié)。一旦在當(dāng)前進(jìn)程的地址空間中找到了節(jié),就由這個(gè)節(jié)來運(yùn)行代碼。當(dāng)前的MSI文件數(shù)據(jù)包并不能應(yīng)用這種執(zhí)行路徑,但是這種執(zhí)行路徑出現(xiàn)在了代碼中,我們猜測(cè)這可能是為了使用通用代碼模版來創(chuàng)建當(dāng)前的MSI數(shù)據(jù)包。當(dāng)然,這也說明,其他的Duqu平臺(tái)組件還具有另外的特征。
第三層:klif.dll
Original filename: klif.dll
MD5: 3fde1bbf3330e0bd0952077a390cef72
Size: 196’096 bytes
Link time: 2014.07.06 08:36:50 (GMT)
Type: 64-bit PE32+ executable DLL for MS Windows
很顯然,這個(gè)文件偽裝成了卡巴斯基產(chǎn)品的名稱-“klif.sys”。雖然代碼和文件信息與卡巴斯基產(chǎn)品完全不同,但是,這個(gè)模塊的導(dǎo)出函數(shù)名稱使用了卡巴斯基實(shí)驗(yàn)室的縮寫:KLInit 和KLDone。
當(dāng)這個(gè)DLL加載到一個(gè)新進(jìn)程中時(shí),DLL的內(nèi)部結(jié)構(gòu)就會(huì)初始化,比如給系統(tǒng)API提供指針的結(jié)構(gòu)。
這個(gè)模塊的payload位于KLDone導(dǎo)出函數(shù)上,是導(dǎo)出函數(shù)列表上的第二個(gè)函數(shù)。這個(gè)導(dǎo)出函數(shù)是從上一層代碼中調(diào)用的。 首先,模塊會(huì)確保全局應(yīng)用結(jié)構(gòu)和關(guān)鍵函數(shù)ntdll.dll, kernel32.dll and user32.dll,已經(jīng)初始化。在調(diào)用系統(tǒng)API函數(shù)時(shí),需要使用導(dǎo)出函數(shù)名稱的哈希。哈希算法與前文提到的算法相同,并且也使用了相同的magic常量:0x8A20C27 和0x67F84FC6。
接下來,代碼會(huì)遍歷正在運(yùn)行的進(jìn)程列表,并且獲取每個(gè)進(jìn)程的小寫名稱哈希。這個(gè)哈希可以是0x3E3021CB 的硬編碼值,也就是“avp.exe”字符串的哈希。
攻擊 AVP.EXE
如果“avp.exe”進(jìn)程正在運(yùn)行,模塊就會(huì)嘗試打開OSBoot-section,并且嘗試攻擊avp.exe進(jìn)程。攻擊開始時(shí),首先遍歷下列產(chǎn)品的硬編碼注冊(cè)表項(xiàng)和注冊(cè)表值,來識(shí)別卡巴斯基產(chǎn)品的安裝路徑:
在模塊所查詢的注冊(cè)表值中包含了卡巴斯基產(chǎn)品的根目錄路徑,如“C:Program FilesKasperskyLabKaspersky Internet Security 15.0.0”
一旦找到了注冊(cè)表項(xiàng)和注冊(cè)值,模塊就會(huì)確認(rèn)avp.exe是不是在那個(gè)路徑下面。另外它還會(huì)對(duì)文件執(zhí)行一些額外的檢查:環(huán)境變量的檢查,文件能否被讀取的檢查,是否是一個(gè)PE文件的檢查.
之后這個(gè)模塊執(zhí)行如下動(dòng)作:1.把a(bǔ)vp.exe映射到它內(nèi)部2.改變內(nèi)存區(qū)域的屬性讓代碼執(zhí)行3.改變avp.exe內(nèi)的字符4.使用SSE2 CPU擴(kuò)展對(duì)avp.exe打補(bǔ)丁.
接著,模塊會(huì)嘗試啟動(dòng)一個(gè)新的線程,線程的開始位置就是其中一個(gè)補(bǔ)丁的位置。到目前為止,新的線程會(huì)首先調(diào)用avp.exe模塊,這個(gè)模塊會(huì)執(zhí)行其他的一些調(diào)用,比如,跳回到klif.dll。很顯然,這次攻擊是為了讓avp.exe相信后續(xù)的調(diào)用是安全的,相信調(diào)用堆棧是來自一個(gè)合法的avp.exe模塊。繼續(xù)研究代碼,發(fā)現(xiàn):新線程會(huì)立刻從avp.exe跳轉(zhuǎn)會(huì)klif.dll,并且會(huì)嘗試與卡巴斯基產(chǎn)品的微過濾器,也就是klif.sys通信。
事實(shí)上,在與klif.sys通信之前,新線程會(huì)打開OSBoot-section,并獲取一個(gè)IOCTL代碼和驅(qū)動(dòng)設(shè)備的名稱,然后把這個(gè)IOCTL代碼發(fā)送給設(shè)備。這個(gè)節(jié)和相應(yīng)的驅(qū)動(dòng)(KMART.dll)會(huì)給當(dāng)前模塊提供一定的支持。代碼會(huì)獲取當(dāng)前進(jìn)程名稱的哈希,并且驗(yàn)證哈希是不是下列三個(gè)哈希之一:0x3E3021CB (avp.exe), 0xDE6D4DA0 (msiexec.exe), 0xB915B2D8 (rundll32.exe)。
如果能識(shí)別當(dāng)前進(jìn)程名稱的哈希,模塊就會(huì)打開KlifComm微過濾器的通信端口,并且發(fā)送一些驅(qū)動(dòng)通信信息,來和klif.sys通信。通過分析這些信息,我們發(fā)現(xiàn)這項(xiàng)技術(shù)能讓klif發(fā)現(xiàn)不了進(jìn)程或線程操作。所有的殺毒產(chǎn)品都會(huì)認(rèn)為這個(gè)注冊(cè)過的項(xiàng)目是受信任的,所以不會(huì)掃描其活動(dòng),也不會(huì)檢測(cè)或攔截其進(jìn)程。另外,這個(gè)模塊會(huì)要求卡巴斯基產(chǎn)品的自我防御支持,這個(gè)功能是防止木馬利用系統(tǒng)技術(shù)來殺掉安全產(chǎn)品的進(jìn)程。這樣的話,即使是管理員用戶也無法終止模塊的進(jìn)程。
我們測(cè)試了卡巴斯基的其他一些產(chǎn)品,結(jié)果發(fā)現(xiàn),這些產(chǎn)品都會(huì)檢查進(jìn)程的自定義數(shù)字簽名來驗(yàn)證caller進(jìn)程。截至目前,如果沒有額外的驅(qū)動(dòng)支持,這項(xiàng)技術(shù)不會(huì)成功。從2010年開始,如果有進(jìn)程嘗試打開KlifComm微過濾器的通信端口,卡巴斯基的產(chǎn)品就會(huì)驗(yàn)證這些進(jìn)程的數(shù)字簽名。這種攻擊只能影響舊版的卡巴斯基產(chǎn)品,比如在2009年發(fā)布的KIS2010。
一般來說,攻擊者現(xiàn)在不會(huì)攻擊卡巴斯基在2009年之前發(fā)布的產(chǎn)品。所以,我們有分析了另一種比較合理的解釋。
通常來說,這類攻擊不會(huì)攻擊我們的產(chǎn)品,因?yàn)槲覀兊漠a(chǎn)品會(huì)檢查進(jìn)程的自定義數(shù)字簽名,來驗(yàn)證進(jìn)程的合法性。為了繞過這種檢測(cè),Duqu 2.0的一個(gè)“KMART.dll”模塊給內(nèi)存中的“klif.sys”打了補(bǔ)丁。因?yàn)?“KMART.dll”已經(jīng)利用Windows內(nèi)核漏洞在內(nèi)核模式下運(yùn)行了,所以這種攻擊才能發(fā)揮作用。
在發(fā)送完代碼后,模塊會(huì)繼續(xù)下一階段,也就是進(jìn)程遷移。
CTwoPENC.dll zero-day and KMART.dll
第三層-klif.dll會(huì)執(zhí)行多個(gè)函數(shù),來保證木馬能駐進(jìn)內(nèi)存,并且繞過殺毒檢測(cè)。
很重要的一點(diǎn)就是獲取內(nèi)核權(quán)限。在64位系統(tǒng)上,如果驅(qū)動(dòng)沒有簽名,用戶就不能加載和運(yùn)行它。雖然其他攻擊者,例如Equation 或 Turla,他們會(huì)選擇利用第三方簽名的驅(qū)動(dòng),但是Duqu 2.0平臺(tái)使用的手段要高明很多。
其中一個(gè)payload-“CTwoPENC.dll”捆綁了“klif.dll”。這是一個(gè)Windows內(nèi)核漏洞(CVE-2015-2360)。利用這個(gè)漏洞,payload就能使用最高權(quán)限來運(yùn)行代碼。我們恢復(fù)了幾個(gè)版本的“CTwoPENC.dll”,存在32位和64位版本,編譯時(shí)間戳如下:
2014.08.25 01:20:04 (GMT)
2014.08.25 01:19:03 (GMT)
2014.07.06 09:17:03 (GMT)
不同于Duqu 2.0的其他模塊,這些時(shí)間戳看起來都是合法的。至于為什么會(huì)這樣,我們還不清楚-可能Duqu平臺(tái)的開發(fā)者使用的是其他人編寫的模塊,而開發(fā)者忘了修改編譯時(shí)間戳。
“CTwoPENC.DLL”是 “win32k.sys” 中存在的一個(gè)0-day漏洞,利用這個(gè)漏洞,非權(quán)限用戶也能獲取到內(nèi)核權(quán)限。這個(gè)模塊會(huì)利用漏洞來創(chuàng)建窗口,線程的類別名稱分別是“CPer”, “Zero”, “CTwo”, “Vero” ,并且模塊還能操控回調(diào)指針。
部分漏洞代碼會(huì)注冊(cè)窗口類并創(chuàng)建新的窗口
這個(gè)漏洞的目的是加載一個(gè)“KMART.dll”驅(qū)動(dòng)。如果漏洞攻擊成功,“KMART.dll”就會(huì)從模塊中解壓縮,然后在內(nèi)核模式下發(fā)動(dòng)攻擊。“KMART.dll”既有32位也有64位版本。然后,這個(gè)驅(qū)動(dòng)會(huì)執(zhí)行一個(gè)內(nèi)核模式攻擊,攻擊目標(biāo)就是卡巴斯基產(chǎn)品的過濾器“klif.sys”。“KMART.dll”會(huì)給系統(tǒng)API函數(shù)-PsGetCurrentProcessId, PsLookupProcessByProcessId的導(dǎo)入表地址打補(bǔ)丁,也會(huì)給殺毒驅(qū)動(dòng)-klflt.sys的輸出函數(shù)KlGetStringRef 打補(bǔ)丁。在函數(shù)被攔截之前,惡意代碼已經(jīng)把惡意模塊偽裝成來自進(jìn)程/文件“avp.exe”(使用殺毒組件的真實(shí)位置),這樣就能繞過殺毒軟件的監(jiān)視。
在測(cè)試期間,所有的Windows版本(32位和64位的XP, Vista, 7, 8, 8.1)上都受這個(gè)漏洞的影響。微軟于2015年6月9日修復(fù)了這個(gè)漏洞。
0x02 PAYLOAD容器和遷移
payload容器中包含一個(gè)短代碼節(jié),用于描述目標(biāo)CPU的架構(gòu),payload類型和目標(biāo)進(jìn)程的名稱或哈希。當(dāng)模塊使用某些內(nèi)嵌代碼或文件時(shí),代碼中一般會(huì)有兩個(gè)代碼變量:32位和64位。每個(gè)payload的運(yùn)行類型都是根據(jù)單一字符來識(shí)別。當(dāng)前模塊支持這5種payload 運(yùn)行類型:g,i,k,l,q。開發(fā)者使用的字符按照字母表順序排列,也就是說,代碼中原來可能還有其他的payload類型,只不過被移除了。
運(yùn)行類型為“L”的payload
首先,代碼會(huì)在其他進(jìn)程中查找權(quán)限。進(jìn)程句柄是硬編碼的,或者是通過查找當(dāng)前運(yùn)行進(jìn)程,獲取進(jìn)程的名稱,然后對(duì)比已知哈希來獲得的。模塊中包括下列硬編碼進(jìn)程的哈希: 0x31283314 (services.exe), 0x1026D1BA (lsass.exe), 0x3BD2498C (svchost.exe)。
如果發(fā)現(xiàn)了任何識(shí)別出的進(jìn)程,模塊就會(huì)打開進(jìn)程標(biāo)記,并驗(yàn)證下列的權(quán)限是否可用:
SeDebugPrivilege
SeTcbPrivilege
SeAssignPrimaryTokenPrivilege
SeIncreaseQuotaPrivilege
SeImpersonatePrivilege
SeRestorePrivilege
如果這些權(quán)限可用,模塊就會(huì)復(fù)制進(jìn)程標(biāo)記并保存到內(nèi)部結(jié)構(gòu)中,以便日后使用。
模塊在當(dāng)前系統(tǒng)中,查找一個(gè)可用的殺毒軟件和一些通用進(jìn)程。如果什么都沒有發(fā)現(xiàn),模塊就會(huì)嘗試查找下列軟件的可執(zhí)行文件:
20多個(gè)卡巴斯基的產(chǎn)品
McAfee VSCore, SystemCore, HIP
Symantec Internet Security ·
Bitdefender
ESET ·
H+BEDV ·
TrendMicro Network Security Component ·
Rising AV ·
Avast ·
AVG 2012/2013/2014/2015 ·
F-Secure ·
Qihoo 360 Security ·
通用Windows 進(jìn)程:
o %programfiles(x86)%windows DefendermsmpEng.exe
o %systemroot%syswow64svchost.exe
o %systemroot%system32lsass.exe
o %systemroot%system32svchost.exe
當(dāng)模塊發(fā)現(xiàn)了一個(gè)這樣的可執(zhí)行程序后,模塊會(huì)從發(fā)現(xiàn)的位置上運(yùn)行一個(gè)新的進(jìn)程,并使用自己的代碼替換當(dāng)前可執(zhí)行文件中的可執(zhí)行代碼,代碼會(huì)經(jīng)過加密和壓縮。
如果代碼能從具有安全權(quán)限的進(jìn)程中,找到一個(gè)安全標(biāo)記,代碼就會(huì)使用CreateProcessAsUser API來創(chuàng)建一個(gè)新的進(jìn)程,在這時(shí),代碼就會(huì)使用得到的安全標(biāo)記。否則,代碼只會(huì)簡(jiǎn)單地生成一個(gè)新的進(jìn)程。
這個(gè)新進(jìn)程在啟動(dòng)時(shí),處于掛起和調(diào)試狀態(tài)。在新進(jìn)程啟動(dòng)前,為了簡(jiǎn)化代碼注入和數(shù)據(jù)操控,子進(jìn)程的DEP是禁用的。這樣,從外表上看,這個(gè)進(jìn)程就像是一個(gè)殺毒程序的進(jìn)程,但是它的內(nèi)部代碼可完全不是合法的模塊。
運(yùn)行模式為“G”的payload
這種payload與上面的payload幾乎一樣,但是這個(gè)payload的載入程序更簡(jiǎn)單-這個(gè)Loader不進(jìn)行hijack和提權(quán)步驟。注入進(jìn)程的選擇是自動(dòng)的,只要是可用進(jìn)程就可以。
運(yùn)行模式為“I”的payload
這種payload類似于G類 payload,但是它的載入程序在解析payload的標(biāo)頭時(shí)有區(qū)別:這個(gè)載入程序只會(huì)選取4個(gè)字節(jié)來作為進(jìn)程的哈希,而是不是進(jìn)程名稱字符串。這種方法可能是為了隱藏目標(biāo)進(jìn)程的名稱,但是,并不是整個(gè)模塊都應(yīng)用了這種方法。
運(yùn)行模式為“K”的payload
這種payload會(huì)在當(dāng)前進(jìn)程的上下文中運(yùn)行。代碼僅僅會(huì)復(fù)制需要在獨(dú)立內(nèi)存中執(zhí)行的代碼,然后在單獨(dú)的線程中運(yùn)行這些代碼。在線程完成執(zhí)行后,執(zhí)行就會(huì)被攔截。
運(yùn)行模式為“Q”的payload
這種payload與 Q類 payload一樣,但是這種payload不會(huì)攔截新線程的執(zhí)行。目前來看,新代碼是異步運(yùn)行的。
在payload容器打開后,代碼就會(huì)遷移到另一個(gè)進(jìn)程,安全軟件會(huì)保護(hù)這個(gè)進(jìn)程,這樣真正的惡意代碼就啟動(dòng)了。在多數(shù)情況下,我們稱其為后門通道,能監(jiān)聽協(xié)調(diào)器的通信。在很少的情況下,某些設(shè)備上的協(xié)調(diào)器模塊才能與C2通信,這是才可以作為一個(gè)雙向代理,來提供大量的二級(jí)插件。
插件化模塊平臺(tái)
除了基本的遠(yuǎn)程后門,攻擊者還在域控制器上和受害者的設(shè)備上,部署了更復(fù)雜的數(shù)據(jù)包。這些MSI軟件包包括很多模塊,各自的作用也不同。
具備完整功能的軟件包很大-18MB,基本的遠(yuǎn)程后門只有500KB。這兩者的結(jié)構(gòu)相同,都有ActionDll和加載程序,但是軟件還有用于載入和運(yùn)行的插件。
分析中,我們識(shí)別了100多種插件的變種。關(guān)于插件的描述如下。我們使用MD5的前兩個(gè)字節(jié)創(chuàng)建了虛擬標(biāo)識(shí)符,來區(qū)分插件。
03B7-Duqu2.0的主要模塊,大師手筆
1、與cc的通信可以以多種協(xié)議進(jìn)行
2、可以創(chuàng)建一個(gè)自簽名證書的中間cc代理程序
3、可以啟動(dòng)插件框架,加載管理所有的附加插件
可以使用HTTP HTTPS SMB網(wǎng)絡(luò)管道 或者加密的TCP直連的方式通信.跟2011duqu一樣它可以把交互隱藏在Jpeg或者gif圖片中通過http的方式來進(jìn)行.請(qǐng)求名字,url,和user-agent在不同的攻擊中可能是不同的.
已知其他變種:3026, 4F11。
0682 –收集基本系統(tǒng)信息:
當(dāng)前運(yùn)行進(jìn)程的列表
活動(dòng)桌面和終端會(huì)話
收集到的信息會(huì)通過caller提供的命名管道來傳輸。
已知其他變種:C0B7
073C **–在客戶端和服務(wù)器上應(yīng)用完整的Windows Socket傳輸**。提供工廠類來封裝網(wǎng)絡(luò)函數(shù)。
0872-當(dāng)Windows安裝程序啟動(dòng)了惡意軟件安裝包時(shí),MSI CustomAction library就會(huì)被激活。然后,加載包含payload的加密二進(jìn)制,接著解密,并在內(nèi)存中執(zhí)行。
版本信息中的名稱有好幾個(gè):svcmsi_32.dll, msi3_32.dll, MSI.dll, msi4_32.dll。
加密算法也不同:Camellia 256, AES, XXTEA。
從MSI參數(shù)中提取出的解密密鑰可能是:PROP,HASHVA, CKEY。
通過前綴(根據(jù)具體情況)來搜索加密的二進(jìn)制對(duì)象:ActionData, CryptHashs, CAData。
已知存在32位和64位版本。其他已知變體:8D7C, 16EF, E6E5,434C, 44BD, F708。
09A0-64位變體,能竊取文件內(nèi)容。搜索符合下列規(guī)則的文件:
*.inuse, *.hml
包括“data.hmi” 或 “val.dat”的文件名
/Int/HMI/ 或/LG/HM/文件夾的文件
09A0 插件感興趣的文件名稱和目錄名稱
已知其他變體:8858
0AB8 –提供25個(gè)函數(shù),這些函數(shù)能操控文件和目錄:
列出目錄下的文件
上傳或下載任意文件
讀/寫文件內(nèi)容
在某些情況中,模塊會(huì)搜索目錄-“int”, “lg”, “ofmd”, “ l”, “ak”,以及擴(kuò)展名-“.part”, “.manual”, “.inuse”。
0AB8 插件感興趣的文件目錄名稱
其他已知變體:A69E
0B97-網(wǎng)絡(luò)傳輸。利用API來連接socket和caller提供的管道。其他變體:56A2。
152B-網(wǎng)絡(luò)和域發(fā)現(xiàn)。
枚舉域中所有的服務(wù)器
嘗試鏈接遠(yuǎn)程注冊(cè)表并枚舉“HKEY_USERS”中所有的用戶。然后把用戶名轉(zhuǎn)換成SID。
枚舉所有可見的網(wǎng)絡(luò)共享
其他已知樣本:A987
1C71-把文件數(shù)據(jù)放到內(nèi)存中。
2125-網(wǎng)絡(luò)感染模塊。嘗試從正在運(yùn)行的進(jìn)程中,獲取管理憑證。然后使用Windows共享來連接到一個(gè)目標(biāo)設(shè)備。接著,惡意DLL后門成功感染設(shè)備;目標(biāo)目錄是變化的,可能在UPDROOT$, ADMIN$ 或 C$。使用自定義SMB數(shù)據(jù)包來識(shí)別目標(biāo)OS的版本。然后使用新創(chuàng)建的服務(wù)“svcmsi_32@”,來啟動(dòng)目標(biāo)惡意DLL。這個(gè)模塊通過Windows管道與目標(biāo)后門通信。其他變體:DB65。除了惡意DLL,模塊還會(huì)上傳一個(gè)新的MSI數(shù)據(jù)包,并且依賴MSIEXEC.EXE 通過新創(chuàng)建的服務(wù)“msisvc_32@”來啟動(dòng)MSI,目標(biāo)MSI的名稱是隨機(jī)生成的,名稱模版是“tmp%x.tmp”。
在被感染時(shí),Windows創(chuàng)建的事件日志(系統(tǒng))項(xiàng)目
模塊通過竊取當(dāng)前運(yùn)行進(jìn)程的token來獲取管理憑證。這些進(jìn)程需要是管理員權(quán)限用戶啟動(dòng)的。所以,模塊首先會(huì)直接在域控制器中,查詢當(dāng)前域中的100個(gè)管理員用戶名。
網(wǎng)絡(luò)感染模塊使用的遠(yuǎn)程位置
24B7-遠(yuǎn)程桌面管理。獲取屏幕截圖,同時(shí)可以發(fā)送輸入到桌面,移動(dòng)鼠標(biāo)光標(biāo)。存在32位和64位版本的變體。其他的已知變體:65BE, 7795, BDC8, DEE2
26D6-檢測(cè)正在運(yùn)行的網(wǎng)絡(luò)嗅探器(wireshark, tcpview, netstat, dumpcap, perfmon),設(shè)置一個(gè)TCP服務(wù)器,并通過網(wǎng)絡(luò)管道通信。內(nèi)部名稱:“P.dll。
2829-收集系統(tǒng)信息
監(jiān)控USB設(shè)備連接
收集USB驅(qū)動(dòng)器的歷史記錄
枚舉網(wǎng)絡(luò)共享,窗口標(biāo)題,系統(tǒng)路由表
讀寫加密文件
2913-WMI數(shù)據(jù)收集
枚舉具有SID的配置文件
提取每個(gè)配置文件目錄下lnk文件的信息
通過WMI(CIMV2)來枚舉進(jìn)程,包括已結(jié)束進(jìn)程
從可用的遠(yuǎn)程注冊(cè)表中提取用戶信息
其他已知變體:C776
29D4-模塊2125利用服務(wù)msisvc_32@; DLL backdoor來感染網(wǎng)絡(luò),通過管道“Global{B54E3268-DE1E-4c1e-A667- 2596751403AD}”來接收命令。存在32位和64位變體。
其他已知變體:6F92, A505, D242
2B46-收集系統(tǒng)和用戶信息
域控制器名稱
域中的用戶列表
管理員的域名
枚舉域信任
TCP表
UDP表
SNMP發(fā)現(xiàn)(OS,解析所有的回復(fù))
USB驅(qū)動(dòng)器的歷史記錄,已掛載設(shè)備
安裝的程序
時(shí)區(qū)
OS安裝日期
ODBC.ini,SQL服務(wù)器的S instance info,Oracle ALL_HOMES, SyBase, DB2, MS SQL,MySQL 的最后連接
DHCP/routing
網(wǎng)絡(luò)配置
零配置參數(shù)
已連接的打印機(jī)
WinRAR, WinZip, Office使用的MRU列表,IE類URL,已映射的網(wǎng)絡(luò)設(shè)備,Visual Studio MRU
終端服務(wù)客戶端的默認(rèn)用戶名提示
用戶協(xié)助歷史記錄
PuTTY主機(jī)密鑰和會(huì)話
已登錄用戶
網(wǎng)絡(luò)適配器配置
VNC客戶端密碼
使用SMB數(shù)據(jù)包來掃描網(wǎng)絡(luò)并識(shí)別OS
模塊收集到的一些注冊(cè)位置
已知變體:A7F8
2BF7-實(shí)用工具DLL。提供基本的API來創(chuàng)建新的MSI數(shù)據(jù)包,加載并注入任意PE模塊。同時(shí)負(fù)責(zé)加載惡意MSI文件中,VFS的第一層。存在32位和64位變體。
已知名稱:“ntdll.dll”, “klif.dll”, “apiset.dll”.
其他已知變體:6DA1, 32DB, 8304, 9931, 9E60, A2D4, ABA9, B3BB, DC5F, DD32, F7BB
3395-MS SQL發(fā)現(xiàn)模塊。這個(gè)模塊能向網(wǎng)絡(luò)發(fā)送ARP數(shù)據(jù)包,同時(shí)發(fā)現(xiàn)MS SQL Server端口。其他函數(shù)負(fù)責(zé)連接額讀取遠(yuǎn)程注冊(cè)表內(nèi)容。
35E9-文件系統(tǒng)發(fā)現(xiàn)。
枚舉網(wǎng)絡(luò)共享
枚舉本地驅(qū)動(dòng)器
遍歷文件系統(tǒng)的層級(jí)結(jié)構(gòu)并枚舉文件;識(shí)別重分析點(diǎn)
3F45-管道后門。打開一個(gè)新的全局可見的Windows管道,接收并執(zhí)行加密的命令。“magic”字符串說明加密的協(xié)議是“tttttttt”。
枚舉正在運(yùn)行的進(jìn)程
加載并執(zhí)行任意PE文件
存在32位和64位版本。
已知的管道名稱:
.pipe{AAFFC4F0-E04B-4C7C-B40A-B45DE971E81E} .pipe{AB6172ED-8105- 4996-9D2A-597B5F827501}
.pipe{0710880F-3A55-4A2D-AA67-1123384FD859} .pipe{6C51A4DB-E3DE- 4FEB-86A4-32F7F8E73B99}
.pipe{7F9BCFC0-B36B-45EC-B377-D88597BE5D78}, .pipe{57D2DE92-CE17- 4A57-BFD7-CD3C6E965C6A}
其他已知變體:6364, 3F8B, 5926, A90A, DDF0, A717, A36F, 8816, E85E, E927
4160-密碼竊取程序
提取Google Chrome 和 Firefox的登錄數(shù)據(jù)
LSA證書
使用這些數(shù)據(jù)來定位Chrome保存的登錄信息
其他已知 變體:B656
41E2-密碼竊取程序。64位模塊。提取:
IE IntelliForms 歷史
POP3/HTTP/IMAP 密碼
TightVNC,RealVNC,WinVNC3/4密碼
Outlook設(shè)置
SAM,LSASS緩存
Windows Live,Net Passport密碼
該模塊收集的信息
其他已知變體:992E,AF68,D49F
482F-收集系統(tǒng)信息
枚舉驅(qū)動(dòng)器
獲取正在運(yùn)行進(jìn)程的列表
大范圍收集進(jìn)程信息包括進(jìn)程運(yùn)行了多長(zhǎng)時(shí)間
內(nèi)存信息
SID信息
其他已知變體:F3F4
559B-調(diào)查Active Directory
用ADSI連接Active Directory GC
枚舉AD中所有對(duì)象
用人類可讀的格式來顯示所有條目
ActiveDirectory詳細(xì)路徑
580C-收集系統(tǒng)和網(wǎng)絡(luò)信息
檢索域控制器名稱
枚舉域中所有的用戶和小組
收集計(jì)劃任務(wù)日志
收集硬盤信息,可移動(dòng)硬盤的歷史記錄
檢索防火墻策略
枚舉所有命名系統(tǒng)對(duì)象
枚舉所有系統(tǒng)服務(wù)
5B78-收集系統(tǒng)信息及實(shí)用工具。
它有兩個(gè)導(dǎo)出函數(shù)其中一個(gè)的名字是"Getreport"
枚舉正在運(yùn)行的進(jìn)程,提取tokens和SID,收集時(shí)間信息
explicit credentials 登陸用戶
以當(dāng)前進(jìn)程來模擬用戶權(quán)限
用硬編碼模版創(chuàng)建新32位和64位shellcode
存在32位和64位版本。
其他已知變體:E8C7,EE6E
5C66-經(jīng)過加密的文件I/O,實(shí)用工具
文件I/O操作:打開/查詢/讀取/編寫
管理經(jīng)過壓縮和加密的臨時(shí)文件
622B-生成非常規(guī)格式的XML
計(jì)算機(jī)名稱
Windows目錄
枚舉所有邏輯驅(qū)動(dòng)器
列舉所有文件
OS序列號(hào)
域名
網(wǎng)絡(luò)適配器配置:IP地址,MAC,MTU,適配器列表
生成系統(tǒng)報(bào)告的XML標(biāo)簽
6302-實(shí)用工具。
內(nèi)部名稱“d3dx9_27.dll”。執(zhí)行基于時(shí)間的事件。
其他已知變體:FA84
669D-實(shí)用工具。
列舉文件名稱和目錄,檢查它們是否存在。
其他已知變體:880B
6914-Sniffer網(wǎng)絡(luò)攻擊。
使用合法WinPcap驅(qū)動(dòng)器“npf.sys”。檢測(cè)NBNS(NetBIOS協(xié)議)感興趣的請(qǐng)求并發(fā)送響應(yīng)
響應(yīng)WPAD請(qǐng)求(NBNS數(shù)據(jù)包中的“FHFAEBE”)
向HTTP GET請(qǐng)求發(fā)送響應(yīng)
網(wǎng)絡(luò)過濾器基于BPF庫(kù)。HTTP和WPAD的payload由外部提供.
虛假HTTP響應(yīng)及相關(guān)狀態(tài)信息
6FAC-文件API
獲取文件大小,屬性
安全刪除文件
打開/關(guān)閉/讀寫/文件內(nèi)容
其他已知變體:A7EE
7BDA-收集系統(tǒng)信息
使用wscapi.dll api的防火墻狀態(tài) 當(dāng)前殺毒軟件狀態(tài)
檢查sqlservr.exe是否運(yùn)行中
計(jì)算機(jī)名稱
工作小組信息
域控制器名稱
網(wǎng)絡(luò)適配器配置
時(shí)間及時(shí)區(qū)信息
CPU頻率
其他已知變體:EF2E
7C23-從文件中提取元數(shù)據(jù)并收集系統(tǒng)信息
計(jì)算機(jī)名稱
系統(tǒng)卷標(biāo)序列號(hào)
完整的文件API,如6FAC中提到的
搜索文件、檔案及implements routines中的信息并提取:
電子郵件信息:eml,msg
圖片文件:jpg,jpe,jpeg,tif,tiff,bmp,png
多媒體文件:wmv,avi,mpeg,mpg,m4a,mkv,wav,aac,ac3,dv,flac,flv,h264,mov,3gp,3g2,mj2,mp3,mpegts,ogg,asf.上述文件都經(jīng)libffmpeg重加密。
PDF文件內(nèi)容
微軟Office:doc,docx,xlsx,pptx.專用路徑為:“OfficeRipDoc”,“OfficeRipDocx”,“OfficeRipXlsx”,“OfficeRipPptx”。提取PPT幻燈片,將其轉(zhuǎn)換成HTML摘要
檔案:gz,gzip,gzX3,zip,rar
創(chuàng)建擴(kuò)展名為“.fg4”的臨時(shí)文件。
其他已知變體:EB18,C091
感興趣的文件擴(kuò)展名及其對(duì)應(yīng)的狀態(tài)信息列表
8172——嗅探攻擊。執(zhí)行 NBNS(NetBIOS協(xié)議)名稱解析來欺騙:
WPAD請(qǐng)求
以“SHR”開頭的名字
以“3142”(只限日志)開頭的名字
附加功能:該組件能夠在硬編碼模板中新建shellcode blob。
81B7——驅(qū)動(dòng)程序管理
把驅(qū)動(dòng)程序?qū)懭氪疟P
啟動(dòng)/關(guān)閉驅(qū)動(dòng)程序
從磁盤中安全刪除驅(qū)動(dòng)程序文件
其他已知變體: C1B9
8446——Oracle DB和ADOdb客戶端
使用 “oci.dll” API訪問Oracle數(shù)據(jù)庫(kù)
從數(shù)據(jù)庫(kù)中獲取所有可用信息
還會(huì)連接到 ADOdb pviders
8912——處理加密文件,收集系統(tǒng)信息
shared file mapping communication
將加密數(shù)據(jù)寫入文件
枚舉窗口
枚舉網(wǎng)絡(luò)共享和本地磁盤
檢索USB設(shè)備歷史記錄
收集網(wǎng)絡(luò)路由表
已知互斥體和映射名:
Global{DD0FF599-FA1B-4DED-AC70-C0451F4B98F0} Global{B12F87CA-1EBA- 4365-B90C-E2A1D8911CA9},
Global{B03A79AD-BA3A-4BF1-9A59-A9A1C57A3034} Global{6D2104E6-7310- 4A65-9EDD-F06E91747790},
Global{DD0FF599-FA1B-4DED-AC70-C0451F4B98F0} Global{B12F87CA-1EBA- 4365-B90C-E2A1D8911CA9}
其他已知變體: D19F, D2EE
9224——運(yùn)行控制臺(tái)應(yīng)用程序。使用桌面"default"創(chuàng)建進(jìn)程,附加到命令行窗口,把i/o重定向到命名管道.
92DB——修改cmd.exe shell。
9F0D(64位), D1A3(32位)——NPF.SYS這個(gè)驅(qū)動(dòng)是伴隨著VFS插件一起分發(fā)的,它有合法的簽名.。它被用來執(zhí)行嗅探攻擊。
A4B0——網(wǎng)絡(luò)調(diào)查
用DHCP Server Management API (DHCPSAPI.DLL)來枚舉所有DHCP服務(wù)器的客戶端
查詢所有已知的DHCP子網(wǎng)
搜索開放了udp1434 udp137端口的電腦
枚舉所有網(wǎng)絡(luò)服務(wù)器
枚舉網(wǎng)絡(luò)共享
嘗試連接到遠(yuǎn)程注冊(cè)表以枚舉HKEY_USERS下的所有用戶,將這些用戶名轉(zhuǎn)換成SID。
B6C1 - WNet API。為WnetAddConnection2和WNetOpenEnum函數(shù)提供wrappers
其他已知變體:BC4A
C25B——嗅探攻擊。運(yùn)行一個(gè)偽造SMB服務(wù)器來誘騙其他電腦用NTLM進(jìn)行驗(yàn)證。
執(zhí)行SMB v1命令
開放虛假ipc$ A:share
接受用戶身份驗(yàn)證請(qǐng)求
處理HTTP “GET /”請(qǐng)求
ED92——文件系統(tǒng)調(diào)查
枚舉所有本地驅(qū)動(dòng)器,并連接到網(wǎng)絡(luò)共享
列出文件
EF97——文件操作動(dòng)作
枚舉文件
創(chuàng)建和刪除目錄
復(fù)制/移動(dòng)/刪除文件和目錄
從文件中獲取版本信息
計(jì)算文件的哈希函數(shù)
其他已知變體:F71E
0x03 結(jié)束語
一般來說,刻畫黑客的犯罪過程是一件很困難的事情,duqu2.0尤甚.
duqu除了使用大量的代理來隱蔽自身的犯罪行為外,還額外使用了一些小伎倆:比如它會(huì)在代碼中植入幾個(gè)虛假的標(biāo)記,ugly.gorilla&romanian.antihacker, LZJB算法,前者會(huì)讓我們錯(cuò)誤的認(rèn)為此次攻擊事件是由中國(guó)人干的或者這是一次來自羅馬尼亞的黑客攻擊,后者會(huì)讓我們錯(cuò)誤的認(rèn)為這個(gè)木馬來源于miniduke家族.
duqu的攻擊具有多地域特征,受害者既有西方國(guó)家,也有中東和亞洲國(guó)家.關(guān)于duqu背后的黑客我們發(fā)現(xiàn)了很有趣的一點(diǎn),那就是他們不僅會(huì)盜竊,還會(huì)偷方便盜竊用的工具.比如為了投放木馬他們?cè)?011年攻擊了匈牙利的一家管理數(shù)字證書的企業(yè).
duqu2.0的攻擊目標(biāo)和duqu1.0的攻擊目標(biāo)有很多重合的地方.伊朗核設(shè)施和一些工控企業(yè)始終是他們覬覦的目標(biāo).
對(duì)一家網(wǎng)絡(luò)安全公司來說,承認(rèn)系統(tǒng)被入侵是一件不可想象的事情,但是對(duì)卡巴斯基來說不是這樣的,因?yàn)槲覀儽泄_透明的原則,基于對(duì)用戶安全的考量,我們選擇公布了此次事件的調(diào)查結(jié)果.---|||---|||為了用戶的信任 我們會(huì)戰(zhàn)斗到底。