Rhadamanthys 0.9.x - 全面解析更新内容
研究亮点
- Rhadamanthys是一款自2022年发布的多模块化信息窃取器,已被多个攻击组织用于各种攻击活动
- 最新版本0.9.2带来了可能影响检测的重要更新,需要研究人员更新分析工具
- Check Point Research提供了多个脚本来帮助防御者应对这些变化
- 本报告详细介绍了最新变化,并在恶意软件整体背景下进行了描述
引言
Check Point Research一直密切跟踪其发展,注意到持续的更新和定制选项。在之前的出版物中,我们以v0.5为例探索了其功能的广度、内部设计及其组件的执行流程。随着v0.9.x的发布,Rhadamanthys引入了一些破坏我们之前发布工具的变化,包括自定义格式转换器和字符串反混淆器。
网站改版
Rhadamanthys最初通过网络犯罪论坛的帖子进行推广,但很快作者就有了更雄心勃勃的计划来联系潜在客户并建立知名度。他们同时推出了Telegram支持频道、带有详细产品描述的Tor网站,并提供通过Tox进行通信。最近,网站进行了全面改版,呈现出精致专业的形象。运营商现在将自己品牌化为"RHAD security"和"Mythical Origin Labs"。
新网站展示了他们所有的产品,包括仍在开发中的产品的预告片。除了他们的旗舰窃取器Rhadamanthys之外,他们还宣传Elysium Proxy Bot和Crypt Service。版本更新也被列出,不过这部分并不总是与实际发布保持同步。
与之前一样,Rhadamanthys提供分层套餐:从每月299美元的自托管版本,到每月499美元的租用服务器和额外福利版本。还提供特殊的企业层级,价格单独协商。
公告:0.9.x
版本0.9于2025年2月发布公告,随后是0.9.1和0.9.2更新。然而官方网站仍然只列出0.9.1。其变更日志包括一长串更新:
v0.9.1 (2025-05-18)
- 重新设计数据库操作流程,分离读写操作。确保数据写入完整性
- 用户管理权限级别,引入新的worker、traffic merchant,移除observer模式
- 优化文件打包和导出到目录时的CPU使用。显著减少日志打包导出速度
- TOR移除随机地址生成,固定地址永久有效
- 管理登录添加2FA OTP登录验证
- 客户端和任务插件,在整个过程中引入内存互斥体,抑制同一机器上多次执行发送重复数据
- 客户端加载引入跟踪系统,可与用户的加载程序接口。程序启动和数据收集工作将触发WEBHOOK回调
- 生成客户端文件时,直接从列表中选择标签,生成的文件按构建标签命名
- 支持使用多个服务器列表进行客户端构建
- 支持中继跳转页面,真实服务器URL加密存储在跳转页面中
- 构建存根完全移除注册表写入操作,X64版本,添加进程注入开关,可选择自身进程注入和新进程注入
- 任务执行条件添加HWID条件
- LOG显示分页列表添加日志总数显示
- LOG列表页面添加下载计数标志块
- 添加FILE下载,一键将所有导出的日志打包成压缩包,方便下载
- Telegram消息模板,添加新的过滤类别
- 添加shim服务器工作检测,5分钟离线,发送Telegram消息通知
- 修复删除重复LOG功能,保留最新记录
- 修复搜索功能,修复时间搜索功能
- Agrent_X钱包,改为Argent
- a Kepler钱包改为Keplr
- API接口变更,添加新的API接口
- 获取设备指纹信息,添加浏览器指纹信息收集
- 构建存根重新设计,更高的稳定性和可靠性
- 添加nonascii: true配置,支持非ASCII字符密码过滤
几个月后发布的版本0.9.2尚未在网站上列出。
Lumma风格的消息框
更新版本(0.9.2)中首先突出的是在恶意软件启动时引入的新消息框。当我们解包初始可执行文件后立即遇到它。
有趣的是,在解包最新的Rhadamanthys(0.9.2)后,当我们尝试运行获得的可执行文件时,会出现警告消息:“Do you want to run a malware? (Crypt build to disable this message)"。
这个消息框对于分析过著名Lumma窃取器的人来说很熟悉。过去,Lumma窃取器引入了一个检查,旨在防止恶意软件分发者以其原始的、未受保护的形式传播初始可执行文件。恶意软件检查从中部署的文件,如果它在定义的偏移处找到熟悉的模式,它会识别出它正在从原始、未打包的样本运行。在这种情况下,不会立即运行恶意操作,而是显示弹出窗口,询问用户是否继续运行。Rhadamanthys现在执行相同的检查。
自定义XS格式的更新
自成立以来,Rhadamanthys一直以自定义格式而不是标准PE格式提供其可执行模块。只有第一阶段(初始组件)是典型的Windows可执行文件。它的作用是准备和部署从内部包中解包的一组组件。
自定义格式保留了可执行文件的所有基本组件,例如重定位、导入表和具有访问权限的节 - 但这些信息存储在作者完全重新发明的头中。与操作系统原生支持的PE或ELF文件不同,自定义可执行文件需要专有加载器。这作为一种混淆形式,因为标准工具无法解析它们。此外,缺少预期的头使得从内存中转储这些组件并重建它们更加困难。
在v0.9.x中,两种格式都收到了更新,我们将其标记为XS1_B和XS2_B。
第一个子类型(XS1)包含一个扩展头,其中有一个表示版本号的字段。当前变体是版本4,是之前描述版本的直接增量。
我们可以观察到的主要变化是头大小之前缺少WORD字段。在先前版本(XS1_A)中,此字段代表用于反混淆自定义导入表中使用的DLL名称的密钥。现在此字段被移除,因为反混淆算法已被新算法取代。
仍然使用导入反混淆密钥(imp_key)来解析导入的函数。这次密钥更短,只有一个BYTE长。它用于计算校验和,然后映射到特定函数的名称。
下一阶段格式(XS2_B)经历了一些较轻的修改。唯一改变的是自定义导入结构中的一个字段:它从WORD扩展到DWORD。此字段携带DLL的名称。过去它可以以混淆形式携带,现在按原样使用。
初始检查的变化(第2阶段核心)
实现为XS1模块的第2阶段核心以其执行的各种检查开始,这些检查用于决定恶意软件是否应继续其执行。其中大多数自早期版本以来没有改变。然而,一些经历了改版。
移除SibCode密钥 在过去,在Rhadamanthys的连续版本中,它使用SibCode注册表键来保存上次执行的时间戳。根据版本的不同,键可能看起来像以下之一:
- HKCU\SOFTWARE\SibCode\sn
- HKCU\SOFTWARE\SibCode\sn2
- HKCU\SOFTWARE\SibCode\sn3
它被引入是为了防止样本在首次部署后太快再次执行。虽然最初时间戳保存为单个DWORD,但在连续版本中,作者投入更多精力使其防篡改。这可能是作者完全放弃它的原因,在0.9.1变更日志中提到:“构建存根完全移除注册表写入操作”。通过检查代码我们可以确认相关函数现在不存在。
互斥体创建 在早期版本中,Rhadamanthys过去以某种可重复的方式创建其互斥体,基于由硬编码值制成的哈希。这允许研究人员创建通用疫苗。现在,作者决定规避这种防止恶意软件运行的简单方法。
自0.9以来,Rhadamanthys配置包括一个参与互斥体名称生成的16字节种子值。它与魔数"XRHY"一起进行哈希处理。哈希的前16字节然后被分割成块并格式化为互斥体名称。
可能的互斥体生成格式字符串:
- “Global\MSCTF.Asm.{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}”
- “Session%u\MSCTF.Asm.{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}”
- “MSCTF.Asm.{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}”
如果第一个互斥体选项创建失败,则应用第二个,其中"Session"后的索引可以在1-8范围内。
根据配置中设置的标志,互斥体可以传递到Rhadamanthys注入其模块的所有进程中(通过复制句柄)。此功能默认启用,如果设置了标志0x40或0x20则禁用。
新配置(RH v0.9.x)
主要的Rhadamanthys模块附带一个混淆的配置,该配置在执行开始时被解密和解析。它包含C2地址、沿途使用的加密密钥以及指定将启用或禁用恶意软件哪些功能的各种标志。这个配置在连续版本中已经显著发展。
魔数0x59485221(!RHY)自其存在开始就被此恶意软件使用。然而,在最近的版本0.9.2中,它被替换为0xBEEF DWORD。此外,配置内容已显著扩展。
以0xBEEF标记开始的未打包配置不是最终版本,而是压缩形式。在获取适当的参数后,应用LZO解压缩。
虽然过去每个样本允许一个C2,但现在允许多个选项。
说明新配置的结构(解压缩后):
|
|
配置解码
与先前版本一样,配置在主样本中存储为Base64字符串,使用自定义字符集编码。在当前版本中,使用的字符集是:4NOPQRSTUVWXY567DdeEqrstuvwxyz-ABC1fghop23Fijkbc|lmnGHIJKLMZ089a。
在获得0xBEEF配置blob之前,配置反混淆的层是:
- 使用自定义字符集进行Base64解码
- ChaCha20解密,使用在获得的blob开头存储的密钥和IV
- CBC XOR shuffle
之后,配置使用LZO算法解压缩。
通过校验和获取模块(第2阶段)
如前所述,恶意软件的重要模块存储在内部包中并按需检索。
在过去版本中,模块通过它们的名称甚至内部文件系统的相对路径从包中获取。这使得研究人员的工作更容易,因为我们能够通过查看名称推断功能。现在作者转向混淆并隐藏了名称。模块由校验和表示。
每当要检索模块时,作为硬编码在初始可执行文件中的原始包首先被解密和解压缩。每次这样做时,都会为模块的混淆设置一个新的XOR密钥。
一旦生成密钥,包的解压缩内容使用基于XOR的简单混淆进行混淆。通过这种方式,作者试图最小化暴露给内存转储工具的内容。
相同的基于XOR的函数然后用于在即将检索单个模块时反转混淆。它由表示为fetch_from_package的函数完成。
规避模块中的添加
样本中附带的初始包包含多个专用于规避的模块。它们在建立与C2的连接之前运行。其中一个之前命名为"Strategy”。尽管自最近的变化以来,名称不再在代码中提及,我们仍将使用它来指代相应的模块。
“Strategy"负责广泛的环境检查,并检测样本是否在受控环境中运行,例如沙箱或具有分析工具的机器。在过去的版本中,它与单个配置文件一起提供:processes.x,包含要检测的禁止进程列表。该文件从包中读取,并传递给Strategy的入口点。现在模块及其灵活性已扩展。首先,我们不再只传递先前获取的列表,而是传递获取函数本身以及包。因此,Strategy模块可以按需加载多个所需的配置片段。
第一个XS1模块(核心),部署Strategy,将回调函数的指针和包的指针传递给其入口点。
Strategy模块的入口点如下。执行开始于使用回调函数检索进程列表。
在枚举运行的进程并根据禁止列表检查它们之后,模块执行其他有趣的检查。例如,它获取当前壁纸,计算其SHA1,并将其与硬编码的5b94362ac6a23c5aba706e8bfd11a5d8bab6097d进行比较,后者代表Triage沙箱的默认壁纸。然后它检查几个样本文件的存在,这些文件用于一些沙箱环境:“foobar.jpg”、“foobar.mp3”、“foobar.txt”、“foobar.wri”、“waller.dat”。它用典型的沙箱用户名列表检查当前用户名,例如:“JohnDeo”(可能是"JohnDoe"的拼写错误)、“HAL9TH”、“JOHN”、“JOHN-PC”、“MUELLER-PC”、“george”、“DESKTOP-B0T”。它搜索文件如"keys.txt”、“passwords.txt”,并通过比较哈希检查它们的内容是否相同 - 这检测了一些沙箱中常见的虚拟文件的存在。
如果所有这些检查都通过,它最终进行到新添加的函数。这个函数需要更深入的解释。它利用两个从包中获取并在适当循环中处理的新配置文件。
要理解第一个配置文件的含义,我们需要更深入地研究它的处理方式。在循环内部,调用一个生成UUID并从中获取节点值的函数。使用的API是UuidCreateSequential,这意味着涉及UUID版本1。由RFC 4122定义的此算法有一个有趣的特征。结构的最后部分,节点标识符(48位)是网络接口的MAC地址。这是在1980年代设计的,当时对隐私的关注远低于现在,并且使用MAC地址是因为它们保证每个物理设备都是唯一的(由IEEE分配)。因此,包括MAC地址是确保没有两台机器可以生成相同UUID的最简单方法。如今,此算法被认为是过时的。现代版本UUID v4不涉及MAC地址。然而,旧的UUIDv1仍然可用于向后兼容。恶意软件使用它来从受感染机器轻松和隐蔽地获取MAC地址。接下来,它根据硬编码列表进行比较。
第二个配置文件包含另一组标识符。这次它们包含硬件ID,将与使用WQL查询检索的HWID进行比较:“SELECT UUID FROM [Win32_ComputerSystemProduct]"。这是检测已知沙箱的另一种方式。
一些标识符与infostealer Skuld和Bandit Stealer使用的阻止列表重叠。
从卷ID生成的机器人ID
当恶意软件信标到其C2服务器时,它发送唯一标识受害者系统的机器人ID。目前,机器人ID是使用两个唯一标识符生成的。
首先,恶意软件从注册表中检索唯一的机器GUID:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography -> MachineGuid
接下来,它使用API GetVolumeInformationW 检索的卷序列号。
它们使用SHA1算法一起进行哈希处理。由于机器人ID现在严格绑定到那些唯一标识符,攻击者更容易将某些机器列入黑名单。
ID进一步表示为十六进制字符串。
下一阶段作为PNG
下载和解码Rhadamanthys的主要阶段(表示为第3阶段)由Netclient模块管理。在其存在的前两年,恶意软件以隐写方式提供包:作为WAV文件,或者作为JPG。
自最新版本0.9.2以来,Netclient模块被显著重新设计。与之前一样,负责的函数安装为在遇到特定内容类型时触发的回调。这次,预期的类型是image/png。
解密和验证有效负载的整个机制与我们之前看到的非常相似。主要区别在于如何获得输入数据。以前,有效负载的字节隐藏在一些最初看起来合法的模板文件(JPG或WAV)中。首先使用特定的自定义隐写算法来抓取交织在媒体内容中的字节。现在作者放弃了门面,数据立即作为像素存储。
它给出了一个看起来嘈杂的图像:与作者早期隐写术的尝试相比不吸引人,但足以完成其工作。
与之前一样,没有在与C2通信期间建立的共享秘密,从PNG解码包是不可能的。
可配置的注入目标列表
Rhadamanthys使用加载到初始进程中的Netclient模块下载其最终阶段。获取的数据在本地解密,使其成为带有模块的第二个包。然而,进一步的解包和加载在另一个进程内部完成。作为掩护,Rhadamanthys创建一个合法进程,该进程首先以挂起模式运行。启动加载链第二部分所需的组件被植入其中。
在过去的版本中,可能目标的列表在样本中是硬编码的,并且随机选择其中一个选项。由于作者引入越来越多的可配置性,现在此列表也在包的新文件中提供。这使得分发者很容易修改。
更改的字符串加密(第3阶段)
自版本0.5以来,Rhadamanthys使用的大多数字符串,特别是在其核心模块中,都是混淆的。混淆方案根据阶段(XS1 vs XS2)而不同。为了解决这个问题,我们之前发布了两个不同的IDA脚本,每个变体一个。
审查0.9.x版本,我们发现其中一个脚本需要修改。第2阶段(和自定义模块XS1_B)在字符串混淆中没有引入变化 - 我们之前发布的IDA脚本仍然可以应用。然而,在第3阶段(XS2_B模块)中,算法被重写。自定义的基于XOR的算法被RC4取代。
此更改在解密时没有引入任何额外的困难。它可能只是为了破坏现有工具并扰乱预期模式而添加。然而,现在 pinpointing 字符串反混淆函数更加困难,因为它们作为多个不同的实例出现。过去只有两个主要的字符串反混淆函数,一个用于ANSI,另一个用于Unicode字符串。
为了解密所有字符串,我们必须找到所有变体及其包装器。
我们提供更新的解密脚本,可用于XS2_B。脚本假设我们IDB中的反混淆函数被适当地重命名。
网络通信
一旦核心窃取器模块被下载和部署,它们执行主要操作,并保持与C2的通信以上传结果并接收命令。与之前的Rhadamanthys变体一样,通信通过WebSocket建立,并使用初始配置中的C2地址。
查询时间服务 在尝试建立与其C2的连接之前,样本以随机顺序查询以下服务以获取时间:
- “time.google.com”
- “time.cloudflare.com”
- “time.facebook.com”
- “time.windows.com”
- “time.apple.com”
- “time-a-g.nist.gov”
- “ntp.time.in.ua”
- “ts1.aco.net”
- “ntp1.net.berkeley.edu”
- “ntp.nict.jp”
- “x.ns.gin.ntt.net”
- “gbg1.ntp.se”
- “ntp1.hetzner.de”
- “ntp.time.nl”
- “pool.ntp.org”
这是在Rhadamanthys最近版本(0.9.x)中添加的,在早期版本中未见。
处理URL 在Rhadamanthys最新版本中添加的一个有趣细节是,配置中的URL被进一步处理。首先,使用以下算法生成随机字符串:
|
|
当应用此算法时,配置中的域被随机内容部分覆盖。第一个”/“之前的URL长度(即表示IP和端口)用作新字符串的长度。接下来,’.‘插入新字符串结束前两个字符,使其看起来像域。
转换示例:
- 192.30.242[.]210:8888/gateway/qq7o8k3h.fnliq → hxxps://mohbskyjlaztloar.dq/gateway/qq7o8k3h.fnliq
- 193.84.71[.]81/gateway/wcm6paht.htbq1 → hxxps://jvmhnrlbt.xf/gateway/wcm6paht.htbq1
起初它看起来像DGA,然而,生成的域不解析,并且它们太随机而无法真正使用。生成算法使输出不仅对不同的日期敏感,而且每秒都在变化。
我们在网络通信中观察到的C2地址仍然与配置中的相同。
Lua窃取器
自早期版本以来,Rhadamanthys核心窃取器带有一个内置的Lua运行器。它为此语言编写的额外窃取器插件服务。
所有可用的Lua窃取器(在0.9.1中):
- FTP:CoreFTP、CuteFTP、Cyberduck、Filezilla、FlashFXP、FtpNavigator、FTPRush、SSH、SmartFTP、Total Commander、WinSCP、putty
- 邮件:CheckMail、Clawsmail、EMClient、Foxmail、GmailNotifierPro、Outlook、TheBat、TrulyMail、ThunderBird
- 通讯工具:Discord、Telegram、Pidgin、Psi+、Tox
- 笔记:Stickynotes、Notefly、Notezilla
- VPN:OpenVPN、OpenVPN Connect、AzireVPN、NordVPN、PrivateVPN、ProtonVPN、WindscribeVPN
- 游戏:Steam
- 2FA:Authy Desktop、RoboForm
- 密码管理器:KeePass
- 其他:TeamViewer、WebCredential、WindowsCredential
- 钱包:Armory、Atomex.me、Atomicdex、AtomicWallet、BinanceWallet、BitcoinCore、Bither、ByteCoin、Coinomi、DashCore、Defichain-Electrum、Dogecoin、Electron-Cash、Electrum-LTC、Electrum-SV、Electrum、Exodus、Frame、Guarda、Jaxx、Litecoin、LitecoinCore、Monero、MyCrypto、MyMonero、Qtum-Electrum、Qtum、Safepay、Solar Wallet、TokenPocket、WalletWasabi、Zap、Zecwallet Lite
最近发布(0.9.2)添加了一个用于Ledger Live加密钱包应用的Lua扩展(id: 0x23)。
其他模块
在最新版本中,第3阶段的包丰富了几个更多模块。它们是:
- chrome_extension.dat
- fingerprint.js
- index.html
最有趣的是fingerprint.js。它是一个JavaScript,以以下注释开头:Browser Fingerprint Export Tool ; Used to collect browser fingerprint information and export as JSON。它旨在由浏览器打开并收集其配置的各种信息。脚本的主要函数异步调用,并将所有信息收集到JSON报告中。
执行数据收集的函数带有广泛的注释,显示我们预期收集的数据类型。
index.html非常简单,似乎仅用作嵌入fingerprint.js的载体。
结论
Rhadamanthys从一开始就显得成熟,因为它的代码库大量借鉴了作者早期的Hidden Bee项目。其初始开发是快节奏的,因为作者大力投资于快速功能增长以获得动力并吸引客户。他们不断重新设计代码库,引入扩展和附加组件,增加了灵活性,允许针对不同用例进行定制。目前,开发较慢且稳定:核心设计保持不变,变化集中在改进上 - 例如新的窃取器组件、混淆变化和更高级的定制选项。
最新变体代表进化而不是革命。分析师应更新其配置解析器,监控基于PNG的有效负载传递,跟踪互斥体和机器人ID格式的变化,并期望在工具跟上时混淆的进一步变化。如果这种轨迹继续,未来的1.0版本可能强调稳定性和专业化,进一步巩固Rhadamanthys作为窃取器生态系统中长期参与者的地位。
保护
Check Point Threat Emulation和Harmony Endpoint提供对攻击策略、文件类型和操作系统的全面覆盖,并防范本报告中描述的攻击和威胁。
IOCs
分析的样本:
- 8f54612f441c4a18564e6badf5709544370715e4529518d04b402dcd7f11b0fb (打包,Golang打包器)
- b429a3e21a3ee5ac7be86739985009647f570548b4f04d4256139bc280a6c68f
- b41fb6e936eae7bcd364c5b79dac7eb34ef1c301834681fbd841d334662dbd1d
- eb5558d414c6f96efeb30db704734c463eb08758a3feacf452d743ba5f8fe662 – 打包
- 1f7213a32bce28cb3272ef40a7d63196b2e85f176bcfe7a2d2cd7f88f4ff93fd – 解包有效负载
- c19716b262e928d83252d75a1ff262786df6cbb221132a0ada08ef3293c091b7 (解包)
- 84bbe70b3089e578d69744bd8b030c3a6e724a6c3f4bdefda82fe5057f89c9ba (解包)
- a451cbfe093830cd4d907d10bc0f27ea51da53ece5456af2fe6b3b24d3df163e (打包)
- 23a57ba898b5e91a2ead4e93c97710fe91dc917a7d11dc44b41304778565905f (解包)
URL:hxxps://193.84.71.81/gateway/wcm6paht.htbq1