CHUMENII/COM-UACBypass-Privilege-Escalation
GitHub: CHUMENII/COM-UACBypass-Privilege-Escalation
基于COM elevation monikers和ICMLuaUtil接口实现的Windows UAC绕过工具,可在无用户交互的情况下静默提升至管理员权限执行进程。
Stars: 0 | Forks: 0
# COM BypassUAC - UAC 绕过实现
[](LICENSE)
[](https://www.microsoft.com/windows)
[](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安全机制, 免杀技术, 协议分析, 提权, 数据展示, 数据擦除, 暴力破解检测, 权限提升, 特权执行, 端点可见性, 红队, 组件对象模型, 网络安全, 隐私保护, 静默提权