Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-62215-POC — 针对CVE-2025-62215的概念验证漏洞利用,该漏洞是Windows内核中SepTokenSidSharingEnabled的一个释放后使用(Use-After-Free)漏洞。包含一个内核驱动程序和用户模式漏洞利用,用于竞争条件分析。 | Kitploit
工具/GitHubGitHub/gowonisgood/cve-2025-62215-poc
漏洞分析漏洞利用CTF学习与教育二进制利用
GitHubgowonisgood/cve-2025-62215-poc

CVE-2025-62215-POC

针对CVE-2025-62215的概念验证漏洞利用,该漏洞是Windows内核中SepTokenSidSharingEnabled的一个释放后使用(Use-After-Free)漏洞。包含一个内核驱动程序和用户模式漏洞利用,用于竞争条件分析。

查看仓库
101154个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-62215 — Windows Token UAF(SepTokenSidSharingEnabled 竞态条件)

本仓库仅用于教育和研究目的。

概述

在 Windows 内核的 SepTokenSidSharingEnabled 优化路径中发生的一个 Use-After-Free 漏洞 PoC。

  • 当 NtDuplicateToken 将 SID Values Block 的 RefCount 从 1 增加到 2 时, 一个竞态内核线程通过 ExFreePoolWithTag 释放了该块。
  • 随后 SepDereferenceSidValuesBlock 访问已释放的块 → UAF / Double Free。
root@kitploit:~
[User]  IOCTL_REPLACE_SID_BLOCK  →  在 TOKEN+0x468 处放置一个独立的块 (RefCount=1)
[User]  IOCTL_TRIGGER_FREE       →  生成内核线程(轮询直到 RefCount==2)
[User]  NtDuplicateToken         →  内部将 RefCount 从 1 增加到 2
[Kernel Thread] 检测到 RefCount==2 → ExFreePoolWithTag(pBlock)  ← UAF 点

文件结构

路径描述
exploit/exploitWithDriv/exploitWithDriv.cpp用户模式利用程序(控制台应用)
tokendriv/tokendrv/tokendrv/tokendrv.cpp内核驱动程序(提供 IOCTL 接口)

构建说明(Visual Studio)

先决条件

  • Visual Studio 2022 (MSVC)
  • Windows Driver Kit (WDK) — 构建 tokendriv 时需要
  • SDK 10.0.26100.x 或更高版本

1. tokendriv.sys — 内核驱动程序

  1. 打开 tokendriv/tokendrv/tokendrv.slnx
  2. 配置:Release / x64
  3. 构建 → 生成 tokendriv/tokendrv/x64/Release/tokendrv.sys
  4. 独立部署:只将 .sys 文件复制到虚拟机

安装 WDK 后,验证:项目属性 → Driver Settings → Target OS Version

2. exploitWithDriv.exe — 用户模式利用程序

  1. 打开 exploit/exploitWithDriv.slnx
  2. 配置:Release / x64
  3. 项目属性 → Linker → System → SubSystem:Console
  4. 构建 → 生成 exploit/x64/Release/exploitWithDriv.exe
  5. 对于独立部署(无需 Visual C++ Redistributable):
    • C/C++ → Code Generation → Runtime Library: Multi-threaded (/MT)

在虚拟机上运行

先决条件

  • 虚拟机内存:2 GB 或更少(需要激活 SepTokenSidSharingEnabled 的条件)
  • 测试账户:test / 1234(本地账户,无需管理员权限)
  • 内核调试连接(可选,分析时需要)
  • 管理员 cmd

加载驱动程序

root@kitploit:~
sc create tokendriv type= kernel binpath= "C:\path\to\tokendrv.sys"
sc start tokendriv

验证驱动程序是否正在运行:

root@kitploit:~
sc query tokendriv

状态应为 RUNNING。

运行利用程序

root@kitploit:~
exploitWithDriv.exe

执行流程:

  1. 检查 FullNumberOfPhysicalPages(必须 ≤ 0x83400)
  2. LogonUser("test", ".", "1234") → 获取 hSource
  3. 按 Enter 开始竞态循环(100,000 次迭代)
  4. 每次迭代:REPLACE → TRIGGER → NtDuplicateToken → Sleep(1)

竞态条件分析(WinDbg KD)

1. 获取目标进程地址

root@kitploit:~
0: kd> !process 0 0 exploitWithDriv.exe

示例输出:

root@kitploit:~
PROCESS ffffa88f5e61e080
    SessionId: 1  Cid: 1234    Peb: ...  ParentCid: ...
    Image: exploitWithDriv.exe

ffffa88f5e61e080 是 EPROCESS 地址。

2. 设置断点

以下地址可能因环境而异 — 请根据实际内核符号确认。

A. SID Block RefCount 递增(竞态窗口开始)

root@kitploit:~
0: kd> bp fffff800`725c6114 ".if (@$proc == 0xffffa88f5e61e080) { .echo A_REFCNT_INCR; dq poi(@rsi+0x468)+8 L1; gc } .else { gc }"
  • 打印 TOKEN+0x468 处 SID Values Block 的 RefCount(+0x8)
  • 值从 1 → 2 变化的时刻即为竞态窗口

B. UAF 读取点

root@kitploit:~
0: kd> bp fffff800`726f51fb ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_READ; r rax,rdx; gc } .else { gc }"
  • 读取已释放块的位置
  • 检查 rax、rdx 值

C. UAF 写入点

root@kitploit:~
0: kd> bp fffff800`726f5208 ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_WRITE; r rcx,rdx,rax; gc } .else { gc }"
  • 写入已释放块的位置
  • 检查 rcx、rdx、rax 值以确认破坏情况

3. 竞态时序流程

root@kitploit:~
NtDuplicateToken 入口
    └─ SeTokenCanImpersonate
        └─ SID Block RefCount: 1 → 2        ← bp A (A_REFCNT_INCR)
                                              ← 内核线程:ExFreePoolWithTag(pBlock)
    └─ SepDereferenceSidValuesBlock
        └─ 解引用 pBlock(读取)              ← bp B (REAL_UAF_READ)
        └─ 解引用 pBlock(写入)              ← bp C (REAL_UAF_WRITE)

4. 分析提示

  • 如果在 A_REFCNT_INCR 打印后立即看到 RefCount 为 2,则成功进入竞态窗口
  • 如果出现 REAL_UAF_READ / REAL_UAF_WRITE,则确认实际 UAF 发生
  • 使用池标签 'kcoB' 跟踪分配的块:!pool <addr> 或 !poolused

关键偏移量(Windows 11 24H2)


卸载驱动程序

root@kitploit:~
sc stop tokendriv
sc delete tokendriv


CVE-2025-62215 — Windows Token UAF (SepTokenSidSharingEnabled 레이스 컨디션)

개요

Windows 커널의 SepTokenSidSharingEnabled 최적화 경로에서 발생하는 Use-After-Free 취약점 PoC.

  • NtDuplicateToken 내부에서 SID Values Block의 RefCount가 1→2로 증가하는 순간, 레이스를 걸어 커널 스레드가 해당 블록을 ExFreePoolWithTag로 해제한다.
  • 이후 SepDereferenceSidValuesBlock이 해제된 블록에 다시 접근 → UAF / Double Free.
root@kitploit:~
[User]  IOCTL_REPLACE_SID_BLOCK  →  TOKEN+0x468 에 RefCount=1 독립 블록 배치
[User]  IOCTL_TRIGGER_FREE       →  커널 스레드 시작 (RefCount==2 폴링 대기)
[User]  NtDuplicateToken         →  내부에서 RefCount 1→2
[Kernel Thread] RefCount==2 감지 → ExFreePoolWithTag(pBlock)  ← UAF 지점

구성 파일

경로설명
exploit/exploitWithDriv/exploitWithDriv.cpp유저모드 익스플로잇 (콘솔 앱)
tokendriv/tokendrv/tokendrv/tokendrv.cpp커널 드라이버 (IOCTL 인터페이스 제공)

빌드 방법 (Visual Studio)

공통 사전 조건

  • Visual Studio 2022 (MSVC)
  • Windows Driver Kit (WDK) — tokendriv 빌드 시 필요
  • SDK 10.0.26100.x 이상

1. tokendriv.sys — 커널 드라이버

  1. tokendriv/tokendrv/tokendrv.slnx 열기
  2. 구성: Release / x64
  3. 빌드 → tokendriv/tokendrv/x64/Release/tokendrv.sys 생성
  4. 독립 실행 배포: .sys 파일 하나만 VM으로 복사하면 됨

WDK 설치 후 프로젝트 속성 → Driver Settings → Target OS Version 확인

2. exploitWithDriv.exe — 유저모드 익스플로잇

  1. exploit/exploitWithDriv.slnx 열기
  2. 구성: Release / x64
  3. 프로젝트 속성 → Linker → System → SubSystem: Console
  4. 빌드 → exploit/x64/Release/exploitWithDriv.exe 생성
  5. 독립 실행 배포: Visual C++ Redistributable 없이 동작하도록
    • C/C++ → Code Generation → Runtime Library: Multi-threaded (/MT) 으로 설정

VM 실행 방법

사전 조건

  • VM RAM: 2 GB 이하 (SepTokenSidSharingEnabled 활성화 조건)
  • 테스트 계정: test / 1234 (로컬 계정, 관리자 권한 불필요)
  • Kernel Debugging 연결 (선택, 분석 시 필요)
  • 관리자 권한 cmd

드라이버 로드

root@kitploit:~
sc create tokendriv type= kernel binpath= "C:\path\to\tokendrv.sys"
sc start tokendriv

드라이버 로드 확인:

root@kitploit:~
sc query tokendriv

RUNNING 상태이면 정상.

익스플로잇 실행

root@kitploit:~
exploitWithDriv.exe

실행 흐름:

  1. FullNumberOfPhysicalPages 체크 (0x83400 이하여야 진행)
  2. LogonUser("test", ".", "1234") → hSource 획득
  3. Enter 입력 시 레이스 루프 100,000회 시작
  4. 각 이터레이션: REPLACE → TRIGGER → NtDuplicateToken → Sleep(1)

Race Condition 분석 (WinDbg KD)

1. 분석 대상 프로세스 주소 확인

root@kitploit:~
0: kd> !process 0 0 exploitWithDriv.exe

출력 예시:

root@kitploit:~
PROCESS ffffa88f5e61e080
    SessionId: 1  Cid: 1234    Peb: ...  ParentCid: ...
    Image: exploitWithDriv.exe

ffffa88f5e61e080 부분이 EPROCESS 주소.

2. 브레이크포인트 설정

아래 주소는 환경마다 다를 수 있으므로 실제 커널 심볼로 확인 후 사용.

A. SID Block RefCount 증가 지점 (레이스 윈도우 시작)

root@kitploit:~
0: kd> bp fffff800`725c6114 ".if (@$proc == 0xffffa88f5e61e080) { .echo A_REFCNT_INCR; dq poi(@rsi+0x468)+8 L1; gc } .else { gc }"
  • TOKEN+0x468 에 있는 SID Values Block의 RefCount(+0x8)를 출력
  • 값이 1 → 2로 바뀌는 순간이 레이스 윈도우

