a13xp0p0v/kernel-hack-drill
GitHub: a13xp0p0v/kernel-hack-drill
Linux 内核漏洞利用实验靶场,提供可控漏洞模块和多种利用技术的教学示例。
Stars: 385 | Forks: 49
# Linux 内核利用实验
这是一个用于 Linux 内核利用实验的演练场。
仅包含基础方法。只为图一乐。
__目录:__
| __文件__ | __描述__ |
| -------- | --------------- |
| __drill_mod.c__ | 一个小型 Linux 内核模块,提供 `/proc/drill_act` 文件作为简单的用户态接口;该模块包含可控且可用于实验的漏洞 |
| __drill.h__ | 描述 `drill_mod.ko` 接口的头文件 |
| __drill_test.c__ | 针对 `drill_mod.ko` 的用户态测试,提供了使用 `/proc/drill_act` 的示例;该测试不会触发 `drill_mod.ko` 中的内存破坏,并且在 `CONFIG_KASAN=y` 时可以通过 |
| __drill_uaf_callback.c__ | 一个基础的 UAF 利用程序,在已释放的 `drill_item_t` 结构中调用回调函数;它劫持控制流并获得 LPE |
| __drill_uaf_callback_rop_smep.c__ | `drill_uaf_callback.c` 的改进版本,增加了 ROP 链以在 `x86_64` 上绕过 SMEP 和页表隔离 |
| __drill_uaf_callback_rop_smap.c__ | `drill_uaf_callback_rop_smep.c` 的改进版本,将 ROP 链放置在内核空间,以便在 `x86_64` 上同时绕过 SMAP |
| __drill_uaf_w_msg_msg.c__ | 一个基础的 UAF 利用程序,向已释放的 `drill_item_t` 写入数据;它使用跨缓存攻击(cross-cache attack)并覆盖 `msg_msg.m_ts`,从而能够越界读取内核内存 |
| __drill_uaf_w_pipe_buffer.c__ | 一个基础的 UAF 利用程序,向已释放的 `drill_item_t` 写入数据;它执行跨缓存攻击并覆盖 `pipe_buffer.flags` 以实现 Dirty Pipe 技术并获得 LPE |
| __drill_uaf_w_pte.c__ | 一个基础的 UAF 利用程序,向已释放的 `drill_item_t` 写入数据;它执行跨分配器攻击(cross-allocator attack)并覆盖页表项(PTE)以实现 Dirty Pagetable 技术并在 `x86_64` 上获得 LPE |
| __drill_uaf_w_pud.c__ | `drill_uaf_w_pte.c` 的改进版本,覆盖页目录指针表(PDPT)中的条目,在 Linux 内核中称为页上级目录(PUD);这允许通过大页(huge pages)实现 Dirty Pagetable 攻击 |
注意:这里只有基础的利用技术。
对于其中某些技术,需要禁用 Linux 内核安全加固
(参见 [故障排除](https://github.com/a13xp0p0v/kernel-hack-drill?tab=readme-ov-file#troubleshooting))。
许可证:GPL-3.0。
__玩得开心!__
- 在 Codeberg 上: (如果 GitHub 出问题就去这里)
- 在 SourceCraft 上:
## 设置指南
### 方案 I:在 Ubuntu Server 24.04 虚拟机上运行
准备工具链:
```
sudo apt install git make gcc
```
获取 `kernel-hack-drill` 源代码:
```
git clone https://github.com/a13xp0p0v/kernel-hack-drill.git
```
编译 `drill_mod.ko` 内核模块及其他二进制文件:
```
cd kernel-hack-drill
make
```
安装并测试 `drill_mod.ko`:
```
sudo insmod drill_mod.ko
./drill_test
```
确保你在输出中看到这三行:
```
[+] drill_act is opened
[...]
[+] looks like normal functionality in drill.ko works fine
[...]
[+] looks like error handling in drill.ko works fine
```
完成!现在你可以尝试针对 `drill_mod.ko` 漏洞的 PoC 漏洞利用程序了。
### 方案 II:在自建虚拟机上运行
#### 1. 使用 `debootstrap` 创建 rootfs 镜像
创建一个基础的 `Debian Bookworm` rootfs 镜像:
```
cd ~ && touch rootfs.img
dd if=/dev/zero of=rootfs.img bs=1M count=2048
mkfs.ext4 rootfs.img
sudo mkdir /mnt/rootfs
sudo mount rootfs.img /mnt/rootfs
sudo apt install debian-archive-keyring
sudo debootstrap bookworm /mnt/rootfs http://deb.debian.org/debian/
# chroot 到 /mnt/rootfs 并进行额外调整,例如添加用户
sudo umount /mnt/rootfs
```
#### 2. 准备 Linux 内核
获取必要的工具:
```
sudo apt install git make gcc flex bison libncurses5-dev libssl-dev libelf-dev dwarves xz-utils zstd
```
从 https://kernel.org 获取压缩包,或使用 `git` 获取源代码:
```
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ~/linux
```
创建内核配置:
```
make defconfig
```
对于基于 Debian 的 rootfs,启用所需的选项:
```
./scripts/config -e CONFIG_CONFIGFS_FS -e CONFIG_SECURITYFS
```
构建内核:
```
make -j`nproc`
```
#### 3. 准备 `drill_mod.ko` 内核模块
获取 `kernel-hack-drill` 源代码:
```
git clone https://github.com/a13xp0p0v/kernel-hack-drill.git
```
构建:
```
cd kernel-hack-drill
KPATH=~/linux/ make
```
这里的 `KPATH` 环境变量包含我们之前获取的 Linux 内核源代码的路径。
#### 4. 启动虚拟机
使用 `qemu-system-x86_64` 运行虚拟机:
```
qemu-system-x86_64 \
-s \
-enable-kvm \
-m 2G \
-cpu qemu64 \
-smp 2 \
-drive file=~/rootfs.img \
-net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
-net nic,model=e1000 \
-nographic \
-no-reboot \
-kernel ~/linux/arch/x86/boot/bzImage \
-append "console=ttyS0 earlyprintk=serial net.ifnames=0 root=/dev/sda" \
-pidfile vm.pid \
2>&1 | tee vm.log
```
#### 5. 安装并测试 `drill_mod.ko`
通过 `ssh` 传输构建好的文件:
```
scp -r -P 10021 kernel-hack-drill user@localhost:/home/user/.
```
使用 `insmod` 安装模块:
```
user@hostname ~> sudo insmod drill_mod.ko
[sudo] password for user:
[ 23.925524] drill_mod: loading out-of-tree module taints kernel.
[ 23.928631] drill: start hacking
user@hostname ~>
```
运行测试:
```
./drill_test
```
确保你在输出中看到这三行:
```
[+] drill_act is opened
[...]
[+] looks like normal functionality in drill.ko works fine
[...]
[+] looks like error handling in drill.ko works fine
```
完成!现在你可以尝试针对 `drill_mod.ko` 漏洞的 PoC 漏洞利用程序了。
### 故障排除
#### 处理版本不匹配问题
某天,你可能会遇到这样的错误:
```
user@hostname ~> sudo insmod drill.ko
insmod: ERROR: could not insert module drill.ko: Invalid module format
user@hostname ~ [1]>
```
在这种情况下,请确保:
1. 在使用 `git` 获取新内核后,你已经重新构建了模块。
2. 你的内核路径没有改变,并且 `KPATH` 环境变量包含正确的路径。
#### 调试 PoC 漏洞利用程序
首先,检查哪些内核加固机制可能会干扰攻击。
`kernel-hack-drill` 中的每个 PoC 漏洞利用程序都会在顶部注释中提供此信息。
例如,带有简单堆喷射(heap spraying)的基础 `ret2usr` 攻击需要以下条件:
```
* 1) Compile the Linux kernel without:
* - CONFIG_SLAB_BUCKETS
* - CONFIG_RANDOM_KMALLOC_CACHES
*
* 2) Disable mitigations:
* - run qemu with "-cpu qemu64,-smep,-smap".
* - run the kernel with "pti=off nokaslr".
```

标签:0day挖掘, Dirty Pagetable, Dirty Pipe, KASAN, Linux内核, LPE, ROP链, SMAP绕过, SMEP绕过, TGT, UAF, Web报告查看器, x86_64架构, 内存破坏, 内核安全, 内核模块开发, 子域名枚举, 客户端加密, 客户端加密, 提权, 攻防演练, 漏洞复现, 系统安全, 网络安全, 跨缓存攻击, 身份验证强制, 释放后使用, 隐私保护, 页表劫持