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。 __玩得开心!__

## 代码仓库 - 在 GitHub 上: - 在 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架构, 内存破坏, 内核安全, 内核模块开发, 子域名枚举, 客户端加密, 客户端加密, 提权, 攻防演练, 漏洞复现, 系统安全, 网络安全, 跨缓存攻击, 身份验证强制, 释放后使用, 隐私保护, 页表劫持