本帖最后由 火绒工程师 于 2025-3-13 20:17 编辑
近年来,随着Rust语言在系统编程领域的广泛应用,基于该语言开发的恶意软件样本也随之显著增长,其特有的技术特性正逐渐成为网络犯罪分子的新选择,主要表现为以下几点: Rust提供了对底层硬件的直接访问能力,使得开发者能够编写出非常接近硬件底层的代码。 Rust的内存安全特性(如所有权模型和生命周期检查)在一定程度上减少了常见的内存漏洞,使得恶意软件更加难以被检测和防御。 Rust的跨平台兼容性和高性能特性,使得恶意软件可以更容易地在不同操作系统和硬件架构之间传播和运行。
从攻击角度来看,Rust的以下特性在恶意软件编写中被利用: 内联汇编支持:Rust通过asm!宏支持x64内联汇编,允许开发者直接嵌入汇编指令,从而实现对硬件的精细控制。 直接操作内存:Rust的unsafe关键字允许开发者绕过编译器的安全检查,直接操作内存,这为恶意软件编写者提供了更大的灵活性和控制权。 反编译难度高:Rust的编译器优化和代码生成特性使得恶意软件的反编译和分析变得更加困难,从而增加了恶意软件的隐蔽性和防御难度。
目前,火绒在检测Rust样本过程中,已捕获数十万相关样本,且样本种类繁多。其中,排名前几位的样本类型主要集中在恶意软件、漏洞利用工具、黑客工具和后门程序。通过对这些样本进行深入分析,我们发现大多数恶意软件样本利用了Rust的内存特性来加载恶意代码,并借助后端LLVM Pass进行二次混淆,使得调试分析变得更加困难。 Rust样本数量图
随着技术的持续发展,Rust生态系统日益成熟,新的恶意软件样本类型和攻击手法也不断涌现,因此,应对和分析Rust样本是有必要的。 接下来,本文将从多个角度剖析Rust在恶意软件中的具体应用,并对最新捕获的Rust样本进行详细分析。
一、Rust在恶意软件中的应用场景 Shellcode Rust通过asm!宏支持内联汇编(Inline Assembly),允许开发者直接在代码中嵌入特定架构的机器指令。这一特性使病毒开发者在编写Shellcode时,能够更加灵活且具有更强的控制力。 - use std::arch::asm;
- //Linux
- fn main() {
- unsafe {
- asm!(
- "mov rax, 60",
- "mov rdi, 42",
- "syscall",
- );
- }
- }
复制代码在Windows系统中,恶意软件通常需要动态获取系统函数的地址来执行恶意代码。其具体流程为:首先通过解析进程环境块(PEB),获取Kernel32.dll的基地址,然后进一步获取GetProcAddress函数的地址,最终实现任意函数的调用。以下是经过Rust编译的Shellcode具体实例。 Rust编写的Shellcode
Cobalt Strike Cobalt Strike通过Rust重写的核心部分在于其通信协议的实现,主要包括RSA加解密、AES加解密、Base64编解码及配置文件的加密与解析。其具体流程为:首先提取配置信息,然后利用RSA对这些信息进行加密,其中加密过程涉及用于AES解密协商的密钥。 RSA公钥 RSA加密
随后,对回传的数据进行AES加解密。 AES-CBC加解密
对任务进行解析后,利用命令行库CMD实现跨平台(Windows、Linux、macOS)的任务执行。 C2 Task执行
Rootkit Rootkit是一种用于隐藏恶意软件的工具,通常需要深入到操作系统的内核层进行操作。Rust语言凭借其内存安全性和对硬件的直接访问能力,逐渐成为编写Rootkit的新选择。 以下是一个由Rust开发的Rootkit样本。该样本具备多种高级功能,包括进程隐藏、进程注入、内核结束进程,以及摘除进程创建、线程创建、模块加载和注册表操作的回调。 Rootkit功能图
断链隐藏驱动、断链隐藏进程。 断链隐藏驱动 断链隐藏进程
内核结束进程。 内核结束进程
内核APC Shellcode注入。 内核APC Shellcode注入
通过getAsyncKeyState获取键盘数据。 getAsyncKeyState获取键盘数据
摘除进程回调、线程回调、模块加载回调、注册表回调。 摘除进程回调、线程回调、模块加载回调、注册表回调
二、最新样本分析 近期,火绒威胁情报中心检测到一批由Rust编写的恶意样本。这些样本的主要行为是从远程网络服务器获取Shellcode并加载执行。样本的传播方式不断演变,包括通过MSI安装包、EXE可执行文件等多种形式。目前,火绒安全已支持查杀此类恶意样本,能够有效保护用户的系统安全,为了进一步提升防护能力,建议广大用户及时安装或更新火绒安全软件,以确保系统具备最新的防护能力,有效抵御新兴威胁,防范潜在的安全风险。 查杀图
执行流程图如下: 流程图
wininstall.exe: 在wininstall.exe中,Rust的main函数并不是直接执行的,而是先配置一系列的异常处理机制、TLS回调以及堆栈等环境,在完成这些初始化操作后,main函数开始执行。 main函数
随后,样本会检测当前是否具有管理员权限。如果具备管理员权限,则通过创建计划任务来实现权限维持,并从远程网络服务器下载并执行Shellcode。如果不具备管理员权限,则结束进程。 管理员权限执行 计划任务
通过PowerShell命令创建计划任务。 计划任务:PowerShell
在通过网络请求获取配置信息时,样本会设置自定义的User-Agent(UA)头,以此来模拟合法流量并达到规避检测的目的。 User-Agent(UA)
下载恶意Shellcode代码
接下来,样本通过申请内存空间、复制恶意代码并修改内存属性(设置为可执行权限)的方式,加载并执行Shellcode。 分配内存
最后,样本通过创建新线程来实现执行恶意代码。 线程执行
对其恶意代码进行分析,其通过CLR(Common Language Runtime公共语言运行库)内存加载PE的方式执行后门功能。 内存加载PE 内存PE
对提取的PE文件进行分析后,确认其为Xworm 5.6远控木马,后门通信地址为154.197.33.29:7000。该变种版本已将所有与"Xworm"相关的字段抹去,以规避检测。 修改版Xworm 5.6
huhu7.26.msi安装: 在初始版本中通过MSI安装程序释放并执行恶意代码,释放的文件包括: MSI释放文件
通过对MSI安装包的CustomAction进行分析,可以发现protector.exe是由aicustact.dll的导出函数LaunchAPP启动执行的。而火狐浏览器安装程序则是通过viewer.exe以命令行方式进行安装的。 MSI主行为 AI_APP_FILE 执行Rust加载器 命令行执行火狐安装程序
下载恶意代码
后续加载过程与变种版本相同,具体步骤如下:先开辟一块内存空间,再将内存的权限修改为可执行,最后创建线程来执行下载的恶意代码。 分配内存
对网络获取的恶意代码Shellcode进行分析后,发现其执行方式同样是通过内存加载PE文件。该版本与变种版本的主要区别在于,其中的Xworm后门为未修改的5.6版本。 原版Xworm5.6
三、附录 C&C:
HASH:
|