Muz1K1zuM/kslkatz_bof
GitHub: Muz1K1zuM/kslkatz_bof
KslBOF 是一个 Havoc C2 的 BOF 模块,通过 KslD.sys 驱动的 BYOVD 物理内存读取原语,在不触发常规 API 监控的情况下从 lsass 提取凭据。
Stars: 119 | Forks: 12
# KslBOF — 用于 Havoc C2 的 BYOVD BOF 套件
## 概述
KslBOF 是一个用于 [Havoc C2](https://github.com/HavocFramework/Havoc) 框架的 Beacon Object File (BOF),实现了 **KslD.sys BYOVD 物理内存读取原语**,用于凭据提取。
这是将 KslD.sys 技术移植到 Havoc BOF 格式,基于 [KslKatz](https://github.com/ne1llee/xxx) 及相关的公开研究。原始技术使用 KslD.sys —— 一个由 Windows Defender 附带并经 Microsoft 签名的内核驱动程序 —— 来读取 lsass 内存,而无需打开该进程的句柄。
## 有何不同之处
现有的 KslD.sys 技术实现都是独立的可执行文件。KslBOF 将相同的原语实现为 **Beacon Object File**:
- 完全在 beacon 进程内运行 —— 不会生成新进程
- 除了系统上已存在的驱动程序外,不会在磁盘上留下任何文件
- 与 Havoc C2 的任务分配和输出原生集成
## 驱动程序版本 —— 存在漏洞 vs 已修补
Microsoft 通过清零 `MmCopyMemory` 修补了正在运行的 KslD.sys 版本,但**将旧的易受攻击版本保留在磁盘上**。大多数系统上同时存在这两个版本:
| 路径 | 大小 | 状态 |
|------|------|--------|
| `%SystemRoot%\System32\drivers\KslD.sys` | 333,216 字节 | **存在漏洞** |
| `%ProgramData%\Microsoft\Windows Defender\Platform\\wd\KslD.sys` | ~82 KB | 已修补 |
该套件通过在加载前替换 SCM `ImagePath`,使用 `System32\drivers\` 中的存在漏洞的版本。
**验证存在漏洞的版本是否存在:**
```
Get-Item "$env:SystemRoot\System32\drivers\KslD.sys" | Select-Object Name, Length
Get-FileHash "$env:SystemRoot\System32\drivers\KslD.sys" -Algorithm SHA256
```
**预期输出:**
```
Name Length
---- ------
KslD.sys 333216
Algorithm Hash
--------- ----
SHA256 BD17231833AA369B3B2B6963899BF05DBEFD673DB270AEC15446F2FAB4A17B5A
```
## 为什么没有 CVE
KslD.sys 漏洞已报告给 Microsoft MSRC,并被关闭为**“不是漏洞”** —— 因为该攻击需要预先具有管理员权限。没有分配 CVE,没有发布修复程序,该驱动程序仍保留在磁盘上。
该技术的价值在于**隐蔽性**,而不是权限提升。EDR 会监控 lsass 上的 `OpenProcess`、`NtReadVirtualMemory` 和 `MiniDumpWriteDump`。这里没有调用其中的任何一个。
## BOF 模块
### `ksl_lsa.o` — 凭据提取
将 KslD.sys 凭据提取技术移植到 Havoc BOF 格式。
从 lsass 内存中提取凭据,而无需在 lsass 上调用 `OpenProcess` 或使用任何标准的转储 API。没有 lsass 的句柄,没有 `NtReadVirtualMemory`,没有 `MiniDumpWriteDump`。
**提取的内容:**
- MSV1_0 NT 哈希(感知构建版本的偏移量)
- WDigest 明文密码(启用时,支持 Win11 24H2 的多签名)
- AES-256 / 3DES LSA 加密密钥
- Credential Guard 检测(`isIso` 标志)
**支持的构建版本:** Windows 7/8/10/11(包括 24H2 Build 26200+)、Server 2016–2022
**PrimaryCredential 偏移量:**
```
Win11 24H2 (>= 26100): isIso=0x28 NT=0x46 LM=0x56 SHA1=0x66
Win11 (>= 22000): isIso=0x40 NT=0x46 LM=0x56 SHA1=0x66
Win10 (>= 9600): isIso=0x28 NT=0x4a LM=0x5a SHA1=0x36
Win7/8 (< 9600): isIso=0x28 NT=0x38 LM=0x48 SHA1=0x18
```
**用法:**
```
inline-execute /path/to/out/ksl_lsa.o
```
## Credential Guard
当 Credential Guard (VBS) 处于活动状态时,域凭据将被隔离在物理内存原语无法访问的 Hyper-V enclave 中。该模块会检测此情况(`isIso=1`)并进行报告。
**CG 保护的内容:** 域 NTLM 哈希、Kerberos TGT、交互式域会话凭据。
**CG 不保护的内容:** 本地账户、LSA Secrets、服务账户凭据。
## 技术架构
### 击败 KASLR
```
SubCmd 2 → IDTR → IDT → minimum ISR → scan backwards → ntoskrnl base
Fallback: NtQuerySystemInformation(SystemModuleInformation)
```
### EPROCESS 发现
```
OpenProcess(PID 4) → NtQuerySystemInformation(class 16)
→ handle table → SYSTEM EPROCESS
→ ActiveProcessLinks walk → lsass
→ DTB from EPROCESS+0x028
→ UserDTB from EPROCESS+0x388 (KPTI, Win10 1809+)
```
所有 EPROCESS 偏移量都是动态检测的 —— 没有硬编码的值。
### 物理内存读取限制
KslD.sys 具有大约 **4GB 物理地址**的内部物理内存读取限制。在内存更大的系统上,用户态进程的 DTB 通常会超过此限制。通过 `virt_read` 进行的内核 VA 读取不受影响 —— `ksl_lsa.o` 无论系统内存大小如何都能正常工作,因为它通过内核 VA 运行。
## 构建
**要求:** `x86_64-w64-mingw32-gcc`
```
make clean && make ksl_lsa
```
## 仓库结构
```
KslBOF/
├── include/
│ ├── beacon.h
│ └── common_bof.h
├── src/
│ ├── bof_crt.c
│ ├── ksl_driver_bof.c
│ ├── ksl_memory_bof.c
│ ├── ksl_crypto_bof.c
│ ├── ksl_lsa_bof.c
│ ├── ksl_lsa_go.c
│ ├── ksl_wdigest_bof.c
│ └── ksl_all_in_one_lsa.c
├── out/
│ └── ksl_lsa.o
└── Makefile
```
## 路线图
- `ksl_edr.o` — EDR 进程侦察 + inline hook 扫描器 — *测试中*
- `ksl_ssdt.o` — SSDT 内核 hook 扫描器 — *测试中*
## 检测注意事项
- 针对 Defender 更新上下文之外的 KslD 服务启动发出警报
- 监控 `HKLM\SYSTEM\CurrentControlSet\Services\KslD` 下的 `AllowedProcessName` 修改
- lsass 上不会生成 `OpenProcess` 事件 —— 检测必须重点关注驱动程序的加载
- Credential Guard 处于活动状态时会阻止域凭据提取
## 免责声明
本工具仅用于授权的安全测试和教育目的。请仅在您拥有或获得明确书面测试许可的系统上使用。
## Credential Guard
当 Credential Guard (VBS) 处于活动状态时,域凭据将被隔离在物理内存原语无法访问的 Hyper-V enclave 中。该模块会检测此情况(`isIso=1`)并进行报告。
**CG 保护的内容:** 域 NTLM 哈希、Kerberos TGT、交互式域会话凭据。
**CG 不保护的内容:** 本地账户、LSA Secrets、服务账户凭据。
## 技术架构
### 击败 KASLR
```
SubCmd 2 → IDTR → IDT → minimum ISR → scan backwards → ntoskrnl base
Fallback: NtQuerySystemInformation(SystemModuleInformation)
```
### EPROCESS 发现
```
OpenProcess(PID 4) → NtQuerySystemInformation(class 16)
→ handle table → SYSTEM EPROCESS
→ ActiveProcessLinks walk → lsass
→ DTB from EPROCESS+0x028
→ UserDTB from EPROCESS+0x388 (KPTI, Win10 1809+)
```
所有 EPROCESS 偏移量都是动态检测的 —— 没有硬编码的值。
### 物理内存读取限制
KslD.sys 具有大约 **4GB 物理地址**的内部物理内存读取限制。在内存更大的系统上,用户态进程的 DTB 通常会超过此限制。通过 `virt_read` 进行的内核 VA 读取不受影响 —— `ksl_lsa.o` 无论系统内存大小如何都能正常工作,因为它通过内核 VA 运行。
## 构建
**要求:** `x86_64-w64-mingw32-gcc`
```
make clean && make ksl_lsa
```
## 仓库结构
```
KslBOF/
├── include/
│ ├── beacon.h
│ └── common_bof.h
├── src/
│ ├── bof_crt.c
│ ├── ksl_driver_bof.c
│ ├── ksl_memory_bof.c
│ ├── ksl_crypto_bof.c
│ ├── ksl_lsa_bof.c
│ ├── ksl_lsa_go.c
│ ├── ksl_wdigest_bof.c
│ └── ksl_all_in_one_lsa.c
├── out/
│ └── ksl_lsa.o
└── Makefile
```
## 路线图
- `ksl_edr.o` — EDR 进程侦察 + inline hook 扫描器 — *测试中*
- `ksl_ssdt.o` — SSDT 内核 hook 扫描器 — *测试中*
## 检测注意事项
- 针对 Defender 更新上下文之外的 KslD 服务启动发出警报
- 监控 `HKLM\SYSTEM\CurrentControlSet\Services\KslD` 下的 `AllowedProcessName` 修改
- lsass 上不会生成 `OpenProcess` 事件 —— 检测必须重点关注驱动程序的加载
- Credential Guard 处于活动状态时会阻止域凭据提取
## 免责声明
本工具仅用于授权的安全测试和教育目的。请仅在您拥有或获得明确书面测试许可的系统上使用。标签:BOF, BYOVD, Web报告查看器, 客户端加密, 欺骗防御