Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
blackpill — 一个使用自定义类型2虚拟机监控器、eBPF XDP和TC程序的Rust编写的Linux内核rootkit。 | Kitploit
工具/GitHubGitHub/shard77/blackpill
权限提升持久化机制IDS/IPS规避横向移动Shellcode后渗透利用命令与控制红队Payload 开发二进制利用Archived
GitHubshard77/blackpill
3404546个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

blackpill

一个使用自定义类型2虚拟机监控器、eBPF XDP和TC程序的Rust编写的Linux内核rootkit。

查看仓库

BlackPill

BlackPill 是一个用 Rust 编写的隐秘 Linux 内核工具包。

开放问题 提交活动 许可证

特性

该内核工具包由多个模块组成(这里指的是 Rust 模块,而非内核模块):

  • 防御规避:隐藏文件、进程、网络连接等。
  • 钩子:挂钩系统调用和中断描述符表 (IDT)。
  • 虚拟机监控器:创建虚拟机以执行恶意代码。
  • 持久化:使内核工具包在重启后仍可持久化,并具备抗清除能力。
  • 工具:各种实用工具。

架构如下所示:

Rootkit 简单架构示意图

以下是恶意代码从 C2 执行到虚拟机客户机的过程:

Rootkit 代码执行时序图

C2 将精心构造的 x86_64 汇编指令发送到内核工具包,内核工具包再将其发送到虚拟机客户机执行。虚拟机客户机与宿主机隔离,可用于执行恶意代码。

内核无法看到传入的恶意数据包,因为它们被 eBPF XDP 程序过滤并发送到 LKM 模块;传出数据包则由 eBPF TC 程序修改。

[!重要]
该项目仍在开发中。 并非所有功能都能正常工作!
欢迎提交问题或拉取请求。

钩子

钩子是内核工具包的核心功能,通过 Linux 内核中的 kprobes 实现。该技术拦截并重定向系统函数的执行,以监视或修改其行为。在此内核工具包中,kprobes 提供了一种强大的机制,无需直接修改源代码即可与内核函数交互。

防御规避

为确保隐秘性,内核工具包采用了两种主要的反检测机制:

  1. 从内核模块列表中移除模块
    当内核模块被加载时,它会添加到内核的模块列表中,可通过 lsmod 或 /proc/modules 等工具查看。为避免检测:

    • 内核工具包手动将其从该列表中移除。
    • 尽管已从列表中移除,模块仍保持运行状态,从而能继续执行其功能。
  2. 挂钩 filldir64 函数以隐藏特定目录
    为隐藏内核工具包使用的文件,对 filldir64 函数实现了钩子。该函数在进程读取目录内容(例如通过 getdents 或 readdir 系统调用)时被调用。

    • 挂钩过程:
      • 内核工具包使用 kprobes 拦截 filldir64 函数。
      • 在执行期间,处理程序检查返回给用户的目录条目。
      • 如果条目匹配 /BLACKPILL-BLACKPILL 目录(用于存储关键的内核工具包文件),则将其过滤掉,不返回给用户。
      • 所有其他目录条目正常返回,从而确保对用户空间工具透明。
  3. 使用 eBPF XDP 和 TC 程序修改入站和出站网络流量
    为使恶意网络通信正常化,我们使用 eBPF XDP(快速数据路径)和 TC(流量控制)程序。因此,我们可以:

    • 通过匹配来自 C2 的精心构造的 TCP 负载签名,在最低网络层级使用 XDP 程序拦截特定传入(入站)数据包,然后将其重定向到自定义的 BPF 映射,供 VM/LKM 处理。
    • 通过匹配 VM/LKM 生成的 TCP 数据包,使用 TC 程序拦截特定传出(出站)数据包,然后通过用 C2 响应数据覆盖其负载来修改它们。原始数据包将由 TCP 自动重传,保持合法流量的外观。

虚拟机监控器

