glslang/win-kexp
GitHub: glslang/win-kexp
win-kexp 是一个用于 Windows 内核漏洞利用研究的 Rust 工具库,集成了 shellcode 生成、进程注入、ROP 链构建、内核池辅助及调试引擎封装等功能。
Stars: 1 | Forks: 0
# win-kexp  [](https://codecov.io/gh/glslang/win-kexp) [](https://deps.rs/repo/github/glslang/win-kexp)
`win-kexp` 是一个用于 Windows 内核漏洞利用研究的 Rust 2024 库。它收集了 shellcode 辅助工具、进程注入实用程序、ROP-chain 工具、内核池辅助工具、Win32k 包装器以及 Windows Debug Engine 集成,专为受控的 x86_64 和 ARM64 实验室环境设计。
## 安全范围
此仓库旨在用于隔离的 Windows 测试系统中的漏洞利用研究。请勿在您不拥有或未获得明确测试许可的系统上运行这些示例或 payload。
## 功能
- **Shellcode**:token 窃取、ACL 编辑以及生成 `cmd.exe` 的 payload。
- **汇编回退**:在汇编器可用时使用 MASM/ARMASM 构建的 shellcode,否则使用硬编码的字节数组。
- **进程实用程序**:进程查找、远程内存分配、shellcode 写入以及 `CreateRemoteThread` 启动。
- **ROP 辅助工具**:链编写宏以及用于 gadget 查找的可执行 PE 节扫描。
- **内核工具**:池辅助工具、Win32k/设备 I/O 包装器以及驱动程序基址发现。
- **Debug engine**:用于本地/内核附加、命令执行、断点、符号、dump、跟踪以及会话清理的 `dbgeng` 包装器。
## 要求
- Windows x86_64 或 Windows ARM64。
- 用于正常构建的 Rust stable 和用于 Miri 的 nightly。
- MSVC 构建工具。
- 可选汇编器:用于 x86_64 的 `ml64` 或用于 ARM64 的 `armasm64`。
- 可选本地测试运行器:`cargo nextest`。
实际上,此 crate 仅限 Windows 使用,因为公共模块直接调用了 Windows API。CI 使用 [`glslang/setup-masm`](https://github.com/glslang/setup-masm) 安装汇编器。在没有汇编器的情况下进行本地构建时,会静默启用 `shellcode_fallback` cfg 路径。
## 构建与测试
```
# 为活动的 Windows target 进行 build。
cargo build --verbose
# 为 Windows 23H2 build ARM64 shellcode。默认为 24H2。
WINDOWS_VERSION=23H2 cargo build --target aarch64-pc-windows-msvc
# 匹配 CI formatter gate。
cargo fmt --all -- --check
# 首选的 test runner。
cargo nextest run --verbose
# 备用的 test runner。
cargo test
# CI 使用的 nightly unsafe-code check。
cargo miri test --verbose
```
受支持的 ARM64 shellcode 版本为 `23H2` 和 `24H2`;未设置 `WINDOWS_VERSION` 时默认为 `24H2`。
## 模块
| 模块 | 用途 |
|---|---|
| `shellcode` | Payload 加载器和回退字节数组。 |
| `process` | 目标进程发现和远程 shellcode 执行。 |
| `rop` | ROP 宏以及 PE 可执行节和 gadget 搜索辅助工具。 |
| `pool` | 用于内核池塑造实验的匿名管道辅助工具。 |
| `win32k` | 设备句柄、IOCTL 辅助工具、内存分配辅助工具以及内核驱动程序查找。 |
| `dbgeng` | Windows Debug Engine 会话、命令、断点、符号、dump 和跟踪。 |
| `util` | 暂停、调试中断和字节格式化辅助工具。 |
## Shellcode 流水线
汇编源代码位于 `src/asm/`。在 Windows 上,`build.rs` 会检查目标汇编器:
- 如果找到,`.asm` 文件将被编译为 COFF `.obj` 文件,并由 `goblin` 提取可执行字节。
- 如果缺失,则会 emit `cargo:rustc-cfg=feature="shellcode_fallback"` 并使用 `src/shellcode.rs` 中匹配的字节数组。
`test_shellcodes_match_fallback` 验证汇编后的 payload 与回退字节是否匹配。修改 `src/asm/` 时,请更新 `src/shellcode.rs` 中相应的回退字节数组。
可用的 payload:
| 函数 | 架构 | 描述 |
|---|---:|---|
| `token_stealing_shellcode()` | x86_64, ARM64 | 将 SYSTEM token 复制到当前进程。 |
| `acl_edit_shellcode()` | x86_64, ARM64 | 编辑当前进程的 ACL。 |
| `spawn_cmd_shellcode()` | x86_64, ARM64 | 解析 `CreateProcessA` 并生成 `cmd.exe`。 |
| `token_stealing_shellcode_smep_no_kvashadow()` | x86_64 | 绕过 SMEP 的 token 窃取。 |
| `token_stealing_shellcode_smep_no_kvashadow_pte()` | x86_64 | 绕过基于 PTE 的 SMEP 的 token 窃取。 |
## 用法示例
```
use win_kexp::process::inject_shellcode_to_target_process;
use win_kexp::shellcode::token_stealing_shellcode;
let shellcode = token_stealing_shellcode();
let pid = inject_shellcode_to_target_process("target.exe", &shellcode);
println!("started remote thread in pid {pid}");
```
```
use win_kexp::rop::{find_gadget_offset, get_executable_sections};
let sections = get_executable_sections(ntoskrnl_module)?;
let pop_rax_ret = find_gadget_offset(§ions, &[0x58, 0xC3], ntoskrnl_base);
```
有关调试器冒烟测试,请参见 `examples/kdtest.rs`:
```
cargo run --example kdtest -- "net:port=50000,key=w.x.y.z"
```
## CI
该仓库使用仅限 Windows 的 GitHub Actions 工作流:
| 工作流 | 功能说明 |
|---|---|
| `ci.yml` | 在 `windows-latest` 和 `windows-11-arm` 上运行 `cargo fmt --all -- --check`、`cargo build --verbose` 以及 `cargo nextest run --verbose`。 |
| `coverage.yml` | 运行带有插桩的 `cargo test`,使用 `grcov` 生成 LCOV,并上传至 Codecov。 |
| `miri.yml` | 在 nightly 上使用 `-Zmiri-disable-isolation -Zmiri-ignore-leaks` 运行 `cargo miri test --verbose`。 |
## 贡献
使用 `rustfmt` 默认设置,并保持较小的非安全 Windows FFI 代码块。在 `#[cfg(test)]` 下的代码旁边添加专注的单元测试;现有的测试名称使用 `test_*`。提交主题使用小写前缀,例如 `fix:`、`feat:`、`docs:`、`style:`、`refactor:`、`test:`、`perf:` 和 `chore:`。
标签:Hakrawler, ROP, Rust, Shellcode, Windows内核, 云资产清单, 可视化界面, 技术调研, 白帽子, 端点可见性, 网络流量审计, 调试引擎, 逆向工程, 通知系统