B. UAF Read 지점

root@kitploit:~
0: kd> bp fffff800`726f51fb ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_READ; r rax,rdx; gc } .else { gc }"
  • 해제된 블록을 읽는 지점
  • rax, rdx 값 확인

C. UAF Write 지점

root@kitploit:~
0: kd> bp fffff800`726f5208 ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_WRITE; r rcx,rdx,rax; gc } .else { gc }"
  • 해제된 블록에 쓰는 지점
  • rcx, rdx, rax 값으로 오염 여부 확인

3. 레이스 타이밍 흐름

root@kitploit:~
NtDuplicateToken 진입
    └─ SeTokenCanImpersonate
        └─ SID Block RefCount: 1 → 2        ← bp A (A_REFCNT_INCR)
                                              ← 커널 스레드: ExFreePoolWithTag(pBlock)
    └─ SepDereferenceSidValuesBlock
        └─ pBlock 역참조 (읽기)              ← bp B (REAL_UAF_READ)
        └─ pBlock 역참조 (쓰기)              ← bp C (REAL_UAF_WRITE)

4. 분석 팁

  • A_REFCNT_INCR 출력 직후 RefCount가 2이면 레이스 윈도우 진입 성공
  • REAL_UAF_READ / REAL_UAF_WRITE 이 출력되면 실제 UAF 발생 확인
  • Pool tag 'kcoB' 로 할당된 블록 추적: !pool <addr> 또는 !poolused

주요 오프셋 (Windows 11 24H2 기준)


드라이버 제거

root@kitploit:~
sc stop tokendriv
sc delete tokendriv
下载工具
结构偏移量字段
_TOKEN+0x468SepSidValues(SID Values Block 指针)
SID Values Block+0x000Length(ULONG)
SID Values Block+0x008ReferenceCount(LONGLONG)
구조체오프셋필드
_TOKEN+0x468SepSidValues (SID Values Block 포인터)
SID Values Block+0x000Length (ULONG)
SID Values Block+0x008ReferenceCount (LONGLONG)