Rhadamanthys 0.9.x恶意软件技术深度解析

本文深入分析了Rhadamanthys信息窃取恶意软件0.9.x版本的重大更新,包括自定义XS格式演变、配置结构变化、反分析技术增强、模块获取机制改进以及网络通信协议更新等技术细节。

Rhadamanthys 0.9.x - 全面解析更新内容

研究亮点

  • Rhadamanthys是一款自2022年发布的多模块化信息窃取器,已被多个攻击者用于各种攻击活动
  • 最新版本0.9.2带来了可能影响检测的重要更新,并强制研究人员更新分析工具
  • Check Point Research提供了多个脚本来帮助防御者应对这些变化
  • 本报告详细介绍了最新变化,并在恶意软件整体背景下进行了描述

引言

Rhadamanthys是一款复杂的多模块化恶意软件,自2022年9月起在地下市场销售。它最初由攻击者"kingcrete2022"宣传,其设计从一开始就显示出经验丰富开发者的特征。分析很快发现它大量借鉴了作者早期项目Hidden Bee的代码。

Check Point Research一直密切跟踪其发展,注意到持续的更新和定制选项。在之前的出版物中,我们以v0.5为例探讨了其功能广度、内部设计和组件执行流程。随着v0.9.x的发布,Rhadamanthys引入了破坏我们之前发布工具的变化,包括自定义格式转换器和字符串反混淆器。

网站改版

Rhadamanthys最初通过网络犯罪论坛帖子推广,但很快作者就有了更雄心勃勃的计划。他们同时推出了Telegram支持频道、带有详细产品描述的Tor网站,并提供通过Tox通信。最近,网站经历了全面改版,呈现出精致专业的形象。

运营商现在将自己品牌化为"RHAD security"和"Mythical Origin Labs"。新网站展示了他们所有的产品,包括仍在开发中的产品预告。除了旗舰窃取器Rhadamanthys,他们还宣传Elysium Proxy Bot和Crypt Service。

0.9.x版本公告

0.9版本于2025年2月发布,随后是0.9.1和0.9.2更新。官方网站仍然只列出0.9.1版本,其变更日志包括一长串更新:

v0.9.1 (2025-05-18) 主要更新

  • 重新设计数据库操作流程,分离读写操作,确保数据写入完整性
  • 用户管理权限级别,引入新的worker、流量商,移除观察者模式
  • 优化文件打包和导出到目录时的CPU使用率
  • TOR移除随机地址生成,固定地址永久有效
  • 管理登录添加2FA OTP登录验证
  • 客户端和任务插件引入全程内存互斥体,抑制同一机器上多次执行发送重复数据
  • 客户端加载引入跟踪系统,可与用户的加载程序接口
  • 生成客户端文件时直接从列表选择标签,生成的文件按构建标签命名
  • 支持使用多个服务器列表进行客户端构建
  • 支持中继跳转页面,真实服务器URL加密存储在跳转页面中
  • 构建存根完全移除注册表写入操作,X64版本添加进程注入开关
  • 任务执行条件添加HWID条件
  • LOG显示分页列表添加日志总数显示
  • LOG列表页面添加下载计数标志块
  • 添加FILE下载,一键将所有导出的日志打包成压缩包
  • Telegram消息模板添加新的过滤类别
  • 添加shim服务器工作检测,5分钟离线发送Telegram消息通知
  • 修复删除重复LOG功能,保留最新记录
  • 修复搜索功能,修复时间搜索功能
  • 多个钱包名称更新和API接口变更
  • 获取设备指纹信息添加浏览器指纹信息收集
  • 构建存根重新设计,更高的稳定性和可靠性
  • 添加nonascii: true配置,支持非ASCII字符密码过滤

Lumma风格的消息框

更新版本(0.9.2)中第一个突出变化是引入了新的消息框,在恶意软件启动时出现。这是在解包初始可执行文件后立即遇到的。

