CHUMENII/COM-UACBypass-Privilege-Escalation

GitHub: CHUMENII/COM-UACBypass-Privilege-Escalation

基于COM elevation monikers和ICMLuaUtil接口实现的Windows UAC绕过工具,可在无用户交互的情况下静默提升至管理员权限执行进程。

Stars: 0 | Forks: 0

# COM BypassUAC - UAC 绕过实现 [![许可证](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![平台](https://img.shields.io/badge/platform-Windows-lightgrey.svg)](https://www.microsoft.com/windows) [![语言](https://img.shields.io/badge/language-C%2B%2B-orange.svg)](https://isocpp.org/) 一个使用 COM (Component Object Model) 提升名字对象 (elevation monikers) 的 Windows UAC (User Account Control) 绕过实现。该项目演示了如何利用 `ICMLuaUtil` 接口在不需要触发标准 UAC 提示的情况下执行具有提升权限的进程。 ## 目录 - [概述](#overview) - [工作原理](#how-it-works) - [架构](#architecture) - [项目结构](#project-structure) - [构建项目](#building-the-project) - [用法](#usage) - [技术细节](#technical-details) - [局限性](#limitations) - [许可证](#license) ## 概述 该项目实现了一种利用 Windows COM 提升名字对象的 UAC 绕过技术。与使用触发 UAC 提示的传统方法不同,该实现使用未公开的 `ICMLuaUtil` COM 接口来执行具有管理员权限的进程。 ### 功能特性 - **静默提权**:无需用户交互即可执行具有提升权限的进程 - **基于 COM**:利用 Windows COM 提升名字对象进行权限提升 - **代码整洁**:结构良好、优化且可读的 C++ 实现 - **RAII 模式**:使用智能守卫实现自动资源管理 - **错误处理**:全面的错误检查与验证 ## 工作原理 该绕过技术的工作流程如下: 1. **COM 初始化**:以单元线程 (apartment-threaded) 模式初始化 COM 库 2. **名字对象创建**:构建格式为 `Elevation:Administrator!new:{CLSID}` 的提升名字对象字符串 3. **对象解析**:使用 `CoGetObject` 解析名字对象并获取提升的 COM 对象 4. **接口访问**:从提升的对象中检索 `ICMLuaUtil` 接口 5. **进程执行**:调用 `ShellExec` 方法以提升的权限启动目标可执行文件 ### 提升名字对象 提升名字对象是一种 Windows 能够识别的特殊 COM 名字对象格式: ``` Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7} ``` 这会指示 Windows 以管理员权限创建指定 CLSID 的实例,从而绕过标准的 UAC 提示。 ## 项目结构 ``` BypassUAC/ │ ├── BypassUAC/ # Main DLL project │ ├── BypassUAC.h # Interface definitions and declarations │ ├── BypassUAC.cpp # Core implementation │ ├── BypassUAC2.cpp # Rundll32 entry point │ ├── BypassUAC.def # DLL export definitions │ ├── dllmain.cpp # DLL entry point │ ├── stdafx.h/cpp # Precompiled headers │ └── targetver.h # Windows version targeting │ ├── Test/ # Test application (optional) │ └── Test.cpp # Test harness │ └── BypassUAC.sln # Visual Studio solution file ``` ### 文件说明 #### BypassUAC.h 包含: - **接口定义**:带有虚函数表的 `ICMLuaUtil` COM 接口结构 - **常量**:CMSTPLUA 组件的 CLSID 和 IID 定义 - **函数声明**:公共 API 函数 #### BypassUAC.cpp 核心实现包含: - **`CoCreateInstanceAsAdmin()`**:创建具有提升权限的 COM 对象 - 使用带有 `CoInitGuard` 的 RAII 模式进行自动 COM 清理 - 在使用前验证所有参数 - 动态构建提升名字对象 - **`CMLuaUtilBypassUAC()`**:主绕过函数 - 验证输入参数 - 将字符串 CLSID/IID 转换为二进制格式 - 创建提升的 COM 对象 - 通过 `ShellExec` 执行目标进程 #### BypassUAC2.cpp Rundll32 入口点: - 导出供 rundll32.exe 调用的 `BypassUAC` 函数 - 当前硬编码为启动 `cmd.exe`(可自行修改) ## 构建项目 ### 前置条件 - **Visual Studio 2022** - **Windows SDK**(Visual Studio 附带) - **Windows 7 或更高版本**(用于测试) ### 构建步骤 1. **打开解决方案** # 在 Visual Studio 中打开 BypassUAC.sln 2. **构建项目** - 按下 `Ctrl+Shift+B` 或使用“生成 → 生成解决方案” - DLL 将生成在 `BypassUAC/[Configuration]/[Platform]/` 目录中 3. **验证输出** - 在输出目录中检查 `BypassUAC2.dll` - 确保没有编译错误或警告 ### 构建配置 项目使用: - **运行时库**:多线程 DLL (`/MD` 或 `/MDd`) - **字符集**:Unicode - **平台工具集**:v140 或更高版本 ## 用法 ### 方法一:使用 Rundll32(当前实现) ``` rundll32.exe BypassUAC2.dll,BypassUAC ``` 这将以提升的权限执行硬编码的命令(`cmd.exe`)。 ### 方法二:编程使用 要在你自己的代码中使用该绕过函数: ``` #include "BypassUAC.h" // Execute a program with elevated privileges BOOL success = CMLuaUtilBypassUAC(L"C:\\Windows\\System32\\notepad.exe"); if (success) { // Process launched successfully with admin rights } else { // Bypass failed - check error codes } ``` ### 方法三:自定义入口点 修改 `BypassUAC2.cpp` 以接受命令行参数: ``` void CALLBACK BypassUAC(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLine, int iCmdShow) { // Parse lpszCmdLine to get target executable // Convert to wide string and call CMLuaUtilBypassUAC() } ``` ## 技术细节 ### COM 接口:ICMLuaUtil `ICMLuaUtil` 接口是一个未公开的 Windows COM 接口,由 Windows UAC 系统在内部使用。主要方法: - **`ShellExec`**:以提升的权限执行进程 HRESULT ShellExec( LPCWSTR lpFile, // 可执行文件路径 LPCTSTR lpParameters, // 命令行参数(可选) LPCTSTR lpDirectory, // 工作目录(可选) ULONG fMask, // 标志(通常为 0) ULONG nShow // 窗口显示状态 (SW_SHOW 等) ); ### CLSID 和 IID - **CLSID_CMSTPLUA**:`{3E5FC7F9-9A51-4367-9063-A120244FBEC7}` - 组件管理器 Shell TPLUA (Trusted Platform Local User Account) - **IID_ICMLuaUtil**:`{6EDD6D74-C007-4E75-B76A-E5740995E24C}` - ICMLuaUtil 的接口标识符 ### 代码优化 该实现包含以下几项优化: 1. **RAII 模式**:`CoInitGuard` 自动管理 COM 初始化/清理 2. **参数验证**:在使用前对所有输入进行验证 3. **提前返回**:快速失败的错误处理减少了嵌套 4. **内存安全**:所有缓冲区的正确初始化和清理 5. **错误传播**:HRESULT 值得到正确传播和检查 ### 关键实现细节 #### CoInitGuard 类 ``` class CoInitGuard { // Automatically initializes COM on construction // Handles RPC_E_CHANGED_MODE gracefully // Automatically uninitializes COM on destruction }; ``` 优点: - 异常安全的资源管理 - 即使提前返回也不会发生内存泄漏 - 优雅地处理已初始化的 COM #### BuildElevationMonikerName 函数 ``` HRESULT BuildElevationMonikerName( REFCLSID rclsid, // Input CLSID LPWSTR monikerName, // Output buffer size_t monikerLength // Buffer size ); ``` 此辅助函数: - 验证输入参数 - 将 CLSID 转换为字符串格式 - 构建提升名字对象字符串 - 使用安全的字符串函数 (`StringCchPrintfW`) ## 局限性 1. **Windows 版本**:可能不适用于所有 Windows 版本 - 已在 Windows 7/8/10/11 上测试 - 不同版本间的行为可能有所不同 2. **UAC 设置**:有效性取决于 UAC 配置 - 如果 UAC 被完全禁用,可能无法正常工作 - 如果 UAC 被设置为“始终通知”,可能无法正常工作 3. **进程完整性**:提升的进程会继承父进程的完整性级别 4. **COM 依赖**:要求 COM 可用且已正确配置 ## 免责声明 本项目仅供教育目的使用。 ## 许可证 本项目采用 MIT 许可证授权。有关更多信息,请参阅 [LICENSE 文件](LICENSE)。
标签:BypassUAC, C++, CoGetObject, COM Elevation Moniker, COM对象, ICMLuaUtil, RAII, UAC绕过, Windows安全机制, 免杀技术, 协议分析, 提权, 数据展示, 数据擦除, 暴力破解检测, 权限提升, 特权执行, 端点可见性, 红队, 组件对象模型, 网络安全, 隐私保护, 静默提权