近期,火绒工程师在日常关注安全动态时发现,Lumma Stealer 木马家族会利用 Go 语言编写注入器,通过 AES 解密创建傀儡进程并注入恶意代码窃取用户信息,其中恶意代码经过控制流混淆、常量加密以及手动调用系统调用号等方式使代码复杂度提高,更难以破解。分析发现该样本会利用 Steam 账户名称、动态获取远程服务器域名,根据下载的 JSON 配置窃取相应应用程序数据,例如浏览器数据等,此外还会窃取邮箱、Steam、Discord、TXT 文件等数据。目前,火绒安全产品可对上述窃密木马进行拦截查杀,请广大用户及时更新病毒库以提高防御能力。(文末有彩蛋掉落)
查杀图
Lumma Stealer 是一种商业窃密木马,该木马于 2023 年开始在论坛上公开售卖。从 Hack Forums 论坛这篇帖子上可以发现该木马更新频率高,可对某些失效的窃密手段进行及时修补,且会经常更新代码混淆器,进行免杀。
售卖帖
样本执行流程如下所示:
流程图
样本分析
该样本以 Go 为注入器,注入步骤主要由解密 Lumma Stealer ShellCode、创建傀儡进程、注入 Lumma Stealer ShellCode 组成。
解密秘钥的来源
解密 Demo 如下:
解密 Demo
遍历文件并判断文件名后缀
创建进程
分配内存
修改 EIP
写入 ShellCode
恢复线程执行
窃密模块
准备阶段
PEB 地址获取
随后遍历导出表中的函数,获取函数名计算其哈希值。然后将以 Nt 开头的函数名哈希值和对应的系统调用号存入内存,以便之后通过函数名哈希值查找系统调用号,并通过 Wow64Transition 手动调用系统调用。
获取函数名哈希值和调用号
函数名哈希值与系统调用号内存布局
函数调用逻辑
之后利用上述调用系统调用的方法调用 NtOpenSection 获取 KnownDlls32ntdll.dll 句柄,然后调用 NtMapViewOfSection 函数将文件数据映射到内存中。再次重复将函数名哈希值和系统调用号写入内存的操作,推测这一步是为了防止安全软件修改过进程启动时加载的 ntdll.dll,所以选择以内存共享区域中的 KnownDlls32ntdll.dll 为标准再次获取系统调用号。
打开 KnownDlls32ntdll.dll 内存映射句柄
利用 NtSetInformationProcess 传递 ProcessInstrumentationCallback 参数设置回调为空,用于防止被安全软件检测到样本的系统调用。
调用 NtSetInformationProcess
沙箱列表
以下是上述检测沙箱时会用到的模块名哈希算法,第一个参数是模块名,第二个参数会传入固定值 0x18D40B1A。
计算模块名哈希值
不支持警告
下载配置信息并开始窃密
动态获取函数地址
获取远程服务流程
Steam 名称
Steam 名称 URL 解密代码
下载配置信息并利用:
样本通过 POST 请求向 https://sergei-esenin.com/api 发送数据,请求参数包括 act=recive_message(用于指定服务器行为)、ver=4.0(版本)、lid=xAeOdp–mainteam 与 j=15f7911c5c73e2c263a9b433eb55ff31。服务器响应返回加密的 JSON 配置数据,包含需要窃取的应用程序配置信息。之后对返回的加密数据进行 Base64 解码,随后通过异或运算与位运算的组合还原解密出 JSON 配置。
JSON 数据解密算法
可以看出 JSON 数据中包含重要文件、比特币钱包、浏览器配置信息,密码数据库等,该木马会按照该配置中的路径获取文件,最后会打包成压缩文件并发送到服务器中。
部分 JSON 配置信息
下图是其中一个 Chrome 用户信息的压缩包:
压缩包
如果解析 JSON 数据时获取 se 的值为 true 则会截屏发送当前画面。
截屏逻辑
获取邮件文件:
压缩包
下图是利用通配符遍历 *.eml 文件并压缩到 Mails/Windows10Mail 的函数调用图。
函数调用图
获取 Outlook:
遍历 HKEY_USERS 注册表,并从中检测以下注册表路径:
-
MicrosoftWindows Messaging SubsystemProfiles9375CFF0413111d3B88A00104B2A6676 -
MicrosoftWindows NTCurrentVersionWindows Messaging SubsystemProfilesOutlook9375CFF0413111d3B88A00104B2A6676 -
MicrosoftOffice13.0OutlookProfilesOutlook9375CFF0413111d3B88A00104B2A6676 -
MicrosoftOffice14.0OutlookProfilesOutlook9375CFF0413111d3B88A00104B2A6676 -
MicrosoftOffice15.0OutlookProfilesOutlook9375CFF0413111d3B88A00104B2A6676
获取 ThunderBird 文件:
-
key4.db(账户密码) -
cert9.db(数字证书) -
formhistory.sqlite(历史记录) -
cookies.sqlite(cookie) -
logins.json(登录凭据) -
places.sqlite(书签)
压缩包
获取 Steam Token:
压缩包和 Tokens.txt
获取 Steam Token 的流程与 2024 年 4 月火绒安全实验室发布的《窃密木马借”壁纸引擎”传播,Steam “再中招”》文章中提到的盗取 Token 逻辑相同,具体细节可查看往期分析报告。
获取 Discord Token:
-
%AppData%Discord(稳定版本) -
%AppData%DiscordCanary(测试版本) -
%AppData%DiscordPTB(介于中间的版本)
获取 NotePad++ TXT 文件:
压缩包
获取已安装列表:
压缩包和 Software.txt
获取进程列表:
压缩包和 Processes.txt
获取系统信息:
-
Path:通过 fs:[30] 获取 PEB,通过偏移 PEB->ProcessParameters->ImagePathName.Buffer 获取当前进程路径 -
OS Version/Local Date/Time Zone/Install Date:通过 WMI 命名空间 ROOTCIMV2,使用 WQL 查询 SELECT * FROM Win32_OperatingSystem,分别获取 Caption(版本名)、LocalDateTime(时间)、CurrentTimeZone(时区)、InstallDate(安装时间) -
位数:mov eax, cs 判断 -
Elevated:NtQueryInformationToken 传入参数 TokenElevation 获取是否已提权 -
Computer:GetComputerNameA 获取计算机名 -
User:GetUserNameA 获取用户名 -
Domain/Hostname/NetBIOS:GetComputerNameExA 分别传入参数 ComputerNamePhysicalDnsDomain/ComputerNamePhysicalDnsHostname/ComputerNamePhysicalNetBIOS -
Language:GetUserDefaultLocaleName 获取系统语言 -
Anti Virus:通过 WMI 命名空间 ROOTSecurityCenter2,使用 WQL 查询 SELECT * FROM AntiVirusProduct 获取 displayName ( 防病毒软件的名称) -
HWID:通过 WMI 命名空间 ROOTSecurityCenter2,使用 WQL 查询 SELECT * FROM Win32_BIOS 获取 SerialNumber(序列号),再经过计算获得 -
RAM Size:GetPhysicallyInstalledSystemMemory 获取物理内存大小 -
CPU 相关:通过 cpuid 获取 -
GPU:EnumDisplayDevicesW 获取设备信息 -
Display resolution:EnumDisplaySettingsW 获取分辨率
系统信息
获取剪切板数据:
利用 GetClipboardData 获取当前剪切板数据,将数据写入到 Clipboard.txt 文件后压缩。
剪切板数据
简单来说,网络世界存在一个对你个人信息图谋不轨的“小偷”,盗窃木马Lumma Stealer就像是它的“偷窃工具”,这个“小偷”很狡猾,它用一种叫做Go语言的编程语言来充当自己的伪装工具,伪装“偷窃工具”的“合法身份”,并通过一些加密手法来隐藏工具的行踪,使得它难以被发现和抓住。同时“偷窃工具”会悄悄潜入你的电脑,偷看你的个人信息,比如你的邮箱、Steam账户、Discord账户,甚至包括你电脑里的TXT文件、剪切板、截屏等数据。它还会根据“小偷”的指令来决定要偷哪些数据。
但是别担心,目前火绒已经可以拦截和清除这种木马了。就像有警察保护我们不受“小偷”侵害一样,所以,记得更新你的火绒病毒库,守护你的电脑安全哦~
原文始发于微信公众号(火绒安全):Go语言下的“伪装者”如何实现悄无声息地隐私盗窃