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.
## 功能
该 rootkit 由多个模块组成(这里指 Rust 模块,而非内核模块):
- **防御规避 (defense evasion)**:隐藏文件、进程、网络连接等。
- **Hooking (挂钩)**:Hook 系统调用和 IDT。
- **Hypervisor (虚拟机管理程序)**:创建虚拟机以执行恶意代码。
- **Persistence (持久化)**:使 rootkit 在重启后保持持久性,并能抵抗清除操作。
- **工具 (utils)**:各种实用工具。
架构如下所示:

以下是从 C2 到 VM Guest 执行恶意代码的流程:

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, 内核安全, 内核模块, 可视化界面, 安全资源, 恶意代码执行, 文件隐藏, 私有化部署, 系统调用劫持, 网络信息收集, 网络安全, 网络流量审计, 网络连接隐藏, 虚拟化, 请求拦截, 身份验证强制, 逆向工具, 通知系统, 通知系统, 防御规避, 隐私保护, 隐蔽信道, 隐藏进程, 高性能