解包最新的Rhadamanthys(0.9.2)后,当我们尝试运行获得的可执行文件时,会出现警告消息:“Do you want to run a malware? (Crypt build to disable this message)"。

这个消息框对于分析过著名Lumma窃取器的人来说很熟悉。过去,Lumma窃取器引入了旨在防止恶意软件分发者以纯文本、未受保护的形式传播初始可执行文件的检查。

自定义XS格式的更新

自成立以来,Rhadamanthys一直以自定义格式而非标准PE格式提供其可执行模块。只有第一阶段是典型的Windows可执行文件。

在v0.9.x中,两种格式都收到了更新,我们标记为XS1_B和XS2_B。

XS1_B格式变化

第一个子类型(XS1)包含一个扩展头,其中有一个表示版本号的字段。当前变体是版本4,是之前描述版本的直接增量。

XS1_B的头部结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#pragma pack(push, 1)
typedef struct {
    WORD magic;
    WORD nt_magic;
    WORD sections_count;
    WORD hdr_size;
    BYTE ver;
    BYTE imp_key; // 新增位置
    DWORD module_size;
    DWORD entry_point;
    t_XS_data_dir data_dir[XS_DATA_DIR_COUNT];
    t_XS_section sections;
} t_XS_format_B;
#pragma pack(pop)

我们观察到的主要变化是头部大小之前缺少WORD字段。在之前版本中,此字段用于反混淆DLL名称的密钥。现在此字段被移除,因为反混淆算法已被新算法替换。

XS2_B格式变化

下一阶段格式(XS2_B)经历了一些较轻的修改。唯一的变化是自定义导入结构中的一个字段:从WORD扩展到DWORD。此字段携带DLL名称。

初始检查的变化(阶段2核心)

阶段2核心作为XS1模块实现,以各种检查开始执行,用于决定恶意软件是否应继续执行。其中大多数自早期版本以来没有变化,但有些经历了改版。

SibCode密钥的移除

在过去,Rhadamanthys使用SibCode注册表键来保存最后执行的时间戳。这可能是作者完全放弃它的原因,在0.9.1变更日志中提到:“构建存根完全移除注册表写入操作”。通过检查代码我们可以确认相关函数现在不存在。

互斥体创建

在早期版本中,Rhadamanthys以某种可重复的方式创建其互斥体。现在,作者决定规避这种防止恶意软件运行的简单方法。

自0.9以来,Rhadamanthys配置包括一个参与互斥体名称生成的16字节种子值。

新配置(RH v0.9.x)

主要的Rhadamanthys模块附带混淆配置,在执行开始时解密和解析。它包含C2地址、沿途使用的加密密钥以及指定恶意软件哪些功能将启用或禁用的各种标志。

在最近版本0.9.2中,魔法值0x59485221被替换为0xBEEF DWORD。此外,配置内容已显著扩展。

配置解码

与之前版本一样,配置在主样本中存储为Base64字符串,使用自定义字符集编码。在当前版本中,使用的字符集是:4NOPQRSTUVWXY567DdeEqrstuvwxyz-ABC1fghop23Fijkbc|lmnGHIJKLMZ089a

在获得0xBEEF配置blob之前的配置反混淆层:

  1. 使用自定义字符集进行Base64解码
  2. 使用存储在获得blob开头的密钥和IV进行ChaCha20解密
  3. CBC XOR shuffle

之后,配置使用LZO算法解压缩。

通过校验和获取模块(阶段2)

如前所述,恶意软件的重要模块存储在内部包中,并按需检索。

在过去版本中,模块通过其名称甚至内部文件系统中的相对路径从包中获取。现在作者转向混淆并隐藏了名称。模块由校验和表示。

包结构

重建的包结构(阶段2):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct DATA_DIR {
    struct {
        uint32_t header_rel_off;
        uint32_t checksum;
    };
} _DATA_DIR;

typedef struct DATA_RECORD {
    struct {
        uint32_t size;
        uint8_t offset[1];
    };
} _DATA_RECORD;

