
1. 项目概述从“提权”到“绕过”的攻防博弈在红队评估或渗透测试的后期阶段我们常常会遇到一个尴尬的局面通过初始漏洞比如一个钓鱼邮件载荷或者一个WebShell成功在目标Windows系统上获得了立足点拿到了一个普通用户权限的会话。然而当我们试图执行一些关键操作比如安装后门、转储凭据、修改系统配置时系统会弹出一个熟悉的蓝色盾牌窗口——用户账户控制UAC。这个自Windows Vista时代引入的安全机制就像一道横亘在普通用户权限和完整管理员权限之间的“安检门”。对于攻击者而言无法绕过UAC就意味着攻击链在此中断无法实现真正的权限提升Privilege Escalation。因此掌握一套行之有效的UAC绕过技术是渗透测试人员从“立足”走向“扎根”的必修课。Cobalt Strike作为一款成熟的商业渗透测试框架其强大的后渗透Post-Exploitation能力备受推崇。它不仅仅是一个C2命令与控制服务器更是一个集成了大量自动化攻击模块的“武器库”。在提权方面Cobalt Strike内置了多种UAC绕过技术允许攻击者在获得初始立足点后以更高的完整性级别通常是High或System执行后续载荷。然而这些技术并非“银弹”其成功率高度依赖于目标系统的环境、配置、补丁级别以及杀毒软件的状态。盲目使用默认模块很可能触发告警或直接失败。本文旨在结合我多年的实战经验深入剖析Cobalt Strike中五种经典的UAC绕过技术原理并提供详细的实战操作步骤、环境适配要点以及至关重要的“避坑指南”。我们将从最基础的原理讲起逐步深入到复杂的Bypass技巧确保你不仅能“知其然”更能“知其所以然”在面对不同目标时能够灵活选择、组合甚至创新绕过方法。2. UAC机制核心原理与绕过思路拆解在深入具体技术之前我们必须先理解我们试图绕过的“对手”。用户账户控制UAC的核心设计目标是在用户即使是管理员执行可能影响系统全局的操作时强制进行一次显式的、知情同意式的授权。它通过完整性级别Integrity Levels和权限令牌Token来实现这一目标。2.1 完整性级别与权限令牌Windows系统为进程和对象如文件、注册表键分配了不同的完整性级别从低到高分别为Untrusted, Low, Medium, High, System。默认情况下以普通用户身份启动的进程拥有Medium完整性级别。当进程尝试执行需要更高权限的操作如写入C:\Windows\System32时系统会检查其令牌。管理员用户的令牌实际上有两份一份是“过滤后的”标准用户令牌具有Medium完整性级别用于日常操作另一份是“完整的”管理员令牌处于休眠状态。当UAC对话框弹出并用户点击“是”后系统会使用完整的令牌创建一个新的进程通常是consent.exe的子进程这个新进程就拥有了High完整性级别。2.2 自动提升与受信任的发布者UAC并非对所有操作都“一刀切”地弹窗。它定义了一系列“自动提升”规则。如果一个可执行文件满足以下条件之一系统可能会在不弹窗的情况下直接以高完整性级别启动它位于受信任的系统目录如%SystemRoot%\System32\、%ProgramFiles%\。具有来自受信任发布者的数字签名并且其清单manifest中明确请求了requireAdministrator执行级别。由Windows自身或已提升的进程启动。我们的绕过技术本质上就是“欺骗”系统让我们的恶意进程满足上述的自动提升条件或者利用系统在提升逻辑中的漏洞在不触发UAC弹窗的情况下获取高完整性令牌。2.3 Cobalt Strike的绕过思路分类基于上述原理Cobalt Strike内置的绕过技术大致可以分为三类思路DLL劫持/搜索顺序劫持利用系统进程如fodhelper.exe,eventvwr.exe在加载DLL时的缺陷将恶意DLL放置在比合法DLL更优先被搜索的位置从而在目标进程启动时加载我们的代码。由于父进程是系统信任的其子进程可能获得自动提升。COM接口滥用利用某些COM对象Component Object Model在实例化时其宿主进程如mmc.exe,dllhost.exe默认以高完整性级别运行的特点。通过修改注册表将COM对象的处理程序指向我们的恶意可执行文件。Windows文件操作漏洞利用系统在处理特定文件路径、符号链接或对象管理器命名空间时的逻辑缺陷诱使一个高权限进程执行或加载我们控制的代码。例如经典的IFileOperation漏洞CVE-2019-1388就属于此类。理解这些底层思路比死记硬背几个模块命令重要得多。它让你能在工具失效时自己分析原因甚至寻找新的绕过路径。3. 五种经典UAC绕过技术实战解析下面我们将结合Cobalt Strike的elevate命令逐一拆解五种常见的UAC绕过模块。假设我们已经通过一个windows/beacon_http/reverse_http的监听器获得了一个普通用户权限的Beacon会话会话ID为1。3.1 技术一uac-eventvwr模块这是最古老、最经典的绕过方法之一利用了eventvwr.exe事件查看器的DLL搜索顺序漏洞。原理eventvwr.exe在启动时会尝试加载%SystemRoot%\system32\下的mmc.exe来显示管理界面。但它首先会检查注册表键HKCU\Software\Classes\mscfile\shell\open\command的默认值。如果该值存在它会将其作为命令行来启动。关键点在于检查这个注册表键的操作发生在提升权限之前。因此我们可以先以当前用户权限写入该注册表键指向我们的恶意可执行文件然后启动eventvwr.exe。系统会读取我们设置的注册表键并以此命令行启动一个进程而这个进程因为是由受信任的eventvwr.exe通过COM机制触发的从而继承了高完整性级别。Cobalt Strike操作beacon elevate uac-eventvwr [listener]例如elevate uac-eventvwr http实战步骤与细节前置检查在执行前务必检查目标系统是否安装了.NET Framework的某个版本。因为Cobalt Strike生成的绕过载荷通常是一个.NET可执行文件。可以通过beacon shell powershell “Get-ItemProperty -Path ‘HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP’ -Name Version”粗略判断。模块执行执行上述elevate命令后Cobalt Strike会做以下几件事在Beacon会话中写入上述提到的注册表键值设置为一个临时路径下的攻击载荷一个.exe文件。通过ShellExecute或类似API启动eventvwr.exe。eventvwr.exe读取被篡改的注册表键执行我们的攻击载荷。攻击载荷在内存中反射加载Beacon的Stage并与我们的Listener建立连接从而获得一个高权限的Beacon会话。清理痕迹新的高权限Beacon建立后原始的注册表键会被模块自动清理。但有时清理可能失败需要手动检查beacon reg query HKCU\Software\Classes\mscfile\shell\open\command。避坑指南补丁影响此方法在较新的Windows 10/11系统上如果所有安全更新都已安装成功率已经大大降低。微软通过修改eventvwr.exe的启动逻辑修复了此漏洞。因此它主要适用于未及时更新的内网环境。杀软查杀写入注册表Run键或特定Classes键是很多EDR/杀软监控的重点行为。生成的.exe文件如果落地也极易被静态查杀。建议配合Cobalt Strike的Artifact Kit生成免杀载荷或使用execute-assembly等无文件技术来运行后续操作。路径问题如果当前用户的TEMP目录路径包含空格或特殊字符可能会导致生成的命令行解析错误从而使绕过失败。这是一个隐蔽的坑点。3.2 技术二uac-fodhelper模块这是另一个基于DLL搜索顺序劫持或更准确说是协议处理程序劫持的方法利用了fodhelper.exeWindows功能助手程序。原理fodhelper.exe是一个用于管理Windows可选功能的组件默认以高完整性级别运行。当通过特定URL协议如ms-settings:调用它时它会查找该协议关联的应用程序。我们可以劫持一个不常用或可写的URL协议处理程序例如ms-settings\下的某个子项将其指向我们的恶意可执行文件。当fodhelper.exe被触发时它会启动我们指定的程序并继承高权限。Cobalt Strike操作beacon elevate uac-fodhelper [listener]实战步骤与细节模块流程该模块通常会劫持HKCU\Software\Classes\ms-settings\shell\open\command下的注册表项。将(Default)值和DelegateExecute值清空或修改使得fodhelper.exe在处理ms-settings协议时直接执行我们设定的命令行。触发方式模块通过ShellExecute或直接创建进程的方式启动fodhelper.exe。由于fodhelper.exe本身是受信任的、会自动提升的程序它启动的子进程我们的载荷也就获得了高权限。避坑指南注册表权限现代Windows系统对HKCU\Software\Classes\ms-settings\及其子键的权限控制可能更严格。在某些配置下普通用户可能无法成功写入DelegateExecute值。如果遇到权限错误需要尝试其他方法。行为检测修改ms-settings相关的注册表键是一个偏离正常用户行为非常明显的动作容易被高级EDR端点检测与响应产品标记。在对抗性强的环境中需谨慎使用。清理时机和eventvwr方法一样清理注册表键的时机至关重要。如果在新Beacon建立前清理可能导致执行失败如果清理失败则会留下明显的攻击痕迹。最好在获得高权限会话后手动检查并清理。3.3 技术三uac-silentcleanup模块这个方法利用了Windows计划任务中的一个特性更具隐蔽性。原理Windows系统中存在一个名为SilentCleanup的计划任务其触发事件是用户日志off。这个任务默认以NT AUTHORITY\SYSTEM权限运行但关键特性是它可以在用户登录后以用户上下文并且是高完整性级别运行。更妙的是该任务在启动时会检查环境变量%windir%\System32\但如果该路径不存在这不可能它会回退到使用%windir%\Sysnative\不这里有一个精妙的利用点该任务的操作Action中指定的可执行文件路径是%windir%\system32\cleanmgr.exe但我们可以通过DLL劫持或路径劫持来干扰它。实际上更常见的利用方式是劫持该任务运行时依赖的一个DLL或者利用其工作目录等特性。Cobalt Strike的模块实现可能更直接地利用了任务本身可以运行脚本或可执行文件的特性通过修改注册表或文件关联来实现。Cobalt Strike操作beacon elevate uac-silentcleanup [listener]实战步骤与细节环境准备此方法通常需要目标系统启用计划任务服务并且SilentCleanup任务处于就绪状态。可以通过beacon shell schtasks /query /tn \Microsoft\Windows\DiskCleanup\SilentCleanup /fo list /v来查看任务详情。利用本质模块并非直接触发任务而是利用任务配置中的某个环节。一种已知的利用方式是该任务在运行时会调用cleanmgr.exe而cleanmgr.exe会加载一系列DLL。通过将恶意DLL放置在cleanmgr.exe的搜索路径中例如当前目录而任务的工作目录可能是可写的用户目录可以实现DLL劫持。Cobalt Strike的模块可能自动化了放置恶意DLL和触发任务或触发任务运行条件的过程。避坑指南系统版本差异SilentCleanup任务的具体行为和配置在不同版本的Windows如Win10 1607, 1809, Win11中可能有细微差别可能导致利用失败。杀软监控计划任务的创建、修改以及cleanmgr.exe进程的异常DLL加载行为都是安全软件监控的重点。此方法的动静可能比前两种更大。可靠性由于依赖系统组件的特定实现细节此方法的稳定性不如前两种广泛流传的方法在某些系统上可能无法工作。它更适合作为备用方案。3.4 技术四uac-wscript模块这是一个利用Windows脚本宿主wscript.exe或cscript.exe和COM组件交互的绕过方法。原理某些COM组件在实例化时其宿主进程如wscript.exe会尝试以高完整性级别运行。通过编写一个JScript或VBScript脚本该脚本创建特定的COM对象例如ShellWindows或ShellBrowserWindow可以导致脚本宿主进程提升权限。然后在这个高权限的脚本上下文中我们可以执行命令来启动我们的后门。Cobalt Strike的模块将生成一个恶意脚本文件并利用此机制执行。Cobalt Strike操作beacon elevate uac-wscript [listener] [可选脚本语言如 jscript]实战步骤与细节脚本生成与投放执行命令后Cobalt Strike会在当前用户的临时目录或指定位置生成一个.js或.vbs脚本文件。这个脚本包含了利用COM提升权限并执行Payload的代码。执行过程模块会启动wscript.exe图形界面或cscript.exe命令行界面来运行这个脚本。在脚本执行过程中通过COM操作触发UAC自动提升逻辑使得wscript.exe进程获得高完整性级别进而执行嵌入的Payload。避坑指南脚本文件落地这是该方法最大的弱点。在磁盘上生成一个脚本文件.js/.vbs几乎100%会被现代端点安全软件实时扫描并查杀。即使脚本内容经过混淆其启动wscript.exe并执行特定COM操作的行为链也容易被检测。AMSI绕过如果脚本内容被Antimalware Scan Interface (AMSI) 捕获简单的字符串特征就可能导致拦截。需要在脚本中集成AMSI绕过技术这增加了复杂度。适用场景因此uac-wscript模块在高度对抗的环境下并不理想。它可能适用于某些EDR覆盖较弱、或对脚本行为监控不严的内部环境。3.5 技术五uac-token-duplication模块这是一种相对高级的技术它不依赖于特定的系统程序漏洞而是利用Windows令牌模拟Token Impersonation和进程注入技术。原理在Windows中即使一个进程以中等完整性级别运行如果它能打开一个高完整性级别进程的句柄并具有足够的权限如PROCESS_QUERY_INFORMATION它就可以复制Duplicate那个进程的令牌。系统中总有一些以高权限运行的系统进程或服务进程。该技术的核心是在当前中等权限的进程中枚举进程列表寻找一个以高完整性级别运行、并且当前用户能够打开进程句柄的目标进程例如explorer.exe在管理员登录后通常以High权限运行。打开该目标进程的句柄复制其访问令牌。使用复制的令牌创建一个新的进程我们的Beacon这个新进程就继承了高完整性级别。Cobalt Strike操作 Cobalt Strike可能通过execute-assembly或powerpick调用实现了此技术的.NET或PowerShell脚本。命令可能类似beacon powershell-import /path/to/Invoke-TokenDuplication.ps1 beacon powershell Invoke-TokenDuplication -Listener http或者有内置的模块命令。实战步骤与细节寻找目标进程脚本会遍历进程通常寻找explorer.exe因为它是用户会话中的高权限进程且普通用户通常对其拥有PROCESS_QUERY_INFORMATION权限。其他候选可能包括dwm.exe,taskhostw.exe等。令牌复制与进程创建使用OpenProcess-OpenProcessToken-DuplicateTokenEx这一系列Win32 API调用来复制令牌。然后使用CreateProcessWithTokenW或CreateProcessAsUser函数以复制的令牌创建新进程。无文件化整个过程可以在内存中完成无需在磁盘上落地任何可执行文件。Payload可以通过反射DLL注入或进程镂空Process Hollowing等技术直接注入到新创建的进程中。避坑指南权限要求成功的关键在于能否打开高权限进程的句柄。如果目标系统启用了严格的进程隔离策略如某些加固的Windows 10/11配置或者有安全软件对OpenProcess调用进行监控和拦截此方法会失败。进程选择并非所有高权限进程都可用。svchost.exe等服务进程通常属于不同的会话或具有不同的权限属性无法直接用于创建用户会话下的进程。选择explorer.exe是最常见的但如果用户没有运行桌面例如在服务器上通过RDP连接但没有交互式登录此方法可能失效。检测点令牌复制和跨进程创建是EDR深度监控的敏感操作。CreateProcessWithTokenW这样的函数调用是明显的提权行为特征。需要配合API钩子绕过或直接系统调用Syscall来降低检测概率。4. 实战环境选择与组合利用策略了解了五种技术后你可能会问我该用哪一个答案是视情况而定并做好组合尝试的准备。没有一种方法能通吃所有环境。4.1 环境侦察与方法选型在尝试绕过之前花几分钟进行侦察可以大幅提高成功率避免无谓的告警。检查系统信息beacon shell systeminfo | findstr /B /C:“OS Name” /C:“OS Version” beacon shell ver确定Windows版本和大致内部版本号可以推断系统可能打了哪些补丁。检查UAC设置beacon reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin beacon reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUAConsentPromptBehaviorAdmin值为0表示“不提示直接提升”最弱5表示“在安全桌面上提示”默认2或3也会提示但行为略有不同。EnableLUA值为1表示UAC启用默认为0则表示UAC被完全禁用此时无需绕过直接就是高权限。注意在渗透测试中除非有明确授权否则不应修改此值因为这会降低系统安全性。检查杀软/EDR通过ps或tasklist查看运行的安全进程。也可以尝试运行一些无害的命令观察反应。选型建议老旧/未更新系统优先尝试uac-eventvwr或uac-fodhelper它们简单直接。更新至最新版本的系统eventvwr和fodhelper可能失效应尝试uac-token-duplication或uac-silentcleanup。对抗性强的环境有EDR优先考虑无文件、行为隐蔽的方法。uac-token-duplication如果实现得好和经过高度混淆的uac-wscript结合AMSI绕过可能有机会。绝对要避免直接落地可执行文件.exe。打“组合拳”如果第一种方法失败不要立即重试同一种方法。先清理痕迹如注册表键然后尝试原理不同的另一种方法。例如eventvwr失败后可以尝试token-duplication。4.2 Cobalt Strike中的自动化与手动利用Cobalt Strike的elevate模块提供了自动化但知其然也要知其所以然。手动利用可以更灵活、更隐蔽。手动利用示例以eventvwr为例 假设我们已经有一个PowerShell或C#的二进制Payloadpayload.exe。上传Payload将payload.exe上传到目标可写目录如C:\Users\Public\。修改注册表beacon reg setval -k “HKCU\Software\Classes\mscfile\shell\open\command” -v “” -d “C:\Users\Public\payload.exe”注意实际路径可能需要处理空格和引号Cobalt Strike的模块会处理这些细节触发eventvwrbeacon shell start eventvwr.msc或者使用ShellExecuteAPI。清理注册表beacon reg delete -k “HKCU\Software\Classes\mscfile\shell\open\command”手动利用的好处是可以控制每一步的时机和方式可以插入延迟、使用不同的触发方法有时能绕过一些简单的自动化检测。5. 高级规避技术与深度避坑指南在实战中仅仅成功执行绕过获取高权限会话是不够的。我们还需要考虑如何规避安全产品的检测以及如何处理各种意外情况。5.1 对抗杀软与EDR的要点载荷免杀是基础Cobalt Strike默认生成的Payload无论是exe、dll还是ps1特征都非常明显。务必使用Artifact Kit或自定义的模板对生成的PE文件进行混淆、加壳或修改特征。对于PowerShell脚本要使用混淆工具如Invoke-Obfuscation并内嵌AMSI绕过代码。减少磁盘操作优先使用内存执行技术。在Cobalt Strike中这意味着使用execute-assembly在内存中加载.NET程序集执行UAC绕过逻辑。使用powerpick或psinject来运行PowerShell脚本避免powershell.exe进程拉取磁盘上的脚本文件。如果必须落地文件选择偏僻的、非常规的目录如C:\Windows\Tasks\,C:\Windows\Temp\下的随机子目录并在执行后立即删除。API调用监控绕过高级EDR会钩住Hook关键的Win32 API如CreateProcess,WriteProcessMemory,DuplicateTokenEx等。可以考虑使用直接系统调用Syscall来替代这些API。这需要自己编写或使用实现了Syscall的Shellcode/Loader。使用合法的Windows工具进行“Living-off-the-Land”LOLBAS例如使用cmstp.exe、msiexec.exe等自带数字签名的程序来间接执行代码但这通常用于执行阶段而非直接的UAC绕过。行为链伪装分析每种UAC绕过技术产生的进程链。例如eventvwr - 你的payload。EDR可能会检测这种异常的父子进程关系。可以尝试通过进程镂空、父进程PID欺骗等技术来伪装进程链使其看起来更正常。5.2 常见失败场景排查表现象可能原因排查步骤与解决方案执行elevate后无新会话1. Payload被终端安全软件拦截。2. 绕过技术本身失效已打补丁。3. Listener配置错误或网络不通。4. 注册表写入失败或触发失败。1. 检查杀软日志如果可能尝试对Payload进行免杀处理。2. 换一种绕过技术尝试。3. 在Beacon中使用checkin命令测试原会话是否存活并确认Listener配置正确。4. 手动执行注册表操作和触发命令看是否有错误信息。弹出UAC对话框绕过技术未能实现“静默”提升触发了UAC弹窗。1. 确认目标UAC级别不是最高“始终通知”。2. 该绕过技术可能不适用于当前系统版本。换用其他方法。3. 检查当前用户是否在管理员组内。非管理员用户无法提升。新会话产生后立即死亡1. Payload不稳定或存在兼容性问题。2. 被EDR的动态行为检测击杀。3. 令牌复制后创建的进程属性异常。1. 尝试使用更稳定的Payload类型如windows/beacon_http/reverse_http比windows/beacon_bind_pipe更通用。2. 尝试在非工作时间或使用更隐蔽的进程注入技术。3. 对于令牌复制确保创建进程时指定了正确的会话ID和桌面。注册表键清理失败模块的清理逻辑有bug或清理时机不对在新进程完全启动前就清理了。手动清理残留的注册表键。这是一个重要的痕迹清理步骤务必完成。5.3 权限维持与后续操作成功绕过UAC获得高权限Beacon后你拥有了一个宝贵的“跳板”。此时不应满足于此而应迅速开展后续工作并建立更稳固的权限维持机制。转储凭据立即使用mimikatz或Cobalt Strike内置的logonpasswords命令转储LSASS内存中的密码哈希和明文如果系统支持。这是内网横向移动的“燃料”。权限维持在高权限下可以部署更隐蔽的后门。计划任务创建以SYSTEM或高权限用户运行的计划任务。服务安装一个新的Windows服务。WMI事件订阅这是一种非常隐蔽的持久化方式。注册表启动项修改HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run等位置。注意在部署持久化时要确保其启动的Payload也是免杀的并且行为尽可能低调。关闭防御需谨慎并符合测试规则在高权限下可能可以临时禁用防病毒软件、修改Windows Defender设置或添加排除项。但这会产生大量告警日志仅在必要时使用。横向移动准备收集网络信息net view,ipconfig /all、共享信息、域信息等为下一步攻击做准备。绕过UAC不是终点而是一个关键的转折点。它标志着攻击从外部突破转向了内部扎根。掌握多种技术理解其原理并具备根据环境灵活选择和排错的能力是一名专业渗透测试人员红队评估中不可或缺的技能。每一次成功的绕过都是对系统防御体系一次深刻的洞察。