特征
该rootkit由多个模块组成(这里指的是Rust模块,而不是内核模块):
- 防御规避:隐藏文件、进程、网络连接等。
- 钩子:钩住系统调用和 IDT
- 虚拟机管理程序:创建虚拟机来执行恶意代码
- 持久性:使 rootkit 在重启后持久存在,并且能够抵御抑制
- utils:各种实用程序
C2 将精心设计的 x86_64 助记符发送给 rootkit,rootkit 随后将其发送到虚拟机客户机执行。虚拟机客户机与主机隔离,可用于执行恶意代码。
内核看不到传入的恶意数据包,因为它们被 eBPF XDP 程序过滤并发送到 LKM 模块,而传出的数据包被 eBPF TC 程序修改。
钩子
钩子是rootkit的一项基本功能,kprobes
在Linux内核中实现。该技术拦截并重定向系统函数的执行,以监视或修改其行为。在此rootkit中,钩子 kprobes
提供了一种强大的机制,可以在不直接修改源代码的情况下与内核函数进行交互。
防御规避
为了确保隐蔽性,rootkit 采用了两种主要的反检测机制:
-
从内核模块列表中移除模块:当一个内核模块被加载时,它会被添加到内核的模块列表中,可以通过
lsmod
或 等 工具查看/proc/modules
。为了防止被检测到: - 该 rootkit 会手动将自己从该列表中删除。
- 尽管从列表中删除,该模块仍可运行,并能够继续执行其功能。
-
钩住
filldir64
函数以隐藏特定目录为了隐藏rootkit使用的文件,需要钩住函数filldir64
。当进程读取目录内容(例如通过getdents
或readdir
系统调用)时,会调用此函数。 - 该 rootkit
filldir64
使用 来拦截该函数kprobes
。 - 在执行期间,处理程序会检查返回给用户的目录条目。
- 如果某个条目与
/BLACKPILL-BLACKPILL
目录(用于存储关键的 rootkit 文件)匹配,则会将其过滤掉并且不会返回给用户。 - 所有其他目录条目均正常返回,确保用户空间工具的透明度。
-
使用 eBPF XDP 和 TC 程序修改入口和出口网络流量。 为了规范我们的恶意网络通信,我们使用 eBPF XDP(eXpress 数据路径)和 TC(流量控制)程序。这样,我们可以:
- 通过匹配来自我们 C2 的精心设计的 TCP 有效负载签名,使用 XDP 程序在最低网络级别拦截特定的传入(入口)数据包,然后我们将其重定向到自定义 BPF 映射以进行 VM/LKM 处理。
- 使用 TC 程序拦截特定的传出(出口)数据包,方法是匹配 VM/LKM 生成的 TCP 数据包,然后我们用 C2 响应数据覆盖其有效负载,从而对其进行修改。原始数据包会自动由 TCP 重新传输,从而保持合法流量的表象。
虚拟机管理程序
我们的简单虚拟机管理程序是按照以下步骤实现的:
-
初始系统配置
- 在 BIOS/UEFI 中启用硬件虚拟化扩展(Intel VT-x 或 AMD-V)(rootkit 不会执行此操作,必须事先启用)。
- 配置控制寄存器(CR0、CR4 和 IA32_EFER)以切换到 VMX(虚拟机扩展(Intel))或 SVM(安全虚拟机(AMD))模式。
-
进入 VMX 或 SVM 模式
- 初始化虚拟化特定的数据结构(Intel 的 VMCS 或 AMD 的 VMCB)。
- 对处理器功能(例如 VM 退出)进行编程,以处理客户机和主机之间的交互。
-
管理主机和客户机之间的转换
- 配置虚拟机的入口和出口点(VM entry/exit)。
- 实现逻辑以拦截客户机发出的敏感系统调用并分析其影响。
-
访客系统创建
- 为客户机分配内存并初始化其资源(寄存器、堆栈等)。
-
沟通
- 使用 rootkit 和虚拟机管理程序之间的通信通道来传输命令或数据。
持久性
持久性是任何 rootkit 的关键功能,使其即使在重新启动后也能保持对目标系统的控制。
在当前的实现中,持久化机制通过使用 /bin/touch
命令在文件系统中创建测试文件来演示其功能。此占位操作展示了rootkit执行特权操作的能力,并且可以扩展以实现更高级的持久化策略。
下载地址:
原文始发于微信公众号(TtTeam):Rust 编写的隐秘 Linux rootkit
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论