ChromeLoader:新出現劫持用戶瀏覽器搜索和展示廣告的惡意軟件活動(上)

2022年1月,研究人員發現了一個名為ChromeLoader(也稱為ChoziosiLoader和ChromeBack)的新瀏覽器劫持者/廣告軟件活動。盡管使用了簡單的惡意廣告,該惡意軟件還是被廣泛傳播,可能會泄露成千上萬用戶和組織的數據。
惡意軟件開發者沒有使用Windows可執行文件(.exe)或動態鏈接庫(.dll)等更傳統的惡意軟件,而是使用瀏覽器擴展作為其最終負載。瀏覽器擴展充當廣告軟件和信息竊取程序,泄露用戶的所有搜索引擎查詢。
ChromeLoader惡意軟件
ChromeLoader是一個多階段攻擊的惡意軟件家族。每個變體在其攻擊鏈中都包含不同的階段,但不同變體之間的攻擊鏈通常看起來非常相似,包括所有變體中使用的惡意瀏覽器擴展。
不同有效負載擴展具有攻擊者添加的硬編碼版本。各種擴展版本與此惡意軟件的不同變體有關。研究人員不僅通過相關的擴展版本來區分這些變體,還通過在整個攻擊鏈和目標操作系統中使用的技術來區分這些變體。
本文按檢測順序列出了不同的變體:
變體0:以這種方式命名,因為它在變體1(在野外發現的第一個變體)之前處于活動狀態。它使用AutoHotKey(AHK)編譯的可執行文件和Chrome擴展的1.0版。它的第一次已知攻擊發生在12月。
變體1:它使用Chrome擴展的2.0-4.4版本作為其有效負載和一個DotNet可執行文件,該可執行文件啟動混淆的PowerShell作為其釋放程序。它主要活躍在1月份。
變體2:它使用6.0版的Chrome擴展程序,并使用一個經過混淆的可執行文件作為其初始釋放程序,自3月以來一直很活躍。
MacOS變體:此變體專注于MacOS計算機(而其他變體僅針對Windows用戶)。使用擴展的6.0版本,活動自3月就開始了。
不同變體的攻擊鏈
攻擊載體(變體1)
ChromeLoader惡意軟件的第一個變體于2022年1月首次出現。
當用戶通過廣告網站和社交媒體平臺上的惡意廣告活動被誘使下載種子文件或破解視頻游戲時,事件鏈就開始了。用戶掃描這些網頁上的二維碼并被重定向到顯示ISO映像(光盤映像文件,通常與CD/DVD一起使用)的受攻擊網站。用戶下載ISO鏡像,通過雙擊掛載它并執行掛載的ISO鏡像中包含的內容。

Twitter上發布的二維碼示例

來自二維碼的惡意ISO映像的下載鏈接示例
部署
下載的ISO映像包含以下內容:
Microsoft.Win32.TaskScheduler.dll:由Microsoft簽名的合法.NETDLL,供其他.NET程序用于與計劃任務機制集成。
Languagefolders:包含所提到的DLL使用的資源文件。
CS_installer.exe及其配置文件:惡意軟件開發者編寫的惡意可執行文件(請注意,名稱可能會從一個版本更改為另一個版本)。在某些版本中,開發者(可能是偶然)將包含調試數據的PDB文件也留在了此文件夾中。
_meta.txt:此惡意軟件高級版本中的文本文件,包含ASCII字母。
此目錄中的大部分文件都是隱藏的,普通用戶在使用Windows文件資源管理器打開此目錄時不會注意到它們。唯一的非隱藏文件是CS_installer.exe,它誘使受害者雙擊它來完成軟件安裝下載。

已安裝的惡意ISO映像示例(選擇“顯示隱藏文件”后)
受害者通過雙擊啟動CS_installer.exe。在大多數情況下,可執行文件會顯示如下圖5所示的消息,表明程序執行失敗。然而,這是開發者試圖誤導他們的目標。

dropper消息框,旨在欺騙用戶
可執行文件是用.NET編寫的非混淆程序,因此.NET反射程序可以對其進行反編譯以讀取源代碼。當可執行文件加載到反射程序中時,會顯示下圖中所示的代碼。此代碼創建一個計劃任務,配置為每十分鐘執行一次惡意base64編碼的PowerShell命令。任務名稱由與namesDict數組中的隨機后綴連接的Chrome字符串構成。

反編譯的CS_installer.exe源代碼示例
腳本內容來自_meta.txt文件,由下圖中的以下預定義函數解密,該函數應用簡單的字符替換。

unscramble函數的示例
上面提到的一些功能在該惡意軟件的早期版本中沒有。例如,在下圖所示的版本中,這個版本是在圖6和7中提到的版本前一周才發現的,開發者沒有使用反匯編函數,而是簡單地將已編碼的PowerShell腳本硬編碼到.NET可執行文件中,并使用預定義的ChromeLoader名稱來執行任務,而不是生成更隨機的后綴。

