最新国产福利在线_午夜国产日韩欧美一区_国产精品青青在线观看爽_日本免费自拍亚洲_亚洲第一无码在线观看_色噜噜狠狠爱综合视频_亚洲av免费观看在新更新_久久久免费观成人影院_别揉我奶头~嗯~啊~少妇视频_福利视频一区二区牛牛

新聞資訊
行業(yè)動(dòng)態(tài)

首頁 > 行業(yè)動(dòng)態(tài)

火絨華南銷售及服務(wù)中心| 【火絨安全周報(bào)】Go語言下的“偽裝者”如何實(shí)現(xiàn)悄無聲息地隱私盜竊

近期,火絨工程師在日常關(guān)注安全動(dòng)態(tài)時(shí)發(fā)現(xiàn),Lumma Stealer 木馬家族會(huì)利用 Go 語言編寫注入器,通過 AES 解密創(chuàng)建傀儡進(jìn)程并注入惡意代碼竊取用戶信息,其中惡意代碼經(jīng)過控制流混淆、常量加密以及手動(dòng)調(diào)用系統(tǒng)調(diào)用號(hào)等方式使代碼復(fù)雜度提高,更難以破解。分析發(fā)現(xiàn)該樣本會(huì)利用 Steam 賬戶名稱、動(dòng)態(tài)獲取遠(yuǎn)程服務(wù)器域名,根據(jù)下載的 JSON 配置竊取相應(yīng)應(yīng)用程序數(shù)據(jù),例如瀏覽器數(shù)據(jù)等,此外還會(huì)竊取郵箱、Steam、Discord、TXT 文件等數(shù)據(jù)。目前,火絨安全產(chǎn)品可對(duì)上述竊密木馬進(jìn)行攔截查殺,請(qǐng)廣大用戶及時(shí)更新病毒庫(kù)以提高防御能力。(文末有彩蛋掉落)

圖片

查殺圖

  

Lumma Stealer 是一種商業(yè)竊密木馬,該木馬于 2023 年開始在論壇上公開售賣。從 Hack Forums 論壇這篇帖子上可以發(fā)現(xiàn)該木馬更新頻率高,可對(duì)某些失效的竊密手段進(jìn)行及時(shí)修補(bǔ),且會(huì)經(jīng)常更新代碼混淆器,進(jìn)行免殺。

圖片

售賣帖


樣本執(zhí)行流程如下所示:

圖片

流程圖




樣本分析

該樣本以 Go 為注入器,注入步驟主要由解密 Lumma Stealer ShellCode、創(chuàng)建傀儡進(jìn)程、注入 Lumma Stealer ShellCode 組成。


注入模塊
解密 Lumma Stealer 數(shù)據(jù):
將字符串 a2f045451b2c742c6e17d6d046804e73 進(jìn)行 MD5 計(jì)算,得出 AES 密鑰 48901d3cdcfd61d216a912a7bd4a17a7,使用該密鑰對(duì)長(zhǎng)度為 310300 的數(shù)據(jù)進(jìn)行解密。解密過程使用了 Go 標(biāo)準(zhǔn)庫(kù)中的 crypto/cipher 和 crypto/aes,最終獲得 Lumma Stealer 的數(shù)據(jù)。

圖片

解密秘鑰的來源


解密 Demo 如下:

圖片

解密 Demo


創(chuàng)建傀儡進(jìn)程:
利用庫(kù)函數(shù) path/filepath.Walk 遍歷 C:\Windows\ 目錄,遍歷過程中通過檢查文件后綴名找到第一個(gè)以 .exe 為結(jié)尾的文件后,使用 CreateProcessW 創(chuàng)建進(jìn)程。

圖片

遍歷文件并判斷文件名后綴

圖片

創(chuàng)建進(jìn)程


注入代碼:
隨后在創(chuàng)建的進(jìn)程中調(diào)用 VirtualAllocEx 函數(shù)分配可讀、可寫、可執(zhí)行的內(nèi)存,調(diào)用 NtSetContextThread 函數(shù)指定 EIP 為 ShellCode 入口點(diǎn),調(diào)用 NtWriteVirtualMemory 函數(shù)寫入 ShellCode,最后調(diào)用 NtResumeThread 函數(shù)使線程繼續(xù)執(zhí)行,從而執(zhí)行 ShellCode 代碼。

圖片

分配內(nèi)存

圖片

修改 EIP

圖片

寫入 ShellCode

圖片

恢復(fù)線程執(zhí)行


竊密模塊

