近期,火絨工程師在日常關注安全動態(tài)時發(fā)現(xiàn),Lumma Stealer 木馬家族會利用 Go 語言編寫注入器,通過 AES 解密創(chuàng)建傀儡進程并注入惡意代碼竊取用戶信息,其中惡意代碼經過控制流混淆、常量加密以及手動調用系統(tǒng)調用號等方式使代碼復雜度提高,更難以破解。分析發(fā)現(xiàn)該樣本會利用 Steam 賬戶名稱、動態(tài)獲取遠程服務器域名,根據(jù)下載的 JSON 配置竊取相應應用程序數(shù)據(jù),例如瀏覽器數(shù)據(jù)等,此外還會竊取郵箱、Steam、Discord、TXT 文件等數(shù)據(jù)。目前,火絨安全產品可對上述竊密木馬進行攔截查殺,請廣大用戶及時更新病毒庫以提高防御能力。(文末有彩蛋掉落)
查殺圖
Lumma Stealer 是一種商業(yè)竊密木馬,該木馬于 2023 年開始在論壇上公開售賣。從 Hack Forums 論壇這篇帖子上可以發(fā)現(xiàn)該木馬更新頻率高,可對某些失效的竊密手段進行及時修補,且會經常更新代碼混淆器,進行免殺。
售賣帖
樣本執(zhí)行流程如下所示:
流程圖
樣本分析
該樣本以 Go 為注入器,注入步驟主要由解密 Lumma Stealer ShellCode、創(chuàng)建傀儡進程、注入 Lumma Stealer ShellCode 組成。
解密秘鑰的來源
解密 Demo 如下:
解密 Demo
遍歷文件并判斷文件名后綴
創(chuàng)建進程
分配內存
修改 EIP
寫入 ShellCode
恢復線程執(zhí)行
竊密模塊
準備階段
PEB 地址獲取
隨后遍歷導出表中的函數(shù),獲取函數(shù)名計算其哈希值。然后將以 Nt 開頭的函數(shù)名哈希值和對應的系統(tǒng)調用號存入內存,以便之后通過函數(shù)名哈希值查找系統(tǒng)調用號,并通過 Wow64Transition 手動調用系統(tǒng)調用。
獲取函數(shù)名哈希值和調用號
函數(shù)名哈希值與系統(tǒng)調用號內存布局
函數(shù)調用邏輯
之后利用上述調用系統(tǒng)調用的方法調用 NtOpenSection 獲取 \KnownDlls32\ntdll.dll 句柄,然后調用 NtMapViewOfSection 函數(shù)將文件數(shù)據(jù)映射到內存中。再次重復將函數(shù)名哈希值和系統(tǒng)調用號寫入內存的操作,推測這一步是為了防止安全軟件修改過進程啟動時加載的 ntdll.dll,所以選擇以內存共享區(qū)域中的 \KnownDlls32\ntdll.dll 為標準再次獲取系統(tǒng)調用號。
打開 \KnownDlls32\ntdll.dll 內存映射句柄
利用 NtSetInformationProcess 傳遞 ProcessInstrumentationCallback 參數(shù)設置回調為空,用于防止被安全軟件檢測到樣本的系統(tǒng)調用。
調用 NtSetInformationProcess
沙箱列表
以下是上述檢測沙箱時會用到的模塊名哈希算法,第一個參數(shù)是模塊名,第二個參數(shù)會傳入固定值 0x18D40B1A。
計算模塊名哈希值
不支持警告
下載配置信息并開始竊密
動態(tài)獲取函數(shù)地址
獲取遠程服務流程
Steam 名稱
Steam 名稱 URL 解密代碼
下載配置信息并利用:
樣本通過 POST 請求向 https://sergei-esenin.com/api 發(fā)送數(shù)據(jù),請求參數(shù)包括 act=recive_message(用于指定服務器行為)、ver=4.0(版本)、lid=xAeOdp--mainteam 與 j=15f7911c5c73e2c263a9b433eb55ff31。服務器響應返回加密的 JSON 配置數(shù)據(jù),包含需要竊取的應用程序配置信息。之后對返回的加密數(shù)據(jù)進行 Base64 解碼,隨后通過異或運算與位運算的組合還原解密出 JSON 配置。
JSON 數(shù)據(jù)解密算法
可以看出 JSON 數(shù)據(jù)中包含重要文件、比特幣錢包、瀏覽器配置信息,密碼數(shù)據(jù)庫等,該木馬會按照該配置中的路徑獲取文件,最后會打包成壓縮文件并發(fā)送到服務器中。
部分 JSON 配置信息
下圖是其中一個 Chrome 用戶信息的壓縮包:
壓縮包
如果解析 JSON 數(shù)據(jù)時獲取 se 的值為 true 則會截屏發(fā)送當前畫面。
截屏邏輯
獲取郵件文件:
壓縮包
下圖是利用通配符遍歷 *.eml 文件并壓縮到 Mails/Windows10Mail 的函數(shù)調用圖。
函數(shù)調用圖
獲取 Outlook:
遍歷 HKEY_USERS 注冊表,并從中檢測以下注冊表路徑:
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
獲取 ThunderBird 文件:
key4.db(賬戶密碼) cert9.db(數(shù)字證書) formhistory.sqlite(歷史記錄) cookies.sqlite(cookie) logins.json(登錄憑據(jù)) places.sqlite(書簽)
壓縮包
獲取 Steam Token:
壓縮包和 Tokens.txt
獲取 Steam Token 的流程與 2024 年 4 月火絨安全實驗室發(fā)布的《竊密木馬借"壁紙引擎"傳播,Steam "再中招"》文章中提到的盜取 Token 邏輯相同,具體細節(jié)可查看往期分析報告。
獲取 Discord Token:
%AppData%\Discord(穩(wěn)定版本) %AppData%\DiscordCanary(測試版本) %AppData%\DiscordPTB(介于中間的版本)
獲取 NotePad++ TXT 文件:
壓縮包
獲取已安裝列表:
壓縮包和 Software.txt
獲取進程列表:
壓縮包和 Processes.txt
獲取系統(tǒng)信息:
Path:通過 fs:[30] 獲取 PEB,通過偏移 PEB->ProcessParameters->ImagePathName.Buffer 獲取當前進程路徑 OS Version/Local Date/Time Zone/Install Date:通過 WMI 命名空間 ROOT\CIMV2,使用 WQL 查詢 SELECT * FROM Win32_OperatingSystem,分別獲取 Caption(版本名)、LocalDateTime(時間)、CurrentTimeZone(時區(qū))、InstallDate(安裝時間) 位數(shù):mov eax, cs 判斷 Elevated:NtQueryInformationToken 傳入?yún)?shù) TokenElevation 獲取是否已提權 Computer:GetComputerNameA 獲取計算機名 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(序列號),再經過計算獲得 RAM Size:GetPhysicallyInstalledSystemMemory 獲取物理內存大小 CPU 相關:通過 cpuid 獲取 GPU:EnumDisplayDevicesW 獲取設備信息 Display resolution:EnumDisplaySettingsW 獲取分辨率
系統(tǒng)信息
獲取剪切板數(shù)據(jù):
利用 GetClipboardData 獲取當前剪切板數(shù)據(jù),將數(shù)據(jù)寫入到 Clipboard.txt 文件后壓縮。