變體1的源代碼示例
攻擊者使用編碼的PowerShell腳本下載惡意瀏覽器擴展并將其加載到用戶的Chrome瀏覽器中。

PowerShell釋放程序中的變量定義示例

負載下載嘗試示例

嘗試將有效負載加載到用戶的瀏覽器中
從這個惡意軟件的早期版本到后來的版本的演變也可以在編碼的PowerShell腳本中看到。下圖顯示了由該變體的早期版本執行的PowerShell腳本,該變體明顯更短,包含的代碼也更簡單。

此PowerShell釋放程序的舊版本示例
dropper統計
出于研究目的,研究人員使用惡意軟件下載惡意Chrome擴展并將其安裝到受害者的瀏覽器中。托管Chrome擴展程序的URL被硬編碼在混淆的PowerShell命令中,并且在不同版本之間發生變化。

安裝服務器的第一次攻擊嘗試

安裝服務器連接嘗試傳播

每個區域阻止的攻擊

在變種1最活躍的時間內,每個安裝服務器每天的感染嘗試
有效載荷
該惡意軟件的有效負載是一個Chrome擴展程序,每個可下載的擴展程序都具有相同的格式:

下載的擴展文件示例
使用清單文件中的一些定義,并使用已知的合法圖片,擴展聲稱是合法且無害的。但是,該擴展程序要求提升權限。請求的權限包括訪問瀏覽器數據、操縱Web請求和訪問每個可能的URL地址,而合法的瀏覽器擴展程序不會這樣做。

下載的擴展清單文件示例
Javascript文件conf.js聲明了常量變量,后面會用到主腳本background.js。C2域存儲在_ExtDomNoSchema中。

下載擴展的conf.js文件示例
background.js是一個包含所有擴展功能的單行JavaScript文件;它被嚴重混淆,但可以通過一系列簡短的步驟轉換為可讀的JavaScript代碼。但是,任何使用已知的公共JavaScript反混淆工具對該代碼進行反混淆的嘗試都將失敗,原因將在后面詳述。

下載擴展的模糊background.js文件示例
該腳本使用各種混淆技術來隱藏其目的和惡意代碼。執行的第一個函數之一是負責將標準JavaScript函數和對象復制到名稱混亂的新對象中,這些新對象稍后將使用腳本解碼位于該腳本最后指令中的最終有效負載。

重命名機制的示例。例如,在本例中,String對象存儲為b4VV。
在此腳本的整個執行過程中,開發者使用了面向switch-case的編程來使惡意軟件分析人員更難閱讀和理解他們的程序。

一個面向switch-case的編程示例
程序使用上圖中所示的E3變量循環,并對每個值執行不同的操作。當switchcase中的相關流程結束時,程序將E3的值更改為下一條指令。該程序還使用前面提到的混淆對象名稱。在下圖中,研究人員在相關代碼行下方的注釋中添加了原始對象名稱。
在了解了混淆名稱和面向switch-case的編程之后,研究人員可以更好地分析這段代碼的目的。它使用硬編碼的整數數組,將其轉換為相關的ASCII字符并按隨機順序對其進行排序。稍后,這個數組將被連接到一個字符串,程序將搜索以該名稱定義的函數。如果未找到該函數,則執行流程將重新開始。
這表示腳本中存在另一種混淆技術。標準反混淆工具使用的關鍵特性之一是刪除未引用的函數和對象。通常,它有助于縮短代碼,省去永遠不會真正運行的復雜部分,刪除那些旨在誤導惡意軟件分析師的函數。但是,在這種情況下,使用反混淆工具會釋放一個必不可少的函數,如果沒有它,腳本將陷入無限循環。
在腳本執行過程中,h0QQ函數沒有被直接引用,甚至一次也沒有。然而,前面提到的使用隨機排序算法的代碼部分最終將嘗試執行它,因為h0QQ是0hQQ字符串的排列。如果h0QQ不存在,代碼將簡單地嘗試對字符進行排序,并反復查找函數名。

未引用的關鍵函數的示例
這個函數返回一個長字符串,通過一個硬編碼的鍵進行異或,然后拆分成一個字符串數組。

包含惡意軟件使用的字符串的deXORed數組示例
惡意軟件最終使用這些字符串來解碼其惡意代碼。它引用此數組中相關索引處的字符串,而不是在代碼中硬編碼字符串名稱。

惡意軟件使用接觸異或數組解碼其最終有效載荷的示例,該惡意軟件不使用整數作為數組的索引,而是將字符串與算術運算結合使用。
在使用調試器執行初始化代碼后,研究人員導出了提到的列表成員。然后研究人員使用Python腳本對JavaScript代碼的其余部分進行去混淆處理。

用于反混淆background.js的腳本