typedef struct PACKAGE {
    uint32_t total_size;
    uint16_t reserved;
    uint16_t xor_key;
    uint32_t dir_offset;
    uint16_t data_offset;
    uint8_t file_count;
    uint8_t  blk_shift;
    _DATA_DIR dir[1];
} _PACKAGE;

规避模块的添加

样本中附带的初始包包含多个专用于规避的模块。它们在建立与C2的连接之前运行。其中一个之前命名为"Strategy”。

第一个XS1模块(核心)部署Strategy,将回调函数指针和包指针传递给其入口点。

Strategy模块的入口点如下。执行首先使用回调函数检索进程列表。

在枚举运行进程并根据禁止列表检查它们之后,模块执行其他有趣的检查。例如,它获取当前壁纸,计算其SHA1,并将其与硬编码的值进行比较。

从卷ID生成的机器人ID

当恶意软件向其C2服务器发送信标时,它会发送唯一标识受害者系统的机器人ID。目前,机器人ID是使用两个唯一标识符生成的。

首先,恶意软件从注册表中检索唯一的机器GUID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography -> MachineGuid

接下来,它使用API:GetVolumeInformationW检索的卷序列号。

它们使用SHA1算法一起哈希。由于机器人ID现在严格绑定到那些唯一标识符,攻击者更容易将某些机器列入黑名单。

下一阶段作为PNG

下载和解码Rhadamanthys的主要阶段(表示为阶段3)由Netclient模块管理。在其存在的最初两年,恶意软件以隐写方式提供包:作为WAV文件,或者作为JPG。

Netclient模块自最新版本0.9.2以来已显著重新设计。与之前一样,负责的函数安装为在遇到特定内容类型时触发的回调。这次,预期类型是image/png

可配置的注入目标列表

Rhadamanthys使用加载到初始进程中的Netclient模块下载其最终阶段。获取的数据在本地解密,使其成为带有模块的第二个包。然而,进一步的解包和加载在另一个进程内完成。

在过去版本中,可能目标的列表是硬编码在样本中的,其中一个选项是随机选择的。由于作者引入了越来越多的可配置性,现在此列表也在包的新文件中提供。

更改的字符串加密(阶段3)

自版本0.5以来,Rhadamanthys使用的大多数字符串,特别是在其核心模块中,都是混淆的。混淆方案因阶段而异(XS1与XS2)。

审查0.9.x版本,我们发现其中一个脚本需要修改。阶段2引入了字符串混淆的变化,但阶段3中的算法被重写。自定义的基于XOR的算法被RC4替换。

网络通信

一旦核心窃取器模块被下载和部署,它们执行主要操作,并保持与C2的通信以上传结果和接收命令。与之前的Rhadamanthys变体一样,通信通过WebSocket建立,并使用初始配置中的C2地址。

查询时间服务

在尝试建立与其C2的连接之前,样本以随机顺序查询以下服务的时间:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
"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"

Lua窃取器

自早期版本以来,Rhadamanthys核心窃取器带有内置的Lua运行器。它为此语言编写的其他窃取器插件提供服务。

所有可用的Lua窃取器包括FTP客户端、邮件客户端、即时通讯软件、笔记应用、VPN客户端、游戏平台、2FA应用、密码管理器等各种类型的数据窃取功能。

其他模块

在最新版本中,阶段3的包丰富了更多模块。最有趣的是fingerprint.js。它是一个JavaScript,以以下注释开头:Browser Fingerprint Export Tool ; Used to collect browser fingerprint information and export as JSON

结论

Rhadamanthys从一开始就显得成熟,因为它的代码库大量借鉴了作者早期项目Hidden Bee。其初始开发是快节奏的,因为作者大力投资于快速功能增长以获得动力并吸引客户。

最新变体代表了进化而非革命。分析师应更新其配置解析器,监控基于PNG的有效载荷传递,跟踪互斥体和机器人ID格式的变化,并期望在工具跟上时混淆的进一步变化。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计