99在线视频免费观看_欧美老妇变态按摩_国产 首页 综合_一本加勒比HEZYO熟女_亞洲成av人片在線觀看無_国产av无码专区亚洲版综合_伊人久久大线蕉色首页_91尤物在线精品无码中文_青青草大伊人大_最好看的2018中文字幕高清

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

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

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

近期,火絨工程師在日常關注安全動態(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 組成。


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

圖片

解密秘鑰的來源


解密 Demo 如下:

圖片

解密 Demo


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

圖片

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

圖片

創(chuàng)建進程


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

圖片

分配內存

圖片

修改 EIP

圖片

寫入 ShellCode

圖片

恢復線程執(zhí)行


竊密模塊

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

準備階段

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

圖片

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。

圖片

計算模塊名哈希值


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

圖片

不支持警告


下載配置信息并開始竊密

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

圖片

動態(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ā)送當前畫面。

圖片

截屏邏輯


獲取郵件文件:

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

圖片

壓縮包


下圖是利用通配符遍歷 *.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

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

獲取 ThunderBird 文件:

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

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

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

圖片

壓縮包


獲取 Steam Token:

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

圖片

壓縮包和 Tokens.txt


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


獲取 Discord Token

Discord 有三種版本,分別對應路徑:

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

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

獲取 NotePad++ TXT 文件:

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

圖片

壓縮包


獲取已安裝列表:

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

圖片

壓縮包和 Software.txt


獲取進程列表:

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

圖片

壓縮包和 Processes.txt


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

以下是獲取到的系統(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)信息的 System.txt 文件,可以看出該 Lumma Stealer 是 2024 年 9 月 2 號編譯的。

圖片

系統(tǒng)信息


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

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

圖片