1. 从“普通用户”到“系统管理员”一次Windows权限提升的实战复盘在Windows安全领域权限提升Privilege Escalation是一个永恒的话题。无论是渗透测试人员验证系统安全性还是系统管理员排查潜在风险理解攻击者如何从一个受限的普通用户账户一步步获取到SYSTEM或Administrator级别的权限都至关重要。这不仅仅是“黑客”的技巧更是构建纵深防御体系必须掌握的知识。今天我想结合自己多年的实战经验聊聊几种经典的Windows本地提权手法令牌窃取、UAC绕过与进程注入。我不会提供任何攻击性工具或脚本而是深入剖析其背后的原理、利用条件以及更重要的是作为防御方应该如何检测和防范。我们的目标不是成为攻击者而是通过理解攻击者的思路更好地守护我们的系统。2. 令牌窃取身份的“冒名顶替”令牌Token是Windows安全模型的核心概念之一。你可以把它想象成进入系统各个房间的“门禁卡”。这张卡上记录着你的身份用户SID、所属的组组SID以及拥有的权限。当你在系统中启动一个进程时系统会为该进程分配一个主令牌Primary Token这个令牌就决定了这个进程能做什么。令牌窃取的核心思想就是找到一个拥有高权限例如SYSTEM或Administrator的进程然后“偷走”它的令牌并用这个令牌来创建一个新的、我们控制的高权限进程。2.1 令牌窃取的工作原理与关键API这个过程主要依赖于Windows的几个核心APIOpenProcess首先我们需要打开目标高权限进程的句柄。这需要一定的访问权限通常PROCESS_QUERY_INFORMATION是基础。OpenProcessToken使用上一步获得的进程句柄打开该进程的令牌对象。DuplicateTokenEx这是最关键的一步。它允许我们复制一个现有的令牌并可以指定新令牌的类型主令牌或模拟令牌和访问权限。通过复制高权限进程的令牌我们获得了一个它的“副本”。CreateProcessWithTokenW或CreateProcessAsUser最后使用复制来的高权限令牌启动一个新的进程例如cmd.exe。这个新进程将“继承”令牌中的所有权限从而实现提权。听起来很直接对吧但这里有一个巨大的前提你当前的进程必须已经拥有足够的权限去打开并复制目标进程的令牌。SYSTEM进程的令牌不是谁都能随便复制的。这就引出了两个常见的利用场景服务账户滥用许多服务以SYSTEM或高权限账户运行。如果某个服务存在漏洞如未引用的服务路径、脆弱的DLL加载攻击者可能利用该服务执行代码此时代码就在高权限上下文中运行自然可以访问自身的令牌并进行复制。SeDebugPrivilege权限这是一个强大的权限默认授予Administrators组的成员。拥有此权限的进程可以调试任何其他进程这通常也包含了打开任何进程句柄的能力。如果一个以管理员身份运行的程序但非SYSTEM存在漏洞被攻击者利用攻击者获得的进程可能就具备SeDebugPrivilege从而可以打开SYSTEM进程进行令牌窃取。注意在实战中直接对lsass.exe负责身份验证的进程或csrss.exe等关键系统进程进行操作可能会触发杀毒软件或EDR终端检测与响应的强烈警报。更隐蔽的做法是寻找那些以SYSTEM运行但相对“边缘”的进程或者利用SeImpersonatePrivilege等权限进行令牌模拟。2.2 防御视角如何发现与阻止令牌窃取从蓝队防御方的角度关注以下几点权限最小化严格遵循最小权限原则。非必要的服务绝不以SYSTEM运行。可以考虑使用专用的、低权限的服务账户。监控进程创建使用Sysmon或ETWEvent Tracing for Windows等工具监控CreateProcess事件特别关注其ParentProcessId和LogonId。如果一个来自普通用户会话的进程创建了一个具有SYSTEM权限的进程这是极高的可疑信号。审计特权使用在组策略中启用“审核特权使用”策略并监控安全事件日志事件ID 4672和4673追踪SeDebugPrivilege和SeImpersonatePrivilege等关键特权的启用和分配情况。限制调试权限通过组策略严格控制拥有SeDebugPrivilege的用户和组范围。3. UAC提权利用“是”与“否”之间的缝隙用户账户控制UAC是Windows Vista之后引入的重要安全机制。它的本意是好的即使你是管理员日常操作也运行在标准用户权限下当需要执行管理任务时UAC会弹出提示框让你确认提升权限。然而UAC的实现并非铁板一块。UAC提权Bypass的核心是找到一种方法在不触发那个明显的、需要用户点击“是”的提权对话框即安全桌面的情况下让程序以高权限运行。3.1 UAC机制与提权路径分析UAC有几个关键组件和概念完整性级别Integrity Level, IL进程和对象如文件都有一个IL标签如低Low、中Medium、高High、系统System。标准用户进程通常是中完整性而需要提升的进程目标是高完整性。自动提升AutoElevation微软标记了一些“受信任的”、来自Windows本身的程序如MMC管理控制台组件。当这些程序由管理员启动时它们可以自动提升到高完整性而无需弹出对话框。这是许多UAC绕过技巧的“跳板”。COM接口提升一些COM对象被配置为可以在提升的上下文中激活。如果攻击者能找到一种方式通过一个中完整性进程去调用这些COM对象并让它们执行任意命令就可能实现提权。一个经典的、已修复但仍具教育意义的例子是利用fodhelper.exe。它是Windows的一个“可选功能”助手被标记为自动提升。它的漏洞在于它在启动时会检查注册表键值HKCU\Software\Classes\ms-settings\shell\open\command来寻找要执行的命令并且这个检查是在提升的上下文中进行的。攻击者可以这样操作以标准管理员身份运行一个中完整性级别的cmd。在此cmd中修改上述注册表路径将(Default)和DelegateExecute的值设置为我们要执行的程序路径例如一个反向shell的payload。运行fodhelper.exe。系统会认为这是用户在启动一个Windows功能于是自动将其提升为高完整性。被提升的fodhelper.exe读取了我们篡改的注册表项并执行了我们指定的恶意命令从而获得了高完整性权限。这个过程没有触发UAC提示框因为系统认为这是在执行一个受信任的Windows操作。3.2 现代环境下的UAC绕过与防御微软不断修复已知的UAC绕过漏洞但新的方法仍可能出现。防御UAC绕过关键在于理解其本质利用受信任的、可自动提升的组件逻辑缺陷或不当配置。防御建议启用最高级别UAC将UAC滑块设置为“始终通知”。这虽然会带来一些不便但能最大程度阻止不弹出对话框的自动提升。禁用内置管理员账户的批准模式确保“用于内置管理员账户的管理员批准模式”策略是启用的。如果禁用内置Administrator账户将不受UAC保护。审计COM对象注册监控对HKCU\Software\Classes\CLSID和HKLM\Software\Classes\CLSID下COM对象注册项的异常修改特别是那些与Elevation或AutoApproval相关的键值。应用程序控制策略使用Windows Defender应用程序控制WDAC或AppLocker严格限制允许运行的脚本和可执行文件可以阻止许多利用脚本或非白名单程序进行的UAC绕过。保持系统更新这是最基础也最重要的一点及时安装安全更新可以修复已知的UAC绕过漏洞。4. 进程注入在别人的地盘上执行代码进程注入是一大类技术的统称其目标是将自定义代码植入到一个正在运行的、通常是高权限的进程的地址空间中并让其执行。这样我们的代码就能“寄生”在目标进程的权限上下文中运行。4.1 几种常见的进程注入技术剖析4.1.1 DLL注入这是最经典的一种。原理是让目标进程加载一个我们指定的DLL文件。DLL的DllMain函数会在加载时自动执行。实现方法通常有CreateRemoteThreadLoadLibrary在目标进程内远程创建一个线程线程的入口点设置为LoadLibraryA/W函数参数为我们DLL的路径。这是教科书式的方法但如今被安全软件高度监控。APC注入利用异步过程调用APC。可以向目标进程的线程队列中插入一个APC当该线程进入可警报状态时就会执行我们的APC例程从而加载DLL。这种方法相对隐蔽。4.1.2 反射式DLL注入为了规避从磁盘加载DLL会被文件监控发现的问题反射式注入将DLL文件的内容直接写入目标进程的内存然后手动执行DLL的加载逻辑解析PE头、重定位、解析导入表、调用入口点整个过程完全在内存中完成不触碰磁盘。这大大增加了检测难度。4.1.3 进程镂空Process Hollowing这是一种“偷梁换柱”的技术以一个合法的、可信的进程如svchost.exe为模板使用CREATE_SUSPENDED标志创建一个挂起的进程。在创建后进程的主线程和主模块EXE已经映射到内存中但尚未执行。攻击者“镂空”这个进程——即取消映射Unmap其原本的EXE内存区域。然后在这个“空壳”里分配新的内存写入恶意的PE文件内容。修改挂起线程的上下文如指令指针EIP/RIP使其指向我们恶意代码的入口点。恢复线程执行。此时系统看到的是一个合法的进程名如svchost.exe但实际执行的却是我们的恶意代码。4.1.4 早期进程注入Early Bird APC这种技术尝试在进程生命周期的更早阶段注入代码。原理是创建一个挂起的进程在其主线程正式执行入口点如main或WinMain之前就向该线程的APC队列插入恶意代码。当线程恢复执行时它会先处理APC队列从而在进程的原始代码执行前就先运行了我们的代码可以用于绕过一些基于API Hook的检测。4.2 检测与对抗进程注入进程注入的检测是一个复杂的战场需要多维度结合行为监控远程线程创建监控CreateRemoteThread的调用特别是当目标进程是lsass.exe、csrss.exe等高权限系统进程或者源进程与目标进程的完整性级别、父进程关系异常时。进程内存操作监控具有PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限的进程句柄操作特别是对非自身进程的写操作。APC队列操作通过ETW记录ThreadStart和CSwitch等事件分析异常的APC注入模式。内存特征扫描在进程内存中搜索已知的恶意代码片段Shellcode的哈希或特征码。检测内存中是否存在与磁盘文件不匹配的PE映像适用于进程镂空。父-子进程关系分析一个普通的用户进程如word.exe创建了rundll32.exe或regsvr32.exe来加载一个奇怪的网络URL或脚本就是可疑行为。使用现代安全特性控制流防护CFG可以防止攻击者利用内存破坏漏洞将执行流跳转到非预期的地址对某些注入技术有缓解作用。任意代码防护ACG和代码完整性防护CIGWindows 10/11的EMETExploit Mitigation Experience Toolkit后续功能可以阻止进程修改可执行内存页或加载未签名的代码能有效防御反射式DLL注入等。5. 实战中的组合拳与防御体系思考在实际的渗透测试或攻击中单一的提权技术往往不够。攻击者会像拼图一样组合多种技术。一个典型的链条可能是初始访问通过钓鱼邮件获得一个普通用户权限的shell。信息收集使用whoami /priv、systeminfo、tasklist /v等命令查看当前权限、系统补丁、运行的高权限进程。尝试UAC绕过如果当前用户是本地管理员组成员尝试已知的UAC绕过方法获取一个高完整性的管理员shell。利用内核或服务漏洞如果UAC绕过失败或用户不是管理员则寻找系统上未打补丁的本地提权漏洞例如著名的PrintSpooler、SMBGhost的本地利用等或者配置错误的服务弱权限、可写路径等。令牌窃取或进程注入在获得管理员权限后为了获得更持久的SYSTEM权限或进行横向移动可能会对lsass.exe进行内存转储以获取凭证Mimikatz或通过进程注入将后门植入到稳定的系统进程中。作为防御者我们的策略也必须是立体的基础加固及时更新系统、禁用不必要的服务、遵循最小权限原则、使用强密码和LAPS本地管理员密码解决方案。深度监控部署EDR/NDR解决方案不仅看单点告警更要关注行为链条。例如一个进程先后进行了信息收集、注册表修改、创建远程线程到lsass.exe这一系列动作的关联性比单个动作的威胁大得多。威胁狩猎主动在环境中搜索IOC入侵指标和IOA入侵行为。例如定期搜索内存中是否存在sekurlsa::logonpasswords这样的Mimikatz命令字符串或者检查是否有进程的父进程是spoolsv.exe但图像路径异常。用户教育防范初始入侵依然是成本最低的防御方式。理解这些提权技术不是为了实施攻击而是为了构建更有效的防御。当你知道了攻击者可能从哪些路径、利用哪些弱点来提升权限时你就能更有针对性地去加固那些路径监控那些弱点。安全是一个动态对抗的过程保持学习保持警惕才是应对之道。