竊密模塊分為以下階段:
準(zhǔn)備階段:準(zhǔn)備哈希/調(diào)用號(hào)表、檢測(cè)沙箱、檢測(cè)語言等操作。
通過配置竊取信息:從遠(yuǎn)程服務(wù)器下載 JSON 配置,通過動(dòng)態(tài)獲取到的規(guī)則竊取應(yīng)用程序敏感信息。
固定竊?。焊`取郵件、Outlook、ThunderBird、Steam、Discord、TXT 文件、剪切板、截屏、系統(tǒng)信息等數(shù)據(jù)。
自刪除:如果下載的 JSON 配置中鍵 "ad" 值為 true 時(shí)將會(huì)進(jìn)行自刪除,具體方法為 CreateProcessW 創(chuàng)建進(jìn)程 cmd.exe "start /min cmd.exe "/c timeout /t 3 /nobreak & del "當(dāng)前進(jìn)程路徑"。

準(zhǔn)備階段

通過 fs:[30] 獲取 PEB 地址,隨后遍歷模塊鏈表,通過比對(duì)模塊名獲取 ntdll.dll 的模塊基址。

圖片

PEB 地址獲取


隨后遍歷導(dǎo)出表中的函數(shù),獲取函數(shù)名計(jì)算其哈希值。然后將以 Nt 開頭的函數(shù)名哈希值和對(duì)應(yīng)的系統(tǒng)調(diào)用號(hào)存入內(nèi)存,以便之后通過函數(shù)名哈希值查找系統(tǒng)調(diào)用號(hào),并通過 Wow64Transition 手動(dòng)調(diào)用系統(tǒng)調(diào)用。

圖片

獲取函數(shù)名哈希值和調(diào)用號(hào)

圖片

函數(shù)名哈希值與系統(tǒng)調(diào)用號(hào)內(nèi)存布局

圖片

函數(shù)調(diào)用邏輯


之后利用上述調(diào)用系統(tǒng)調(diào)用的方法調(diào)用 NtOpenSection 獲取 \KnownDlls32\ntdll.dll 句柄,然后調(diào)用 NtMapViewOfSection 函數(shù)將文件數(shù)據(jù)映射到內(nèi)存中。再次重復(fù)將函數(shù)名哈希值和系統(tǒng)調(diào)用號(hào)寫入內(nèi)存的操作,推測(cè)這一步是為了防止安全軟件修改過進(jìn)程啟動(dòng)時(shí)加載的 ntdll.dll,所以選擇以內(nèi)存共享區(qū)域中的 \KnownDlls32\ntdll.dll 為標(biāo)準(zhǔn)再次獲取系統(tǒng)調(diào)用號(hào)。

圖片

打開 \KnownDlls32\ntdll.dll 內(nèi)存映射句柄


利用 NtSetInformationProcess 傳遞 ProcessInstrumentationCallback 參數(shù)設(shè)置回調(diào)為空,用于防止被安全軟件檢測(cè)到樣本的系統(tǒng)調(diào)用。

圖片

調(diào)用 NtSetInformationProcess


通過遍歷模塊名計(jì)算哈希值判斷是否在沙箱中,如果存在就會(huì)終止程序。
下圖是通過網(wǎng)上比較常見的沙箱會(huì)加載的模塊名計(jì)算比較得出的結(jié)果,其中一個(gè)沒有被識(shí)別到。

圖片

沙箱列表


以下是上述檢測(cè)沙箱時(shí)會(huì)用到的模塊名哈希算法,第一個(gè)參數(shù)是模塊名,第二個(gè)參數(shù)會(huì)傳入固定值 0x18D40B1A。

圖片

計(jì)算模塊名哈希值


還會(huì)通過調(diào)用 GetUserDefaultUILanguage 函數(shù)檢測(cè)語言,具體代碼為 0x419:俄羅斯。如果是俄羅斯語言則不會(huì)進(jìn)行竊密操作,如果不是則繼續(xù)。

圖片

不支持警告


下載配置信息并開始竊密

獲取遠(yuǎn)程服務(wù)器:
該樣本通過域名輪詢的方式,循環(huán)連接多個(gè)候選服務(wù)器,直到成功建立連接。如果所有候選服務(wù)器都無法連接,樣本會(huì)訪問 https://steamcommunity.com/profiles/76561199724331900,獲取頁面中的 HTML 數(shù)據(jù),使用 <span class="actual_persona_name"> 和 </span> 標(biāo)簽定位 Steam 賬號(hào)名稱。隨后通過提取的 Steam 賬號(hào)名稱解密出遠(yuǎn)程服務(wù)器域名,目前分析時(shí)解密出的域名為 sergei-esenin.com。
由于 Steam 賬號(hào)名稱可以隨時(shí)修改,木馬作者能夠通過動(dòng)態(tài)更新 Steam 名稱來控制和更新遠(yuǎn)程服務(wù)器的域名,從而保證樣本的遠(yuǎn)程服務(wù)器持續(xù)存活。

圖片

動(dòng)態(tài)獲取函數(shù)地址

圖片

獲取遠(yuǎn)程服務(wù)流程

圖片

Steam 名稱

圖片

Steam 名稱 URL 解密代碼


下載配置信息并利用:

樣本通過 POST 請(qǐng)求向 https://sergei-esenin.com/api 發(fā)送數(shù)據(jù),請(qǐng)求參數(shù)包括 act=recive_message(用于指定服務(wù)器行為)、ver=4.0(版本)、lid=xAeOdp--mainteam 與 j=15f7911c5c73e2c263a9b433eb55ff31。服務(wù)器響應(yīng)返回加密的 JSON 配置數(shù)據(jù),包含需要竊取的應(yīng)用程序配置信息。之后對(duì)返回的加密數(shù)據(jù)進(jìn)行 Base64 解碼,隨后通過異或運(yùn)算與位運(yùn)算的組合還原解密出 JSON 配置。

圖片

JSON 數(shù)據(jù)解密算法


可以看出 JSON 數(shù)據(jù)中包含重要文件、比特幣錢包、瀏覽器配置信息,密碼數(shù)據(jù)庫(kù)等,該木馬會(huì)按照該配置中的路徑獲取文件,最后會(huì)打包成壓縮文件并發(fā)送到服務(wù)器中。

圖片

部分 JSON 配置信息


下圖是其中一個(gè) Chrome 用戶信息的壓縮包:

圖片

壓縮包


如果解析 JSON 數(shù)據(jù)時(shí)獲取 se 的值為 true 則會(huì)截屏發(fā)送當(dāng)前畫面。

圖片

截屏邏輯


獲取郵件文件:

利用 RtlExpandEnvironmentStrings 展開 %LocalAppData%,查看該文件夾下的 Packages 文件夾是否存在。
如果存在則利用通配符 microsoft.windowscommunicationsapps* 遍歷文件夾,進(jìn)入該文件夾遞歸的遍歷 *.eml 郵件文件,最終將文件壓縮到 Windows10Mail 壓縮包中。
如果 Packages 文件夾不存在則會(huì)檢查 %LocalAppData%\Microsoft\Windows Mail\Local Folders 文件夾是否存在,如果存在則遍歷 *.eml 郵件文件,最終將文件壓縮到 Windows10MailAlternative 壓縮包中。

圖片

壓縮包


下圖是利用通配符遍歷 *.eml 文件并壓縮到 Mails/Windows10Mail 的函數(shù)調(diào)用圖。

圖片

函數(shù)調(diào)用圖


獲取 Outlook:

遍歷 HKEY_USERS 注冊(cè)表,并從中檢測(cè)以下注冊(cè)表路徑:

  • Microsoft\Windows Messaging Subsystem\Profiles\9375CFF0413111d3B88A00104B2A6676
  • Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676
  • Microsoft\Office\13.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676
  • Microsoft\Office\14.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676
  • Microsoft\Office\15.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676

從這些路徑中循環(huán)獲取 00000001 ~ 00000004 鍵中的值,最后將敏感信息寫入 Applications/Outlook/Profiles.txt 文件中壓縮。

獲取 ThunderBird 文件:

利用 RtlExpandEnvironmentStrings 展開 %AppData%\Thunderbird\Profiles,之后通過 NtQueryAttributesFile 查看該文件夾是否存在。如果存在則會(huì)利用通配符 * 遍歷所有文件夾,并從中獲取以下內(nèi)容:

  • key4.db(賬戶密碼)
  • cert9.db(數(shù)字證書)
  • formhistory.sqlite(歷史記錄)
  • cookies.sqlite(cookie)
  • logins.json(登錄憑據(jù))
  • places.sqlite(書簽)

最后寫入 Thunderbird 文件夾中并壓縮。

圖片

壓縮包


獲取 Steam Token:

通過上述遍歷進(jìn)程名的方法查看 steam.exe 是否存在,如果存在則利用 NtOpenProcess 打開進(jìn)程句柄并通過 NtReadVirtualMemory 讀取內(nèi)存查看是否存在 eyAidHlwIjogIkpXVCIsICJhbGciOiAiRWREU0EiIH0 字符串,如果有則獲取該 Token 并解密 Base64 提取出 "sub" 的值,相加保存到 Applications/Steam/Tokens.txt 壓縮。

圖片

壓縮包和 Tokens.txt


獲取 Steam Token 的流程與 2024 年 4 月火絨安全實(shí)驗(yàn)室發(fā)布的《竊密木馬借"壁紙引擎"傳播,Steam "再中招"》文章中提到的盜取 Token 邏輯相同,具體細(xì)節(jié)可查看往期分析報(bào)告。


獲取 Discord Token

Discord 有三種版本,分別對(duì)應(yīng)路徑:

  • %AppData%\Discord(穩(wěn)定版本)
  • %AppData%\DiscordCanary(測(cè)試版本)
  • %AppData%\DiscordPTB(介于中間的版本)

三者都會(huì)讀取 %AppData%\[DiscordName]\Local State 文件,獲取其中的 os_crypt.encrypted_key 并通過 Base64 解密,然后調(diào)用 CryptUnprotectData 函數(shù)解密后將數(shù)據(jù)寫入 [DiscordName]\dp.txt 文件并壓縮。

獲取 NotePad++ TXT 文件:

利用 RtlExpandEnvironmentStrings 展開 %AppData%\Notepad++\session.xml,利用 NtOpenFile 打開句柄,利用 NtQueryInformationFile 獲取文件大小,之后通過 NtReadFile 讀取文件內(nèi)容,從中讀取 filename=" 開頭和 " 結(jié)尾的 TXT 文件,并存儲(chǔ)到 Important Files/Notepad++/ 壓縮。

圖片

壓縮包


獲取已安裝列表:

利用 NtOpenKeyEx 打開注冊(cè)表句柄 \REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 并利用 NtQueryKey 獲取鍵的數(shù)量。
之后利用 NtEnumerateKey 遍歷注冊(cè)表,通過 NtQueryValueKey 獲取 DisplayName,最后寫入 Software.txt 并壓縮。

圖片

壓縮包和 Software.txt


獲取進(jìn)程列表:

利用 NtQuerySystemInformation 函數(shù)傳入?yún)?shù) SystemProcessInformation 獲取進(jìn)程信息,將進(jìn)程名寫入到 Processes.txt 中并壓縮。

圖片

壓縮包和 Processes.txt


獲取系統(tǒng)信息:

以下是獲取到的系統(tǒng)信息以及大致方法。

  • Path:通過 fs:[30] 獲取 PEB,通過偏移 PEB->ProcessParameters->ImagePathName.Buffer 獲取當(dāng)前進(jìn)程路徑
  • OS Version/Local Date/Time Zone/Install Date:通過 WMI 命名空間 ROOT\CIMV2,使用 WQL 查詢 SELECT * FROM Win32_OperatingSystem,分別獲取 Caption(版本名)、LocalDateTime(時(shí)間)、CurrentTimeZone(時(shí)區(qū))、InstallDate(安裝時(shí)間)
  • 位數(shù):mov eax, cs 判斷
  • Elevated:NtQueryInformationToken 傳入?yún)?shù) TokenElevation 獲取是否已提權(quán)
  • Computer:GetComputerNameA 獲取計(jì)算機(jī)名
  • User:GetUserNameA 獲取用戶名
  • Domain/Hostname/NetBIOS:GetComputerNameExA 分別傳入?yún)?shù) ComputerNamePhysicalDnsDomain/ComputerNamePhysicalDnsHostname/ComputerNamePhysicalNetBIOS
  • Language:GetUserDefaultLocaleName 獲取系統(tǒng)語言
  • Anti Virus:通過 WMI 命名空間 ROOT\SecurityCenter2,使用 WQL 查詢 SELECT * FROM AntiVirusProduct 獲取 displayName ( 防病毒軟件的名稱)
  • HWID:通過 WMI 命名空間 ROOT\SecurityCenter2,使用 WQL 查詢 SELECT * FROM Win32_BIOS 獲取 SerialNumber(序列號(hào)),再經(jīng)過計(jì)算獲得
  • RAM Size:GetPhysicallyInstalledSystemMemory 獲取物理內(nèi)存大小
  • CPU 相關(guān):通過 cpuid 獲取
  • GPU:EnumDisplayDevicesW 獲取設(shè)備信息
  • Display resolution:EnumDisplaySettingsW 獲取分辨率

下圖是包含了系統(tǒng)信息的 System.txt 文件,可以看出該 Lumma Stealer 是 2024 年 9 月 2 號(hào)編譯的。

圖片

系統(tǒng)信息


獲取剪切板數(shù)據(jù):

利用 GetClipboardData 獲取當(dāng)前剪切板數(shù)據(jù),將數(shù)據(jù)寫入到 Clipboard.txt 文件后壓縮。

圖片