深入分析BundleBot新型惡意軟件
Check Point Research (CPR)對被稱為BundleBot的新型惡意軟件進(jìn)行了深入分析發(fā)現(xiàn),BundleBot濫用dotnet bundle(單文件),這是一種自包含的格式,可以很好繞過靜態(tài)檢測。它會偽裝成常規(guī)實(shí)用程序,人工智能工具和游戲。通常通過Facebook廣告和受攻擊帳戶傳播。
詳細(xì)分析
在過去的幾個月里,BYOS公司一直在監(jiān)控一個新的未知的竊取程序,研究人員稱之為BundleBot,他們發(fā)現(xiàn)其傳播并濫用dotnet bundle(單文件),自包含格式。從.net core 3.0+到dotnet8+,這種形式的dotnet編譯已經(jīng)支持了大約四年,并且已經(jīng)有一些已知的惡意軟件家族濫用它,例如Ducktail。
使用這種特定dotnet格式的BundleBot主要是濫用Facebook廣告和受攻擊帳戶,利用dotnet bundle(單文件)、自包含格式、多階段攻擊和自定義混淆。
dotnet bundle(單文件)、自包含的格式通常會導(dǎo)致整個dotnet運(yùn)行時出現(xiàn)非常大的二進(jìn)制文件。此外,分析和調(diào)試這樣的文件可能會導(dǎo)致一些問題,特別是如果這樣的文件受到一些混淆的影響。
本文主要深入分析BundleBot的攻擊方式,重點(diǎn)對dotnet bundle(單文件)、自包含格式進(jìn)行分析。
發(fā)現(xiàn)過程
自.NET Core 3.0(2019)發(fā)布以來,可以將.NET程序集部署為單個二進(jìn)制文件。這些文件是不包含傳統(tǒng).NET元數(shù)據(jù)標(biāo)頭的可執(zhí)行文件,并通過特定于平臺的應(yīng)用程序主機(jī)引導(dǎo)程序在底層操作系統(tǒng)上本地運(yùn)行。
dotnet bundle(單文件),自包含格式是一種編譯形式,可以生成一個不需要在操作系統(tǒng)上預(yù)裝特定Dotnet運(yùn)行時版本的可執(zhí)行二進(jìn)制文件??蓤?zhí)行文件實(shí)際上是一個本地托管二進(jìn)制文件,在其覆蓋中包含整個dotnet運(yùn)行時、程序集和其他依賴項(xiàng),因此它很大,約幾十MB。本機(jī)托管二進(jìn)制文件負(fù)責(zé)從覆蓋中提?。ㄔ趫?zhí)行時)所有內(nèi)容,加載dotnet運(yùn)行時和程序集,準(zhǔn)備所有內(nèi)容,并將執(zhí)行轉(zhuǎn)移到.NET模塊的入口點(diǎn)。
當(dāng)涉及到從覆蓋中提取程序集時(在執(zhí)行時),我們可以根據(jù)用于編譯特定應(yīng)用程序的目標(biāo)dotnet版本來處理不同的例程。dotnet版本之間的區(qū)別在于,在dotnet5+(.NET Core 3.0+)之前,默認(rèn)情況下,所有程序集都被提取到磁盤(臨時目錄)并加載到進(jìn)程內(nèi)存中。
另一方面,在dotnet5+版本中,覆蓋層中的所有程序集都被提取并直接加載到進(jìn)程內(nèi)存中(沒有文件被釋放在磁盤上,則只有本地庫)。在dotnet5+中,可以在編譯期間指定提取,但默認(rèn)設(shè)置是直接被提取到內(nèi)存中的。
盡管研究人員仍在處理與dotnet相關(guān)的應(yīng)用程序,但上述對這種特定文件格式的描述清楚地表明,需要使用不同的工具集和技術(shù)來正確分析它。
研究人員檢測到BundleBot濫用dotnet bundle(單文件),將其作為攻擊的最后階段,它與已經(jīng)被公布的幾個惡意活動有關(guān),很可能是由同一個組織發(fā)起的。
攻擊載體
在發(fā)現(xiàn)的示例中,最初的攻擊載體都是通過Facebook廣告或被攻擊的賬戶傳播的,攻擊程序偽裝成常規(guī)程序、人工智能工具和游戲。例如,Google AI、PDF Reader、Canva、Chaturbate、Smart Miner、超級馬里奧3D世界。由于BundleBot的功能之一是竊取Facebook賬戶信息,這些被盜的信息進(jìn)一步用于通過新受攻擊的賬戶傳播惡意軟件。
盡管如此,我們不能完全排除其他可能的傳播方式,因?yàn)槲覀儫o法通過相關(guān)的跟蹤信息獲得所有檢測到的樣本源鏈接。
一旦受害者被誘騙從釣魚網(wǎng)站下載假程序?qū)嵱贸绦?,第一階段下載程序以“RAR”形式發(fā)送。這些下載階段通常是在Dropbox或Google Drive等托管服務(wù)上。
下載的“RAR”文件包含一個獨(dú)立的dotnet bundle(單文件)格式的第一階段下載程序。在執(zhí)行第一階段后,第二階段以密碼保護(hù)的“ZIP”文件的形式下載,通常來自Google Drive等托管服務(wù)。第二階段的密碼在下載程序中進(jìn)行硬編碼,通常是以編碼的形式。
被提取和執(zhí)行的受密碼保護(hù)的“ZIP”文件的主要部分是BundleBot,它是dotnet bundle(單文件)、自包含格式和自定義混淆的組合。
下面是一個與虛假的實(shí)用程序“Google AI”有關(guān)的詳細(xì)攻擊鏈?zhǔn)纠鼈窝b成使用Google AI Bard的營銷工具:
1.來自受攻擊賬戶的Facebook廣告或Facebook帖子的釣魚網(wǎng)站https://marketingaigg[.]com/。
深入分析BundleBot新型惡意軟件
受攻擊賬戶的Facebook上的釣魚網(wǎng)站
2.釣魚網(wǎng)站https://marketingaigg[.]com/偽裝成營銷工具,使用Google Bard AI引導(dǎo)下載頁面https://googlebardai[.]wiki/Googleai。
導(dǎo)致下載階段的釣魚網(wǎng)站
3.URL https://googlebardai[.]wiki/Googleai正在從Dropbox托管服務(wù)。
下載“RAR”文件Google_AI.rar (SHA-256:
“dfa9f39ab29405475e3d110d9ac0cc21885760d07716595104db5e9e055c92a6”);4.Google_AI.rar包含GoogleAI.exe (SHA-256: " 5ac212ca8a5516e376e0af83788e2197690ba73c6b6bda3b646a22f0af94bf59 "), dotnet bundle(單個文件)和自包含的應(yīng)用程序;
5.GoogleAI.exe包含用作下載程序的GoogleAI.dll dotnet模塊(從https://drive.google[.]com/uc?id=1-mC5c7o_B1VuS6dbQeDAAqLuPbfAV58O&export=download&cnotallow=t, password=alex14206985alexjyjyjj下載受密碼保護(hù)的“ZIP”文件adsnew - 1.0.0.0 . ZIP);
6.解壓后的ADSNEW-1.0.0.3.zip (SHA-256: " 303c6d0cea77ae6343dda76ceabaefdd03cc80bd6e041d2b931e7f6d59ca3ef6 ")包含RiotClientServices.exe, dotnet bundle (單文件)以及自包含應(yīng)用程序。
7.RiotClientServices.exe作為最后階段服務(wù)和執(zhí)行,包含兩個惡意dotnet模塊RiotClientServices.dll,BundleBot,和libarysharing .dll ,他們是C2數(shù)據(jù)序列化程序。
自包含Dotnet Bundle 的分析
當(dāng)我們需要分析一個自包含的dotnet bundle(單文件)二進(jìn)制文件時,我們會遇到幾個問題。
第一個問題是,我們需要以某種方式提取所有二進(jìn)制文件,這些二進(jìn)制文件是上述包bundle覆蓋的一部分。這種提取將幫助我們靜態(tài)地調(diào)查每個文件,就像我們在處理普通的dotnet程序集時所做的那樣。盡管目前該做法還不太成熟,但是已經(jīng)有一些解決方案能夠充分分析dotnet bundle格式了,從而幫助我們進(jìn)行提取。我們基于GUI的工具和庫,以編程的方式實(shí)現(xiàn)這一點(diǎn)。值得注意的是,目前dnSpy/dnSpyEx不支持提取dotnet bundle文件。
可以幫助提取的最可靠的基于GUI的工具包括:
ILSpy:開源.NET程序集瀏覽器和反編譯器;
dotPeek:免費(fèi)的.NET反編譯器和程序集瀏覽器;
ILSpy中dotnet bundle的提取:
ILSpy中的dotnet bundle提取
dotPeek中dotnet bundle的提?。?/p>
dotPeek中dotnet bundle的提取
如上所述,dotnet bundle文件的提取也可以通過編程的方式完成。當(dāng)我們處理較大的文件集時,這種方法非常方便。
為此,最合適的解決方案是使用AsmResolver。AsmResolver是一個便攜式可執(zhí)行(PE)檢查庫,能夠讀取,修改和寫入可執(zhí)行文件,這包括.NET模塊以及本機(jī)映像。該庫仍然允許用戶訪問低級結(jié)構(gòu)。更重要的是,AsmResolver理解bundle文件格式,因此我們可以使用它來自動提取。
下面是使用AsmResolver和PowerShell提取bundle文件內(nèi)容的代碼示例。
深入分析BundleBot新型惡意軟件
現(xiàn)在,當(dāng)我們成功地提取了dotnet bundle文件的全部內(nèi)容時,就可以使用通常用來檢查普通dotnet程序集的任何工具,比如dnSpyEx。這將允許我們靜態(tài)地調(diào)查每個.net程序集。
dnSpyEx中dotnet程序集的靜態(tài)分析
由于dotnet程序集,特別是惡意程序集,通常非常復(fù)雜,并且經(jīng)常受到一些混淆或保護(hù)的影響,大多數(shù)研究人員傾向于將靜態(tài)和動態(tài)分析方法結(jié)合起來。關(guān)于動態(tài)方法,我們使用一個自包含的dotnet bundle(單文件)二進(jìn)制調(diào)試來接近第二個問題。
在托管調(diào)試器(如dnSpyEx)中調(diào)試dotnet程序集是常用的一種方法。dnSpyEx中的調(diào)試不完全支持自包含的dotnet bundle二進(jìn)制文件,如果試圖調(diào)試此類文件,可能會導(dǎo)致如下所示的類似異常。
調(diào)試自包含dotnet bundle時拋出的DnSpyEx異常
幸運(yùn)的是,最近發(fā)布的dnSpyEx版本(v6.4.0)改進(jìn)了對這類文件的調(diào)試,因此我們應(yīng)該不會再遇到這種異常,調(diào)試可以順利進(jìn)行。
盡管我們可以在最新版本的dnSpyEx (v6.4.0)中調(diào)試自包含的dotnet bundle文件,但它無法解決作為dotnet bundle混淆的dotnet程序集的處理問題。
當(dāng)dotnet二進(jìn)制文件被編譯為一個自包含的包時,這僅僅意味著整個依賴項(xiàng)(尤其是dotnet運(yùn)行時)是生成的應(yīng)用程序的一部分,并且這樣的應(yīng)用程序通過其配置文件被配置為使用它們。這些配置文件是在提取包和去混淆每個受保護(hù)程序集之后影響調(diào)試的主要問題。
為了解決這個問題,我們實(shí)際上可以將自包含的dotnet bundle文件轉(zhuǎn)換為非自包含的、非單文件的.NET程序。通過這種方式轉(zhuǎn)換的程序?qū)⒈徽T騙使用dotnet運(yùn)行時,這是操作系統(tǒng)的一部分,所以我們必須確保安裝了它。
轉(zhuǎn)換步驟如下:
1.如上所示,提取dotnet bundle文件的內(nèi)容;
2.查找要在操作系統(tǒng)中安裝的dotnet運(yùn)行時版本并進(jìn)行安裝。為了快速查找我們的.NET應(yīng)用程序所依賴和需要安裝的具體dotnet運(yùn)行時的版本信息,我們可以定位并檢查配置文件*[appname].runtimeconfig.json*和*[appname].deps.json*,它們應(yīng)該在之前提取的內(nèi)容中。
在下面的示例中,我們可以清楚地看到,需要安裝 .NET Runtime 5.0.17, x86。
配置文件
需要安裝的dotnet運(yùn)行時版本(Microsoft)
3.修改配置文件*[appname].runtimeconfig.json*和*[appname].deps.json*的內(nèi)容。通過修改這些文件,我們將應(yīng)用程序轉(zhuǎn)換為非自包含的、非單文件的.NET程序,并強(qiáng)制它使用已安裝的dotnet運(yùn)行時版本。
修改*[appname]. runtimeeconfig .json*,將" includedFrameworks "字符串改為" frameworks "。
修改“[appname].runtimeconfig.json”
通過刪除來自“l(fā)ibraries”的“runtimepack”條目來修改*[appname].deps.json*。
修改“[appname]. depth .json”
4.運(yùn)行和調(diào)試。自包含的dotnet bundle應(yīng)用程序可以依賴于本機(jī)庫,這些庫可能是bundle的一部分,所以我們已經(jīng)從內(nèi)容中提取了它們,或者它們可以與bundle可執(zhí)行文件一起單獨(dú)提供。通過檢查配置文件或運(yùn)行配置文件,我們可以快速發(fā)現(xiàn)應(yīng)用程序是否有這樣的依賴關(guān)系(在*[appname].deps.json*中定義),如下所示。
深入分析BundleBot新型惡意軟件
運(yùn)行提取的bundle應(yīng)用程序時出現(xiàn)依賴關(guān)系相關(guān)錯誤要解決這個問題,只需將bundle應(yīng)用程序旁邊的所有依賴項(xiàng)復(fù)制到先前提取內(nèi)容的位置?,F(xiàn)在,調(diào)試應(yīng)該像使用安裝在操作系統(tǒng)中的dotnet運(yùn)行時的普通.NET應(yīng)用程序一樣運(yùn)行了。
深入分析BundleBot新型惡意軟件
在dnSpyEx中調(diào)試轉(zhuǎn)換的非自包含、非單文件的.NET應(yīng)用程序
如果我們不處理作為dotnet bundle一部分的混淆的dotnet程序集,則不需要像上面那樣,因?yàn)槭褂米钚掳姹镜膁nSpyEx (v6.4.0)可以直接調(diào)試它們。盡管如此,當(dāng)我們處理混淆的程序集并傾向于以去混淆的形式調(diào)試它們時,仍然需要上面的操作方法。
如上所述,我們介紹了一種將自包含的dotnet bundle文件轉(zhuǎn)換為普通的dotnet程序集的通用方法,這取決于目標(biāo)操作系統(tǒng)上預(yù)安裝的適當(dāng)版本的dotnet運(yùn)行時。這種方法應(yīng)該適用于不同的操作系統(tǒng)平臺(Windows、Linux、macOS)。
了解了如何提取自包含的dotnet bundle文件的內(nèi)容以及如何對其進(jìn)行調(diào)試后,我們就可以繼續(xù)進(jìn)行分析了。
技術(shù)分析
自帶的dotnet bundle格式,可加強(qiáng)分析和靜態(tài)檢測;
受簡單但有效的自定義模糊處理的影響;
濫用密碼保護(hù)的文件來進(jìn)行最后階段的傳播;
最后階段是一個新的竊取程序BundleBot;
用于C2通信的自定義homebrew分組數(shù)據(jù)序列化。
下載程序技術(shù)分析
下載階段的分析,請使用GoogleAI.exe示例SHA-256:“5ac212ca8a5516e376e0af83788e2197690ba73c6b6bda3b646a22f0af94bf59”。
此示例是一個32位自包含的dotnet bundle應(yīng)用程序(.NET Core 3.0.3),其最初是RAR文件的一部分。提取該捆綁包后,主模塊GoogleAI.dll是一個下載程序,受簡單的自定義混淆影響,只有字符串和名稱(無意義的泰語文本)。
受簡單自定義混淆影響的下載程序
下載程序的PDB路徑:D:\BOT\RAT\RAT 4.0版\HashCode\BOT ADS Server 4\ClientDowload FB\ClientDowload\obj\Debug\netcoreapp3.0\win-x86\GoogleAI.PDB。
去混淆之后,主要功能駐留在名為ProcessMain的函數(shù)中。
下載程序的主要功能
其主要功能可以概括如下:
1.單例檢查;
2.下載使用隨機(jī)名稱和“.rar”擴(kuò)展名保存的受密碼保護(hù)的ZIP文件;
3.從https://drive.google[.]com/uc?id=1-mC5c7o_B1VuS6dbQeDAAqLuPbfAV58O&export=download&cnotallow=t下載文件;
4.將下載的文件屬性設(shè)置為“隱藏”;
5.將下載文件的內(nèi)容提取到新創(chuàng)建的文件夾C:\Users\User\Documents\{random},密碼:alex14206985alexjyjyjj;
6.將新創(chuàng)建的文件夾和其中所有“.exe”文件的屬性設(shè)置為“隱藏”;
7.刪除下載的文件;
BundleBot以自包含的dotnet bundle文件的形式出現(xiàn),是下載的受密碼保護(hù)文件的主要部分,并由下載程序執(zhí)行。值得注意的是,所有分析的下載程序都包含相同的硬編碼密碼alex14206985alexjyjyjj(明文或base64編碼)來開始下一階段地提取。
BundleBot技術(shù)分析
對BundleBot階段的分析,使用了示例RiotClientServices.exe,SHA-256:“6552a05a4ea87494e80d0654f872f980cf19e46b4a99d5084f9ec3938a20db91”。
這個示例是一個32位的自包含dotnet bundle應(yīng)用程序(.NET 5.0.17),最初是受密碼保護(hù)的ZIP文件的一部分。在提取這個包之后,它的主要惡意組件是主模塊RiotClientServices.dll和庫librarysharing.dll。
程序集RiotClientServices.dll是一個新的自定義的竊取程序,它使用庫libarysharing .dll來處理和序列化作為惡意通信的一部分發(fā)送到C2的數(shù)據(jù)包數(shù)據(jù)。
這些二進(jìn)制文件受到類似的自定義混淆的影響,這些混淆主要集中在名稱混淆和用大量垃圾代碼填充這些dotnet模塊。這樣的混淆將導(dǎo)致大量的方法和類,這將使分析變得更加困難,并且需要創(chuàng)建自定義的去混淆器來簡化分析過程。
在去混淆之前,RiotClientServices.dll的大小約為11MB,包含26742個方法和902個類。在libarysharing .dll示例中,混淆導(dǎo)致二進(jìn)制大小約為10MB,包含32462個方法和9473個類。
“l(fā)ibrarysharing .dll”的模糊代碼:類“Serialize”
正因?yàn)槿绱?,我們快速設(shè)計了一個簡單的去混淆器,它適用于所有受類似自定義混淆影響的二進(jìn)制文件。這個去混淆器使用AsmResolver和PowerShell來清理垃圾代碼,并且仍然進(jìn)行調(diào)試。
深入分析BundleBot新型惡意軟件
去混淆后,我們可以將方法和類的大小、數(shù)量減少到:
1.RiotClientServices.dll大小≈124KB, 158個方法,35個類;
2.LirarySharing.dll大小≈30KB, 220個方法,28個類
“l(fā)ibrarysharing .dll”的去混淆代碼,類“Serialize”
可以使用de4dot工具進(jìn)一步清除名稱(方法、類等)的混淆。盡管如此,我們也不要忘記提供所有二進(jìn)制文件,為了保留調(diào)試,主模塊正在引用和使用庫。
“l(fā)ibarysharing .dll”混淆前后比對
去混淆后,BundleBot的主邏輯可以在模塊RiotClientServices.dll中看到:
“RiotClientServices.dll”模塊中BundleBot的主邏輯
其主要功能可以概括如下:
1.Sleep補(bǔ)丁檢測(反沙盒);
2.通過注冊表路徑HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, value ApplicationName安裝/卸載持久性軟件;
3.信息竊??;
4.C2 BOT通信(TCP套接字與C2 IP 51.79.180.158,端口5505通信)
被盜和泄露的數(shù)據(jù):
1.Telegram數(shù)據(jù);
2.Discord token;
3.計算機(jī)信息。 HWID(根據(jù)操作系統(tǒng)驅(qū)動器的CPU計數(shù)、用戶名、機(jī)器名、操作系統(tǒng)版本和TotalSize計算的MD5的前10個字節(jié)),Windows版本,用戶名,Windows系統(tǒng)所在的國家,IP信息(IP地址,國家,地區(qū),城市,時區(qū),ISP) -通過服務(wù)http://icanhazip[.]com和http://ip-api[.]com/json/檢索;
4.Web瀏覽器數(shù)據(jù)(Chrome、Edge、Opera、Brave、Coccoc、Firefox):配置文件名稱、解密密鑰、憑據(jù)cookie、密碼、書簽、擴(kuò)展名、信用卡;
5.Facebook帳戶: uid,名稱,cookie, access_token,頁面,廣告帳戶信息,業(yè)務(wù)信息,瀏覽器名稱,瀏覽器配置文件名稱;
6.捕獲屏幕截圖;
在libarysharing .dll庫的幫助下,所有被盜數(shù)據(jù)和C2通信都被處理、序列化和壓縮。這個庫定義了bot通信的主要功能如下:
1.Bot標(biāo)識:啟動TCP套接字,將被盜數(shù)據(jù)發(fā)送到C2(序列化,GZip壓縮);
2.Bot更新(使用新版本完成Bot的重新安裝);
3.Bot關(guān)閉(僅退出進(jìn)程);
4.Bot Kill(刪除持久性并退出進(jìn)程);
5.Bot重新更新標(biāo)識(竊取數(shù)據(jù)并發(fā)送給C2)
6.Bot獲取瀏覽器數(shù)據(jù)(收集web瀏覽器數(shù)據(jù)并發(fā)送給C2);
與Bot識別相關(guān)的網(wǎng)絡(luò)流量剖析示例:
與Bot識別相關(guān)的網(wǎng)絡(luò)流量剖析
值得注意的是,我們遇到了一個稍微不同的最終版本的BundleBot,它共享所有代碼,但除此之外,它還具有通過HTTPS將被盜數(shù)據(jù)泄露到C2的功能。我們分析的所有這些樣本都被配置為避免通過TCP使用bot通信,而只是被配置為將被盜數(shù)據(jù)泄露到URL為https://cp.bemilcoin[.]io/api/cookiePc?cookie的C2 web服務(wù)器。添加的代碼如下所示。
與向C2 web服務(wù)器泄露數(shù)據(jù)相關(guān)的代碼
被盜的數(shù)據(jù)以ZIP文件的形式泄露到C2 web服務(wù)器。
被竊取的數(shù)據(jù)以ZIP文件的形式泄露到C2 web服務(wù)器
由于我們能夠獲得這些特定版本的原始pdb文件,并且能夠確認(rèn)這個新功能產(chǎn)生的依賴項(xiàng),因此該功能不是由手動更改引起的,而更可能是作為最近添加的功能。
總結(jié)
通過對BundleBot幾個月的監(jiān)測,我們更深入地了解了它的攻擊載體,以及它是如何濫用dotnet bundle(單文件)的,這種自包含格式可以完美繞過靜態(tài)檢測。這種特定的文件格式和多階段攻擊相結(jié)合,在幾個月的時間里大肆傳播。
通過Facebook廣告和被攻擊的賬戶傳播已經(jīng)被攻擊者濫用了一段時間,但將其與公開的惡意軟件的功能(竊取受害者的Facebook賬戶信息)結(jié)合起來,可能會成為一種self-feeding程序。
我們在本文中介紹了如何濫用dotnet bundle(單文件)、自包含格式,并通過應(yīng)用自定義的混淆來進(jìn)一步強(qiáng)化分析。我們詳細(xì)介紹了幾種工具和技術(shù),盡可能完整地分析類似的攻擊。
本文翻譯自:https://research.checkpoint.com/2023/byos-bundle-your-own-stealer/如若轉(zhuǎn)載,請注明原文地址