本文选自《内网安全攻防:红队之路》。

UAC(用户账户控制)是微软从Windows Vista开始引入的一项核心安全技术。它的核心目的是在执行可能影响系统或其他用户的操作前,要求用户提供管理员权限或密码进行验证,以此来阻止恶意软件在未经许可的情况下进行安装或篡改系统设置。
在Windows Vista及后续版本中,系统进程被划分为高、中、低三个安全等级。拥有管理员权限的进程运行在高等级,普通用户进程在中等级,而受限进程则在低等级运行,这种机制旨在最小化潜在安全威胁可能造成的损害。
通常需要UAC授权才能进行的操作包括:
- 增加或删除用户账户。
- 更改账户类型或UAC设置本身。
- 安装ActiveX控件或设备驱动程序。
- 安装或卸载应用程序。
- 在
Program Files或Windows目录下移动、复制文件。
- 查看其他用户的文件夹。
UAC的设置主要分为四档:
- 始终通知:最严格的级别,任何程序请求高级权限都会触发提示。
- 仅在程序试图更改我的计算机时通知我(默认):Windows自带程序请求高级权限时不提示,第三方程序请求时会提示。
- 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):同上,但提示时不调暗屏幕。
- 从不提示:管理员账户下,所有程序都以最高权限运行,此设置安全性最低。
使用白名单程序绕过UAC分析
Windows默认的UAC设置为“仅在程序试图更改我的计算机时通知我”,这意味着某些被微软信任的本地Windows程序在请求高权限时不会触发提示。mmc.exe、eventvwr.exe、CompMgmtLauncher.exe等就属于这类白名单程序。利用它们来启动其他程序,可以间接使目标程序获得管理员权限,从而绕过UAC。
以CompMgmtLauncher.exe为例,它在启动时会按顺序查询以下注册表路径:
HKCU\Software\Classes\mscfile\shell\open\command
HKCR\mscfile\shell\open\command
使用Process Monitor工具可以清晰地观察到这一过程。如下图所示,程序首先查询的是用户可写的HKCU路径。

由于HKCU\Software\Classes\mscfile\shell\open\command这个注册表项默认不存在,且普通用户有权修改,攻击者可以劫持这个启动流程。执行以下命令,将该键的默认值设置为cmd.exe:
reg add HKCU\Software\Classes\mscfile\shell\open\command /ve /t REG_SZ /d cmd.exe
命令执行成功后,注册表修改结果如下图所示。

此时,再次运行CompMgmtLauncher.exe,它会加载我们设置的注册表项,从而启动一个具有高权限的cmd.exe进程,成功绕过UAC。使用Process Explorer查看,可以确认新启动的cmd.exe进程拥有较高权限。

使用COM组件绕过UAC分析
COM提升名称技术允许运行在UAC环境下的应用程序以提升的权限来激活特定的COM类。CMSTPLUA COM接口的CLSID为{3E5FC7F9-9A51-4367-9063-A120244FBEC7},其ICMLuaUtil接口中实现的ShellExec方法可以被调用来执行任意命令。
关键在于,调用此方法的父进程DllHost.exe是以高权限启动的,因此通过它执行的命令也就自然地继承了高权限,绕过了UAC弹窗提示。
相关C++实现的关键代码如下:
#define T_CLSID_CMSTPLUA L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
#define T_IID_ICMLuaUtil L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"
......
r = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, L"C:\\windows\\system32\\cmd.exe", NULL, NULL, SEE_MASK_DEFAULT, SW_SHOW);
编译并执行上述代码,即可启动一个绕过UAC限制的高权限命令行窗口。

UACME工具的使用
目前存在多种公开的UAC绕过技术,其中hfiref0x在GitHub上维护的 UACME 项目收集整理了大量的绕过方法。该项目使用C#编写,可通过Visual Studio编译。
编译成功后,会在 Source\Akagi\output 目录下生成 Akagi.exe。通过向其传入不同的方法编号,可以测试对应的绕过技术。例如,使用61号方法,该方法通过劫持slui.exe相关的注册表项 HKCU\Software\Classes\exefile\shell\open 来绕过UAC。如下图所示,执行后成功启动了高权限的cmd.exe。

这个项目对于攻防双方都具有参考价值:攻击者可以从中提取技术进行武器化;防御者则可以逐一测试这些方法,以评估和加固主机的安全性。深入理解这些渗透测试中常用的技术原理,对于构建有效的防御体系至关重要。
针对UAC绕过提权的防御措施
在企业内网环境中,最有效的防御措施之一是避免让普通用户拥有本地管理员权限,这能从根本上降低系统被此类技术攻击的风险。
对于家庭用户或必须使用管理员账户的场景,建议采取以下措施:
- 将UAC设置为最严格的“始终通知”级别。
- 日常使用非管理员权限账户进行活动。
- 考虑使用微软的增强缓解体验工具包或专业的安全软件来防范潜在的零日漏洞。
对系统安全控制策略的持续关注和加固,是应对不断演进的绕过技术的关键。更多关于系统安全与攻防的深入讨论,欢迎在 云栈社区 交流分享。