DualHorizon/blackpill

GitHub: DualHorizon/blackpill

一个使用 Rust 编写的高级 Linux 内核 Rootkit,融合自研 Type-2 Hypervisor、eBPF XDP/TC 网络隐蔽技术和 kprobes Hook 机制,实现高度隐蔽的恶意代码执行与通信。

Stars: 337 | Forks: 43

BlackPill

BlackPill is a stealthy Linux rootkit made in Rust.

Open issues Commit activity License
## 功能 该 rootkit 由多个模块组成(这里指 Rust 模块,而非内核模块): - **防御规避 (defense evasion)**:隐藏文件、进程、网络连接等。 - **Hooking (挂钩)**:Hook 系统调用和 IDT。 - **Hypervisor (虚拟机管理程序)**:创建虚拟机以执行恶意代码。 - **Persistence (持久化)**:使 rootkit 在重启后保持持久性,并能抵抗清除操作。 - **工具 (utils)**:各种实用工具。 架构如下所示: ![Rootkit simple architecture schema](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2951028c98104301.png) 以下是从 C2 到 VM Guest 执行恶意代码的流程: ![Rootkit code execution sequence diagram](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/7e60f74379104302.png) C2 将精心构造的汇编 x86_64 指令发送给 rootkit,rootkit 随后将其发送到 VM Guest 执行。VM Guest 与主机隔离,可用于执行恶意代码。 内核看不到传入的恶意数据包,因为它们被 eBPF XDP 程序过滤并发送到 LKM 模块,而传出的数据包则由 eBPF TC 程序修改。 ### Hooking (挂钩) Hooking 是该 rootkit 的一项基本功能,通过 Linux 内核中的 `kprobes` 实现。该技术拦截并重定向系统函数的执行,以监视或修改其行为。在此 rootkit 中,`kprobes` 提供了一种强大的机制,无需直接更改源代码即可与内核函数交互。 ### 防御规避 (Defense Evasion) 为了确保隐蔽性,rootkit 采用了两种主要的反检测机制: 1. **从内核模块列表中移除模块** 当加载内核模块时,它会被添加到内核的模块列表中,并可通过 `lsmod` 或 `/proc/modules` 等工具查看。为了防止被检测: - Rootkit 手动将其自身从该列表中移除。 - 尽管从列表中移除,该模块仍保持运行状态,从而能够继续执行其功能。 2. **Hook `filldir64` 函数以隐藏特定目录** 为了隐藏 rootkit 使用的文件,在 `filldir64` 函数上实现了 Hook。当进程读取目录内容时(例如通过 `getdents` 或 `readdir` 系统调用),会调用此函数。 - **Hooking 流程**: - Rootkit 使用 `kprobes` 拦截 `filldir64` 函数。 - 在执行期间,处理程序会检查返回给用户的目录条目。 - 如果条目匹配 `/BLACKPILL-BLACKPILL` 目录(用于存储关键的 rootkit 文件),则将其过滤掉,不返回给用户。 - 所有其他目录条目正常返回,确保对用户空间工具的透明性。 3. **使用 eBPF XDP 和 TC 程序修改入口和出口网络流量** 为了规范化我们的恶意网络通信,我们使用了 eBPF XDP (eXpress Data Path) 和 TC (Traffic Control) 程序。因此,我们可以: - 使用 XDP 程序在最低网络层拦截特定传入 入口 数据包,通过匹配来自我们 C2 的精心构造的 TCP 负载签名,然后将其重定向到自定义 BPF map 供 VM/LKM 处理。 - 使用 TC 程序拦截特定传出 出口 数据包,通过匹配 VM/LKM 生成的 TCP 数据包,然后通过用我们的 C2 响应数据覆盖其负载来进行修改。原始数据包由 TCP 自动重传,从而维持合法流量的外观。 ### Hypervisor (虚拟机管理程序) 我们的简单 Hypervisor 是按照以下步骤实现的: 1. **初始系统配置** - 在 BIOS/UEFI 中启用硬件虚拟化扩展(Intel VT-x 或 AMD-V)(rootkit 不执行此操作,必须预先启用)。 - 配置控制寄存器(CR0、CR4 和 IA32_EFER)以切换到 VMX(Intel 虚拟机扩展)或 SVM(AMD 安全虚拟机)模式。 2. 进入 VMX 或 SVM 模式 - 初始化虚拟化特定的数据结构(Intel 为 VMCS,AMD 为 VMCB)。 - 编程处理器功能,例如 VM exits,以处理 Guest 和 Host 之间的交互。 3. 管理 Host 和 Guest 之间的转换 - 配置虚拟机的进入和退出点。 - 实现逻辑以拦截 Guest 发出的敏感系统调用并分析其影响。 4. Guest 系统创建 - 为 Guest 分配内存并初始化其资源(寄存器、堆栈等)。 5. 通信 - 使用 rootkit 和 Hypervisor 之间的通信通道来传输命令或数据。 ### Persistence (持久化) 持久化是任何 rootkit 的关键能力,使其能够在重启后保持对目标系统的控制。 在当前实现中,持久化机制通过使用 `/bin/touch` 命令在文件系统中创建测试文件来演示其功能。此占位符操作展示了 rootkit 执行特权操作的能力,并可以扩展以实现更高级的持久化策略。 目前这一功能用处不大,因为我们的重点不是创建 APT 级别的 rootkit,而是针对较少见的概念进行研究。 ## 设置开发环境 在编译 rootkit 之前需要完成多个步骤。开发环境包括: - 提供基本工具的 Alpine Linux 镜像 - 启用了 Rust 支持的自定义编译内核 - 由 KVM 加速的 QEMU 虚拟机 首先克隆仓库及其浅层子模块: ``` git clone git@github.com:DualHorizon/blackpill.git --recursive --depth 1 ``` ### 重要依赖 在基于 Arch 的发行版上: ``` sudo pacman -S qemu-base qemu-desktop docker grub ``` ### Linux Kernel 在基于 Arch 的 Linux 发行版上,安装 Rust 和其他依赖项: ``` sudo pacman -S rust rust-src rust-bindgen sudo pacman -S clang lld llvm ``` 然后我们需要 Rust 源码和 bindgen: ``` rustup component add rust-src clippy rustfmt cargo install --locked bindgen-cli ``` 通过在 `linux/` 文件夹中运行以下命令,确保你可以开始编译启用了 Rust 的内核: ``` $ cd blackpill $ pushd linux $ make LLVM=1 rustavailable Rust is available! $ popd ``` 启动首次设置任务,该任务将配置并编译内核: ``` make first-time-setup ``` ### Rootkit 你可以使用以下命令编译 Rust 内核模块: ``` make ``` 使用以下命令启动 VM: ``` make vm ``` 在 VM 内部,你会自动以 `root` 身份登录。你可以使用以下命令启用模块: ``` $ modprobe blackpill # 可以使用以下命令检查 kernel logs $ dmesg ``` ## 使用方法 ### 本地权限提升 VM 启动后,你可以使用上面的命令提升权限: ``` mkdir ImFeelingRootNow_ ``` 将 `` 替换为你想要提升权限的进程的进程 ID。 ## C2 ### 描述 这个简单的 C2 通过 UDP 向受感染的机器发送 x86-64 操作码,并接收 TCP 数据包。其功能目前仅限于与机器进行低级交互,但通过更多的封装,可能允许大量实际应用。 ### 用法 设置 python 客户端: ``` cd blackpill-c2 poetry install poetry shell python client.py ``` 使用参数 启动客户端后,你应该会看到: ``` $ python client.py 0.0.0.0 1339 Connected to rootkit! ``` 然后你可以使用 help 命令显示可用命令: ``` blackpill: help Available Commands ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Command ┃ Description ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ read_virt_memory
│ Read 4 bytes (32 bits) memory at 'address' │ │ write_virt_memory
│ Write 4 bytes (32 bits) memory at 'address' │ │ launch_userland_binary │ Launch a userland binary at 'path' │ │ change_msr │ Change the value of a Model Specific Register (MSR) │ │ read_phys_memory
│ Read 4 bytes (32 bits) of physical memory at 'address' │ │ write_phys_memory
│ Write 4 bytes (32 bits) of physical memory at 'address' │ │ stop_execution │ Stop the execution of the guest VM │ │ change_vmcs_field │ Change a VMCS field to 'value' │ │ help │ Show this help message │ └─────────────────────────────────────┴─────────────────────────────────────────────────────────┘ ``` ## 致谢 环境设置: - [Setting Up an Environment for Writing Linux Kernel Modules in Rust - The Linux Foundation](https://www.youtube.com/watch?v=tPs1uRqOnlk) - [Kernel config qemu-busybox-min.config patch](https://lore.kernel.org/rust-for-linux/20230609063118.24852-18-amiculas@cisco.com/) - [Rust out-of-tree module](https://github.com/Rust-for-Linux/rust-out-of-tree-module)
标签:0day挖掘, C2 通信, DNS 反向解析, Docker镜像, Hooking, IDT Hook, IP 地址批量处理, Kprobes, Linux Rootkit, LKM, Offensive Security, Rust, TC, Type-2 Hypervisor, XDP, 内核安全, 内核模块, 可视化界面, 安全资源, 恶意代码执行, 文件隐藏, 私有化部署, 系统调用劫持, 网络信息收集, 网络安全, 网络流量审计, 网络连接隐藏, 虚拟化, 请求拦截, 身份验证强制, 逆向工具, 通知系统, 通知系统, 防御规避, 隐私保护, 隐蔽信道, 隐藏进程, 高性能