伪装成《我的世界》模组的恶意软件瞄准游戏玩家
Check Point Research发现了一个针对《我的世界》用户的多阶段攻击活动,通过GitHub上的Stargazers Ghost Network分发恶意软件。该恶意软件冒充Oringo和Taunahi等“脚本和宏”工具(即作弊工具)。
关键点
- 第一阶段下载器和第二阶段窃取程序使用Java实现,要求主机安装《我的世界》。
- 第三阶段恶意软件是功能扩展的.NET窃取程序。
- 《我的世界》恶意软件使用Java编写,常被安全解决方案忽略。
- 恶意软件由俄语威胁行为者开发,包含多个俄语编写的工件。
介绍
《我的世界》是一款流行的视频游戏,拥有庞大的全球玩家基础,每月活跃玩家超过2亿。该游戏还售出了超过3亿份,使其成为有史以来最畅销的视频游戏之一。《我的世界》支持模组(用户创建的修改),通过改进游戏玩法、修复错误、增强图形和添加新内容来丰富用户体验。据估计,超过100万玩家积极参与《我的世界》的模组制作。
Check Point Research发现了通过Stargazers Ghost Network分发恶意软件的恶意存储库,该网络作为分发即服务(DaaS)运营。
这些活动导致针对《我的世界》用户的多阶段攻击链。恶意软件冒充Oringo和Taunahi,这些是“脚本和宏工具”(即作弊工具)。第一阶段和第二阶段都是用Java开发的,只有在主机上安装了《我的世界》运行时才能执行。
Stargazers Ghost Network活动
自2025年3月以来,Check Point Research一直在跟踪针对《我的世界》用户的恶意GitHub存储库,这些存储库使用未检测到的Java下载器。这些存储库据称提供《我的世界》的模组,并且由于多个账户为这些存储库加星标而显得合法。
图1:恶意存储库
存储库包含各种恶意jar文件,它们的名称通常冒充各种作弊和自动化工具。以下是发现的文件名:
|
|
图2:恶意发布
这个Java下载器在所有VirusTotal的反病毒引擎中均未被检测到,因为它高度针对《我的世界》用户,并且沙箱引擎不包含所需的依赖项,这将让恶意软件运行。
图3:VirusTotal检测
虽然我们对攻击者的信息知之甚少,但关于攻击者的提交有一件事是一致的,所有提交都是在UTC+3时区进行的,并且在一些恶意文件上发现的俄语评论进一步表明了可能的来源国。
|
|
恶意软件概述
感染链从一个托管的JAR存档开始,需要由受害者手动下载并安装为《我的世界》模组(“mod”是“modification”的缩写,是用户创建的原始版本的添加或更改。模组可以添加新功能、增强游戏玩法并自定义玩家体验。)。当受害者启动游戏时,恶意模组下载第二阶段窃取程序,该窃取程序又下载另一个.NET窃取程序。恶意软件由俄语威胁行为者开发,包含多个俄语编写的工件。
图4:感染链
第一部分 – 静态分析 – 第一阶段加载器
初始JAR文件设计为《我的世界》Forge模组。它在清单中没有Main-Class
属性,因此,从命令行运行“java -jar me.baikal.club
,参考了贝加尔湖,这是世界上最深的湖泊,位于俄罗斯的亚洲部分。
为了开发自定义模组,开发者必须遵循一定的结构并包含特定的依赖项。主要的@Mod
类包含对IFMLLoadingPlugin
的引用。FML字母代表Forge Mod Loader。
图5:加载器从《我的世界》Forge包导入类
加载器实现了简单的反VM和反分析技术。最初,加载器获取以下三个属性的名称(结果相当于调用“java -XshowSettings:properties -version”)。
- os.name
- java.vm.name
- java.vm.vendor
如果任何上述设置包含阻止列表关键字(与各种虚拟机相关),恶意软件(《我的世界》模组)会自行终止。这是阻止列表关键字列表:
|
|
然后,调用tasklist
实用程序列出所有正在运行的进程。如果检测到任何阻止列表进程,模组的执行将终止。这些进程与虚拟机(VBox、Parallels、VMware)、协议分析器(Wireshark、HTTP Debugger)和列出网络连接的程序(TCPView)相关联。
这是阻止列表进程列表:
|
|
通过之前的检查后,第一阶段下载Pastebin(hxxps://pastebin.com/raw/xCa3vSiP)的内容。Base64编码的内容被解码,恶意软件检索第二阶段的链接(hxxp://147.45.79.104/download)。下载器将名为MixinLoader-v2.4.jar
的Java窃取程序加载到内存中。
有趣的是,该粘贴是由用户名JoeBidenMama
创建的,该用户还创建了另外三个粘贴:
- Google statistics 3 (纯文本), hxxp://147.45.79[.]104/cookies
- Google statistics 2 (Base64编码), hxxp://147.45.79[.]104/download
- Google statistics (纯文本), hxxp://147.45.79[.]104
- Google statistics (纯文本), hxxp://147.45.79[.]104:80
Pastebin的“HITS”列显示粘贴被查看或下载的次数。这可以给我们一个粗略的上限估计,有多少受害者可能被针对或感染,因为每次运行受感染的插件时都会访问该粘贴。Check Point Research持续监控此账户,并发现了更多的活动和粘贴URL被添加,总点击次数超过1500。
图6:用户JoeBidenMama
创建的所有粘贴及其统计信息(HITS)
第二部分 – 动态分析 – 第一阶段加载器
要向《我的世界》游戏添加模组,用户必须将恶意JAR存档复制到《我的世界》的mods
文件夹中。启动游戏后,《我的世界》进程将加载文件夹中的所有模组,包括恶意模组,该模组将下载并执行第二阶段。
为了动态运行恶意软件,我们决定安装Legacy Launcher。需要《我的世界》Forge版本1.8.9,因为JAR存档中的mcmod.info
元数据显示我们的恶意插件需要此加载器。
图7:包含模组元数据的mcmod.info文件内容
因此,我们需要做的就是运行《我的世界》客户端并安装适当类型和版本的模组加载器。
图8:安装所需的模组加载器
安装完成后,我们可以将恶意JAR文件复制到mods目录(<installation_directory>\.tlauncher\legacy\Minecraft\game\mods\
)并进入游戏,这将激活我们的恶意模组。
在虚拟机中执行恶意JAR插件,我们可以注意到在恶意插件由于检测到虚拟环境而退出之前执行了tasklist
。为了演示目的,我们编辑了原始JAR模组以执行notepad
而不是tasklist
。运行这样的修改模组会执行Notepad,如下面的动画所示。
第三部分 – 第二阶段窃取程序
当加载器成功通过所有环境检查后,它会加载主要组件,即窃取程序。一些样本可能使用Skidfuscator
进行混淆。窃取程序的有趣类和方法如下所示。
图10:窃取程序中的类和方法列表
- Class Baikal – 一个实现预初始化阶段执行的操作的类
- method: init – 未实现
- method: preInit – 从Start类运行start()方法
- Class Start
- method: start
- 下载并运行.NET窃取程序
- 从checkip.amazonaws.com获取外部IP
- 窃取
- 《我的世界》令牌
- Feather客户端/启动器的accounts.json文件
- Essential客户端/启动器的microsoft_accounts.jcon文件
- Lunar客户端/启动器的accounts.json文件
- Discord令牌
- Telegram
- pizzaclient的令牌
- 用户名
- 玩家ID
- 硬编码的type值设置为b0.5,可能是窃取程序的版本
- 从Pastebin获取GET渗透URL(hxxps://pastebin[.]com/raw/C9QvUqi3)
- 以JSON格式POST被盗数据
- method: start
|
|
- Class SSHaccess – 负责下载和执行另一个文件(.NET窃取程序)的类,在第四部分中有更详细的分析。
- method: downloadFile
- method: runFile
- Class Discord – 负责窃取Discord令牌的类。列出
%APPDATA%/discord/Local Storage/leveldb
中的文件,读取扩展名为.ldb
的文件内容,搜索令牌。- method: stealDiscord
- Class HTTP – 实现GET和POST请求的辅助类
- method: fetchURL – GET请求
- method: post – POST请求
- Class Telegram – 负责窃取Telegram数据的类。找到Telegram的
tdata
文件夹,压缩它,并将其渗透出去。- method: execute
第四部分 – 第三阶段.NET窃取程序
SSHaccess类负责下载一个用.NET编写的附加窃取程序,并将其渗透到Discord webhook。Webhook是一种工具,允许外部服务或应用程序向特定的Discord频道发送消息、通知或数据,而无需登录机器人或用户账户。
|
|
去混淆后,我们可以观察到它从浏览器(Chromium、Edge、Firefox)、文件(桌面、文档、%USERPROFILE%/Source)、加密货币钱包(Armory、AtomicWallet、BitcoinCore、Bytecoin、DashCore、Electrum、Ethereum、LitecoinCore、Monero、Exodus、Zcash、Jaxx)、VPN(ProtonVPN、OpenVPN、NordVPN)、Steam、Discord、FileZilla、Telegram窃取各种凭证,以及收集有关受感染机器的信息,如运行进程、外部IP、剪贴板内容,并截取屏幕截图。
图11:窃取程序代码片段,包含自解释的类及其调用的方法列表
被盗数据被压缩,并与以下统计信息一起上传到Discord webhook,注释为俄语。
|
|
结论
一个新的基于Java的恶意软件下载器在很长一段时间内基本上未被检测到。伪装成《我的世界》模组,这些恶意的Java存档由于缺少依赖项而经常逃避沙箱分析。Stargazers Ghost Network一直在积极分发这种恶意软件,针对寻求模组以增强游戏体验的《我的世界》玩家。看似无害的下载实际上是基于Java的加载器,部署了两个额外的窃取程序,能够渗透凭证和其他敏感数据。
这些活动背后的威胁行为者很可能来自俄罗斯。这个案例突显了流行的游戏社区如何被利用作为恶意软件分发的有效载体,强调了下载第三方内容时谨慎的重要性。
防护措施
Check Point Threat Emulation和Harmony Endpoint提供全面的攻击策略、文件类型和操作系统覆盖,并保护免受本报告中描述的攻击和威胁。
入侵指标
描述 | SHA256 |
---|---|
stage 1 JAR | 05b143fd7061bdd317bd42c373c5352bec351a44fa849ded58236013126d2963 |
stage 1 JAR | 9ca41431df9445535b96a45529fce9f9a8b7f26c08ac8989a57787462da3342f |
stage 1 JAR | c5936514e05e8b1327f0df393f4d311afd080e5467062151951e94bbd7519703 |
stage 1 JAR | 9a678140ce41bdd8c02065908ee85935e8d01e2530069df42856a1d6c902bae1 |
stage 2 JAR | 4c8a6ad89c4218507e27ad6ef4ddadb6b507020c74691d02b986a252fb5dc612 |
stage 2 JAR | 51e423e8ab1eb49691d8500983f601989286f0552f444f342245197b74bc6fcf |
stage 2 JAR | 5d80105913e42efe58f4c325ac9b7c89857cc67e1dcab9d99f865a28ef084b37 |
stage 2 JAR | 97df45c790994bbe7ac1a2cf83d42791c9d832fa21b99c867f5b329e0cc63f64 |
stage 2 JAR | 4c944b07832d5c29e7b499d9dd17a3d71f0fd918ab68694d110cbb8523b8af49 |
stage 2 JAR | 5590eaa4f11a6ed4351bc983e47d9dfd91245b89f3108bfd8b7f86e40d00b9fa |
stage 2 DL URL | hxxp[://]147[.]45[.]79[.]104/download |
stage 2 DL URL | hxxp://негры[.]рф/MixinLoader-v2.4[.]jar |
stage 2 UL URL | hxxp[://]185[.]95[.]159[.]125/upload |
hosting domain | негры[.]рф |
stage 3 | 7aefd6442b09e37aa287400825f81b2ff896b9733328814fb7233978b104127f |
stage 3 | 886a694ee4be77242f501b20d37395e1a8a7a8f734f460cae269eb1309c5b196 |
stage 3 | a1dc479898f0798e40f63b9c1a7ee4649357abdc757c53d4a81448a5eea9169f |
stage 3 | a427eeb8eed4585f2d51b62528b8b4920e72002ab62eb6fc19289ebc2fba5660 |
stage 3 | f08086257c74b1de394bf150ad8aacc99ca5de57b4baa0974bc1b59bb973d355 |