# uac_bypass_C++ **Repository Path**: cutecuteyu/uacbypass-cpp ## Basic Information - **Project Name**: uac_bypass_C++ - **Description**: uac_bypass_C++ - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-11-09 - **Last Updated**: 2025-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # UAC绕过技术研究项目 本项目提供了三种不同的Windows用户账户控制(UAC)绕过技术实现,分别基于令牌复制、白名单利用和WMI服务。 > DLL劫持的没有做,实战中推荐大家手动操作 ## 项目概述 UAC(用户账户控制)是Windows系统的安全机制,旨在防止未经授权的系统更改。本项目展示了三种绕过UAC的技术方法,帮助安全研究人员了解UAC机制的工作原理和潜在安全风险。 **注意:本项目仅供学习和研究目的,请勿用于非法用途。** ## 方法一:令牌绕过 (Token Bypass) ### 底层原理 令牌绕过技术基于Windows的安全令牌机制。每个进程都有一个关联的安全令牌,定义了该进程的安全上下文和权限。通过复制高权限进程的令牌并创建新进程,可以实现权限提升而不触发UAC提示。 ### 代码细节 #### 核心函数 1. **FindHighPrivilegeToken()** - 查找高权限令牌 - 遍历系统进程,寻找具有高权限的进程 - 检查进程令牌的完整性级别和权限 - 返回符合条件的进程句柄和令牌句柄 2. **BypassUACWithToken()** - 执行令牌绕过 - 支持两种模式:令牌复制和令牌模拟 - 创建新进程并应用高权限令牌 - 设置进程创建标志和安全性描述符 #### 关键代码片段 ```cpp // 查找高权限进程 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processId); HANDLE hToken; if (OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_QUERY, &hToken)) { // 检查令牌权限 TOKEN_ELEVATION_TYPE elevationType; DWORD dwSize; if (GetTokenInformation(hToken, TokenElevationType, &elevationType, sizeof(elevationType), &dwSize)) { if (elevationType == TokenElevationTypeFull) { // 找到高权限令牌 return hToken; } } } ``` ### 运行方法 1. 编译项目: ```bash g++ -o token_bypass.exe token_bypass.cpp -ladvapi32 -lole32 ``` 2. 运行程序: ```bash # 默认启动cmd.exe token_bypass.exe # 启动指定程序 token_bypass.exe powershell.exe token_bypass.exe notepad.exe token_bypass.exe regedit.exe token_bypass.exe compmgmt.msc token_bypass.exe control.exe # 启动自定义程序 token_bypass.exe "C:\Program Files\MyApp\myapp.exe" # 显示帮助信息 token_bypass.exe -h ``` 3. 程序将自动检测当前权限状态,如果无管理员权限则尝试令牌绕过UAC。 ## 方法二:白名单绕过 (Whitelist Bypass) ### 底层原理 Windows系统维护了一个UAC白名单,包含一些可信的应用程序。这些应用程序在运行时不会触发UAC提示。通过检测系统中存在的白名单程序并利用它们来执行代码,可以实现UAC绕过。 ### 代码细节 #### 核心函数 1. **预定义白名单程序列表** - 包含常见的系统工具和应用程序路径 - 如eventvwr.exe、compmgmt.msc、sdclt.exe等 2. **LaunchElevatedProgramWithVerification()** - 启动提升程序 - 检查目标程序是否存在 - 验证程序完整性 - 使用ShellExecute以管理员权限启动程序 #### 关键代码片段 ```cpp // 白名单程序路径数组 const wchar_t* whitelistedPrograms[] = { L"C:\\Windows\\System32\\eventvwr.exe", L"C:\\Windows\\System32\\compmgmt.msc", L"C:\\Windows\\System32\\sdclt.exe", // ... 更多程序路径 }; // 检查程序存在性 for (int i = 0; i < sizeof(whitelistedPrograms) / sizeof(whitelistedPrograms[0]); i++) { if (PathFileExists(whitelistedPrograms[i])) { // 程序存在,尝试启动 ShellExecute(NULL, L"runas", whitelistedPrograms[i], NULL, NULL, SW_SHOW); break; } } ``` ### 运行方法 1. 编译项目: ```bash g++ -o whitelist_bypass.exe whitelist_bypass.cpp -lshlwapi -ladvapi32 ``` 2. 运行程序: ```bash # 默认启动cmd.exe whitelist_bypass.exe # 启动指定程序 whitelist_bypass.exe powershell.exe whitelist_bypass.exe notepad.exe whitelist_bypass.exe regedit.exe whitelist_bypass.exe compmgmt.msc whitelist_bypass.exe control.exe # 启动自定义程序 whitelist_bypass.exe "C:\Program Files\MyApp\myapp.exe" # 显示帮助信息 whitelist_bypass.exe -h ``` 3. 程序将检测系统中的白名单程序并尝试以提升权限启动目标程序。 ## 方法三:WMI绕过 (WMI Bypass) ### 底层原理 WMI(Windows Management Instrumentation)是Windows的系统管理框架。通过WMI服务创建进程可以绕过某些UAC检查,因为WMI服务本身运行在较高的权限级别。 ### 代码细节 #### 核心函数 1. **InitializeCOM()** - 初始化COM组件 - 调用CoInitializeSecurity设置安全级别 - 初始化COM库 2. **ConnectToWMIService()** - 连接WMI服务 - 创建WMI定位器 - 连接到本地WMI命名空间 3. **CreateProcessViaWMI()** - 通过WMI创建进程 - 使用WMI的Win32_Process类 - 调用Create方法创建新进程 #### 关键代码片段 ```cpp // 初始化COM HRESULT hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); // 连接WMI服务 IWbemLocator* pLoc = NULL; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); // 创建进程 IWbemClassObject* pClass = NULL; hr = pSvc->GetObject(L"Win32_Process", 0, NULL, &pClass, NULL); IWbemClassObject* pInParams = NULL; hr = pClass->GetMethod(L"Create", 0, &pInParams, NULL); ``` ### 运行方法 1. 编译项目: ```bash g++ -o wmi_bypass.exe wmi_bypass.cpp -lole32 -loleaut32 -lwbemuuid -ladvapi32 ``` 2. 运行程序: ```bash # 默认启动cmd.exe wmi_bypass.exe # 启动指定程序 wmi_bypass.exe powershell.exe wmi_bypass.exe notepad.exe wmi_bypass.exe regedit.exe wmi_bypass.exe compmgmt.msc wmi_bypass.exe control.exe # 启动自定义程序 wmi_bypass.exe "C:\Program Files\MyApp\myapp.exe" # 显示帮助信息 wmi_bypass.exe -h ``` 3. 程序将通过WMI服务创建提升权限的进程。 ## 方法四:UAC绕过条件检测工具 ### 底层原理 此工具专门用于检测UAC绕过的可利用条件,而不执行实际的绕过操作。它帮助安全研究人员评估Windows系统的漏洞状况,通过检查不同UAC绕过技术所需的各种条件。 ### 代码细节 #### 核心函数 1. **DetectWhitelistBypass()** - 检测白名单绕过条件 - 检查UAC状态 - 验证常见UAC白名单程序的存在性 - 报告可用的白名单程序 2. **DetectTokenBypass()** - 检测令牌绕过条件 - 检查UAC状态 - 扫描系统进程以查找提升权限的进程 - 识别具有可用令牌的高权限进程 3. **DetectWMIBypass()** - 检测WMI绕过条件 - 检查UAC状态 - 验证COM库可用性 - 测试WMI服务连接性 - 验证WMI命名空间访问 4. **ShowDetectionSummary()** - 生成综合检测报告 - 汇总所有检测到的条件 - 为每种绕过方法提供可行性评估 #### 关键代码片段 ```cpp // 检查UAC状态 bool IsUACEnabled() { HKEY hKey; DWORD dwUACEnabled = 1; DWORD dwSize = sizeof(DWORD); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { RegQueryValueExW(hKey, L"EnableLUA", NULL, NULL, (LPBYTE)&dwUACEnabled, &dwSize); RegCloseKey(hKey); } return (dwUACEnabled != 0); } // 检查进程提升状态 bool IsProcessElevated(DWORD processId) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processId); if (!hProcess) { return false; } HANDLE hToken; BOOL isElevated = FALSE; if (OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { TOKEN_ELEVATION elevation; DWORD size; if (GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &size)) { isElevated = elevation.TokenIsElevated; } CloseHandle(hToken); } CloseHandle(hProcess); return isElevated; } ``` ### 运行方法 1. 编译项目: ```bash g++ -o detect.exe detect.cpp -lshlwapi -ladvapi32 -lole32 -loleaut32 -lwbemuuid ``` 2. 运行程序: ```bash # 运行检测工具 detect.exe ``` 3. 工具将自动检测并报告: - UAC启用/禁用状态 - 可用于绕过的白名单程序 - 可用于令牌复制的提升权限进程 - WMI服务可用性 - 每种绕过方法的整体可行性评估 ### 检测输出示例 ``` === UAC绕过条件检测工具 === 此工具仅检测可利用条件,不执行实际绕过操作 === 白名单绕过检测 === UAC状态: [已启用] 可用白名单程序: 5项 [条件满足] 找到可用白名单程序: - C:\\Windows\\System32\\eventvwr.exe - C:\\Windows\\System32\\compmgmt.msc === 令牌绕过检测 === UAC状态: [已启用] 可用系统进程: 8项 提升权限进程: 3项 [条件满足] 找到提升权限进程: - winlogon.exe - services.exe === WMI绕过检测 === UAC状态: [已启用] COM库可用性: [可用] WMI服务可用性: [可用] WMI命名空间可用性: [可用] [条件满足] WMI绕过环境完整 === 检测摘要 === 系统UAC状态: [已启用] [结论] UAC已启用,检查绕过方法可行性: 1. 白名单绕过 - 依赖于系统白名单程序的存在 2. 令牌绕过 - 依赖于高权限系统进程的存在 3. WMI绕过 - 依赖于WMI服务的可用性 ``` ## 编译要求 ### 系统要求 - Windows 7及以上版本 - Visual Studio 或 MinGW编译器 - 管理员权限(用于测试) ### 依赖库 - ole32.lib - oleaut32.lib - shlwapi.lib - wbemuuid.lib(WMI相关) ## 安全声明 本项目仅供安全研究、学术研究和教育目的。使用者应对其行为负全部责任。开发者不对任何滥用行为负责。 ## 许可证 本项目采用MIT许可证。详见LICENSE文件。 ## 参与贡献 CuteCuteYu ## 验证UAC绕过是否成功 ### 在CMD中验证权限状态 当使用本工具成功绕过UAC后,可以通过以下命令验证是否获得了管理员权限: #### 1. 使用whoami命令验证用户身份 ```cmd whoami ``` 如果显示当前用户包含管理员组(如 `NT AUTHORITY\\SYSTEM` 或包含 `Administrators` 组),则说明具有管理员权限。 #### 2. 使用whoami /groups命令查看权限组 ```cmd whoami /groups ``` 查找包含 `Mandatory Label\\High Mandatory Level` 的行,表示具有高完整性级别。 #### 3. 使用net session命令测试网络权限 ```cmd net session ``` 如果命令执行成功(不显示错误信息),说明具有管理员权限。 #### 4. 尝试访问受保护的系统目录 ```cmd dir %SystemRoot%\\System32\\config ``` 如果能够列出系统配置目录的内容,说明具有管理员权限。 #### 5. 使用icacls命令检查文件权限 ```cmd icacls %SystemRoot%\\System32\\cmd.exe ``` 如果能够查看系统文件的权限信息,说明具有足够的权限。 #### 6. 创建系统目录下的文件(高级验证) ```cmd echo UAC Test > %SystemRoot%\\System32\\uac_test.txt ``` 如果能够成功创建文件,说明具有管理员权限。验证后请删除测试文件: ```cmd del %SystemRoot%\\System32\\uac_test.txt ``` ### 验证工具自动检测 本工具内置了权限验证功能,会自动检测并报告以下信息: - 管理员权限检测状态 - 完整性级别(高/中/低) - 实际管理员权限测试结果 - UAC启用状态 当工具显示"UAC绕过验证: 完全成功!"时,表示已成功获得管理员权限。 ### 注意事项 1. 某些验证方法可能会触发安全软件的警报 2. 在生产环境中谨慎使用文件创建等敏感操作 3. 验证完成后及时清理测试文件 4. 不同Windows版本可能有不同的权限验证方式 ## 更新日志 - v1.0.0: 初始版本,包含三种UAC绕过方法