我们的简易虚拟机监控器按照以下步骤实现:

  1. 初始系统配置

    • 在 BIOS/UEFI 中启用硬件虚拟化扩展(Intel VT-x 或 AMD-V)(内核工具包不执行此操作,必须事先启用)。
    • 配置控制寄存器(CR0、CR4 和 IA32_EFER)以切换到 VMX(Intel 虚拟机扩展)或 SVM(AMD 安全虚拟机)模式。
  2. 进入 VMX 或 SVM 模式

    • 初始化特定于虚拟化的数据结构(Intel 的 VMCS 或 AMD 的 VMCB)。
    • 编程处理器功能,例如 VM 退出,以处理客户机与宿主机之间的交互。
  3. 管理宿主机与客户机之间的切换

    • 配置虚拟机的进入和退出点(VM entry/exit)。
    • 实现逻辑以拦截客户机发出的敏感系统调用并分析其效果。
  4. 创建客户机系统

    • 为客户机分配内存并初始化其资源(寄存器、堆栈等)。
  5. 通信

    • 使用内核工具包与虚拟机监控器之间的通信通道来传输命令或数据。

持久化

持久化是任何内核工具包的关键能力,使其即使在重启后也能保持对目标系统的控制。
在当前实现中,持久化机制通过使用 /bin/touch 命令在文件系统中创建一个测试文件来演示其功能。这个占位操作展示了内核工具包执行特权操作的能力,并且可以扩展以实现更高级的持久化策略。

目前该功能已无用,因为我们的重点不是创建一个 APT 级别的内核工具包,而是更多研究不太常见的概念。

设置开发环境

在编译我们的内核工具包之前,需要完成多个步骤。开发环境包括:

  • 一个提供基本工具的 Alpine Linux 镜像
  • 一个启用了 Rust 的自定义编译内核
  • 一个由 KVM 加速的 QEMU 虚拟机

首先,克隆仓库及其浅层子模块:

root@kitploit:~
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1

重要依赖

在基于 Arch 的发行版上:

root@kitploit:~
sudo pacman -S qemu-base qemu-desktop docker grub

Linux 内核

在基于 Arch 的 Linux 发行版上,安装 Rust 和其他依赖:

root@kitploit:~
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm

然后我们需要 Rust 源码和 bindgen:

root@kitploit:~
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli

确保可以通过在 linux/ 文件夹中运行以下命令来开始编译带 Rust 的内核:

root@kitploit:~
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd

运行首次设置任务,该任务配置并编译内核:

root@kitploit:~
make first-time-setup

[!重要]
如果要求自定义选项,请每次都按 Enter 键。

内核工具包

您可以使用以下命令编译 Rust 内核模块(树外):

root@kitploit:~
make

使用以下命令启动虚拟机:

root@kitploit:~
make vm

在虚拟机内部,您会自动以 root 身份登录。您可以启用模块:

root@kitploit:~
$ modprobe blackpill
# 您可以通过以下命令检查内核日志
$ dmesg

用法

本地权限提升

启动虚拟机后,您可以使用以下命令提升权限:

root@kitploit:~
mkdir ImFeelingRootNow_<PID>

将 <PID> 替换为您要提升权限的进程的进程 ID。

C2

描述

这个简单的 C2 通过 UDP 向受感染机器发送 x86-64 操作码,并接收 TCP 数据包。其功能目前仅限于与机器进行低级交互,但通过更多包装器可能实现大量实际用途。

用法

设置 Python 客户端:

root@kitploit:~
cd blackpill-c2
poetry install
poetry shell
python client.py

使用参数([ip] [port])启动客户端后,您应该会看到:

root@kitploit:~
$ python client.py 0.0.0.0 1339
Connected to rootkit!

然后您可以使用 help 命令显示可用命令:

root@kitploit:~
blackpill: help
可用命令
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 命令                                ┃ 描述                                                    ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address>          │ 读取 'address' 处的 4 字节(32 位)内存                  │
│ write_virt_memory <address> <value> │ 写入 4 字节(32 位)内存到 'address'                      │
│ launch_userland_binary <path>       │ 启动 'path' 处的用户空间二进制文件                        │
│ change_msr <msr> <value>            │ 更改模型特定寄存器(MSR)的值                              │
│ read_phys_memory <address> <value>  │ 读取 'address' 处的 4 字节(32 位)物理内存               │
│ write_phys_memory <address> <value> │ 写入 4 字节(32 位)物理内存到 'address'                  │
│ stop_execution                      │ 停止虚拟机客户机的执行                                    │
│ change_vmcs_field <field> <value>   │ 将 VMCS 字段更改为 'value'                                │
│ help                                │ 显示此帮助消息                                            │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘

致谢

环境设置:

  • 设置用于编写 Rust Linux 内核模块的环境 - Linux 基金会
  • 内核配置 qemu-busybox-min.config 补丁
  • Rust 树外模块
下载工具