Windows权限提升实战:RottenPotato与JuicyPotato原理、差异与避坑指南

发布时间:2026/7/15 18:38:50

Windows权限提升实战:RottenPotato与JuicyPotato原理、差异与避坑指南 1. 项目概述从“烂土豆”到“多汁土豆”的提权江湖在Windows渗透测试与安全评估的实战中本地权限提升Local Privilege Escalation始终是攻防双方博弈的核心战场。当你通过某种方式比如一个Web漏洞拿到了一个低权限的Shell比如IIS APPPOOL\DefaultAppPool或者NT AUTHORITY\NETWORK SERVICE如何突破这层壁垒拿到梦寐以求的NT AUTHORITY\SYSTEM权限就成了决定性的临门一脚。在这个领域有两个名字如雷贯耳却又让不少新手乃至老手踩过坑RottenPotato烂土豆和JuicyPotato多汁土豆。它们都基于一个经典的Windows安全机制——NTLM中继NTLM Relay与COM/DCOM组件滥用但它们的适用场景、成功率和“脾气”却大相径庭。这篇文章我就结合自己多年在红蓝对抗和内部安全评估中的实战经验为你彻底拆解这两款工具特别是它们在不同Windows系统版本从Windows 7/Server 2008 R2到Windows 11/Server 2022下的表现差异帮你避开那些教科书上不会写的“坑”做出最合适的选择。简单来说这两款工具的核心目标是一致的利用Windows服务账户特别是NT AUTHORITY\NETWORK SERVICE在特定场景下可以模拟其他用户令牌Token的特性通过一系列复杂的COM对象激活请求最终“窃取”到SYSTEM权限的令牌。但实现路径、依赖条件和系统兼容性是决定你用哪颗“土豆”能炸开权限大门的关键。很多人照着教程做却失败了问题往往就出在不清楚自己手里的“土豆”和当前系统的“土壤”环境是否匹配。2. 核心原理深度拆解为什么“土豆”能提权要理解如何避坑必须先明白它们的工作原理。这不仅仅是知道“怎么用”更是为了在工具失败时你能快速定位问题根源。2.1 基石Windows令牌模拟与COM/DCOM激活机制Windows的访问控制核心是令牌Token它包含了用户身份SID和权限Privileges。服务账户NT AUTHORITY\NETWORK SERVICE有一个特殊权限SeImpersonatePrivilege模拟客户端权限。这意味着如果它能以某种方式“拿到”一个更高权限比如SYSTEM的令牌它就可以模拟Impersonate那个令牌从而执行高权限操作。那么如何让NETWORK SERVICE“拿到”SYSTEM令牌呢这就引入了COM/DCOM。COMComponent Object Model是Windows跨进程通信的机制。当一个进程客户端请求激活另一个进程服务器中的COM对象时会进行身份验证和模拟。关键在于某些特定的COM服务器是以SYSTEM权限运行的。如果我们能诱骗NETWORK SERVICE账户去请求激活这些特定的COM对象并且在认证过程中“劫持”这个连接就有可能让NETWORK SERVICE拿到SYSTEM在本次连接中使用的令牌。2.2 RottenPotato经典的“本地NTLM中继”路径RottenPotato以及其前身Hot Potato的核心思路是本地NTLM中继。它会在本地127.0.0.1启动两个关键服务一个HTTP服务器监听在某个端口如80/443并设置需要NTLM认证。一个RPC服务器用于触发COM激活请求。其工作流程可以简化为工具诱导Windows的某个本地服务通过COM激活请求向工具自己搭建的本地HTTP服务器发起认证请求。这个认证请求使用的是NTLM协议。工具作为中间人将这个NTLM认证“中继”Relay到本地的另一个RPC端点具体是NT AUTHORITY\SYSTEM账户控制的135端口或WinRM服务等。由于是中继到本地并且利用了特定的协议和接口最终使得NETWORK SERVICE账户成功模拟了SYSTEM令牌。它的关键依赖需要目标系统上存在并允许特定的COM类CLSID并且本地的NTLM认证环回Loopback没有被严格限制。在早期系统如Windows 7/Server 2008 R2上这一套流程相对顺畅。2.3 JuicyPotato更精细化的CLSID“寻宝”游戏JuicyPotato可以看作是RottenPotato的进化版它解决了前者的一个主要问题对特定CLSID的依赖过于死板。JuicyPotato的作者通过深入研究整理了海量的COM CLSID列表并标注了哪些CLSID对应的COM服务器是以SYSTEM权限运行并且允许NETWORK SERVICE等账户去请求激活。它的核心改进在于CLSID列表内置了一个庞大的、经过测试的CLSID列表。用户可以不指定CLSID让工具自动遍历测试也可以指定一个已知可用的CLSID来提高成功率。更灵活的触发方式它不仅支持通过RPC触发还支持通过其他方式如计划任务来发起COM激活请求适应性更强。权限要求明确它明确要求执行用户必须持有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限这通常意味着你需要已经是NETWORK SERVICE、LOCAL SERVICE或某个服务账户而不是一个普通的User。JuicyPotato的本质是自动化的寻找一个在当前系统环境下可以被当前低权限账户激活、并且最终能泄露SYSTEM令牌的“脆弱”COM组件。注意无论是RottenPotato还是JuicyPotato其成功利用都基于一个前提——微软并未将其视为一个必须修复的“漏洞”而更多是特性如令牌模拟被滥用。因此微软通过后续的系统更新不断收紧相关策略导致这些工具的适用环境持续变化。这正是“避坑”的重点。3. 系统版本实战差异全景对比这是本文的核心干货。直接用一个表格来概括不同Windows版本下的主要差异和利用前景系统版本RottenPotatoJuicyPotato关键影响因素与现状Windows 7 / Server 2008 R2成功率较高成功率很高系统默认策略宽松可用的CLSID较多。是这两款工具的“黄金时代”。但需注意系统是否安装了所有安全更新。Windows 8.1 / Server 2012 R2成功率下降成功率较高微软开始引入一些缓解措施。RottenPotato依赖的特定路径可能被阻断而JuicyPotato凭借其CLSID列表仍有较大机会找到可用组件。Windows 10 早期版本 (如1507, 1607) / Server 2016基本失效存在成功可能微软进一步强化了本地NTLM中继的限制如对127.0.0.1的NTLM认证限制。RottenPotato经典手法基本无效。JuicyPotato需要寻找特定的、尚未被“封堵”的CLSID成功率因具体版本和补丁情况而异。Windows 10 1809以后 / Server 2019/2022完全失效极难成功微软实施了名为CVE-2019-0841的修补程序并默认启用了Windows Defender Credential Guard如果硬件支持。这从根本上破坏了通过COM滥用进行令牌模拟的攻击面。JuicyPotato在这些系统上除非在特定配置不当如Credential Guard未启用、安装了特定旧版软件引入了脆弱CLSID的环境下否则几乎无法成功。3.1 关键补丁与安全特性影响解析KB2871997与WDigest这个补丁虽然主要关于凭据缓存但它代表了微软开始收紧低权限账户的行为是安全环境变化的起点。但它不直接影响“土豆”类工具。本地NTLM中继限制从Windows 8.1/Server 2012 R2开始微软逐步限制向本地地址如127.0.0.1进行NTLM认证这直接斩断了RottenPotato的核心路径。CVE-2019-0841补丁这是针对JuicyPotato等工具利用COM提升权限的官方修补。安装此补丁后系统会检查COM激活请求的调用链阻止低权限服务账户通过这种方式获取SYSTEM令牌。Windows Defender Credential Guard这是一个基于虚拟化的安全特性它将用户的NTLM哈希、Kerberos票据等隔离在一个安全的容器中使其无法被操作系统层面的攻击包括“土豆”攻击所窃取。在启用Credential Guard的系统上此类令牌窃取攻击基本免疫。3.2 实战选择策略根据上表我们可以得出清晰的实战选择策略面对Windows 7/Server 2008 R2两款都可以尝试。如果追求简单直接RottenPotato可能更快。如果想更稳妥或者RottenPotato失败了用JuicyPotato并指定几个常见的CLSID如{4991d34b-80a1-4291-83b6-3328366b9097}但需注意此CLSID并非万能。面对Windows 8.1/Server 2012 R2优先使用JuicyPotato。RottenPotato的成功率已经不稳定不必浪费时间。面对Windows 10/Server 2016及以后首先降低心理预期。直接尝试JuicyPotato带CLSID列表遍历。如果失败立即转向其他提权方法如服务配置错误、不安全的注册表权限、计划任务、AlwaysInstallElevated、令牌窃取等不要再纠结于“土豆”。通用原则在任何系统上使用JuicyPotato时都建议先尝试不指定CLSID让其自动测试内置列表。如果时间有限或环境敏感可以去查阅公开的、针对特定系统版本的“可用CLSID”列表进行针对性尝试。4. 实操过程与核心环节实现这里以JuicyPotato为例展示一个完整的、包含避坑细节的实操流程。假设我们已经获得了一个具有SeImpersonatePrivilege权限的Shell例如通过Web漏洞获得的IIS APPPOOL账户的Shell。4.1 环境侦察与准备第一步永远不是直接运行工具而是侦察。# 1. 查看当前用户权限确认是否有SeImpersonatePrivilege whoami /priv在输出中寻找SeImpersonatePrivilege状态应为Enabled。如果看不到whoami /groups查看是否属于SERVICE等组。# 2. 查看系统版本和补丁信息 systeminfo | findstr /B /C:OS Name /C:OS Version /C:Hotfix(s)这步至关重要用于对照上一节的版本差异表预判成功率。# 3. 检查是否启用了Credential Guard对于Win10/Server2016 reg query HKLM\System\CurrentControlSet\Control\Lsa /v LsaCfgFlags如果LsaCfgFlags值为1表示Credential Guard已启用此时“土豆”类攻击成功概率极低应考虑放弃。4.2 JuicyPotato 工具使用详解将JuicyPotato.exe上传到目标机器的可写目录如C:\Windows\Temp\或Web目录。基本语法JuicyPotato.exe -l 监听端口 -p 要启动的程序 -t 操作类型 -c CLSID关键参数解析与避坑-l指定一个本地端口用于工具内部创建RPC服务器。避坑点选择一个不被占用的端口如1337。如果失败可尝试更换端口。-p指定提权成功后要执行的程序。这是我们的目标。通常是cmd.exe或powershell.exe或者一个反弹Shell的Payload。-p C:\Windows\System32\cmd.exe-t指定创建进程的方式。这是最大的坑之一-t t 使用CreateProcessWithToken函数。这是最常用的方式要求当前账户必须有SeImpersonatePrivilege。我们通常用这个。-t u 使用CreateProcessAsUser函数。这要求当前账户有SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege。某些服务账户可能有。-t * 尝试t如果失败再尝试u。避坑点如果你确认有SeImpersonatePrivilege直接用-t t。如果失败并提示权限错误再尝试-t *。-c指定COM CLSID。如果不指定JuicyPotato会遍历其内置列表自动测试。避坑点在不确定的情况下首次尝试不要指定-c让工具自动寻找。如果自动寻找成功它会输出成功的CLSID这个CLSID就可以作为该系统的“指纹”记录下来下次直接使用。一个完整的、带避坑思路的命令示例# 首次尝试不指定CLSID让工具自动寻找使用CreateProcessWithToken方式执行cmd C:\Temp\JuicyPotato.exe -l 1337 -p C:\Windows\System32\cmd.exe -t t # 如果自动寻找成功工具会输出类似“[]] CreateProcessWithTokenW OK”的信息并弹出SYSTEM权限的cmd窗口。 # 同时请记录下输出中使用的CLSID例如 # [] Calling CoInitializeSecurity(..., RPC_C_AUTHN_LEVEL_PKT_PRIVACY, ... # [] Received DCOM NTLM authentication packet from CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} # 这个{...}就是可用的CLSID。 # 第二次及以后尝试在同一系统上可以使用记录的CLSID提高速度和稳定性 C:\Temp\JuicyPotato.exe -l 1338 -p C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -t t -c {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} # 如果想直接弹一个反向Shell可以这样假设攻击机IP为192.168.1.100端口4444 # 首先在攻击机生成PowerShell反向Shell命令并做Base64编码此处省略生成步骤。 # 假设编码后的命令为$encodedCommand C:\Temp\JuicyPotato.exe -l 1337 -p powershell.exe -a -enc $encodedCommand -t t4.3 RottenPotato 使用简述用于历史系统对于老系统RottenPotato的使用相对简单但同样需要注意细节。# 通常用法是直接执行它会尝试使用默认的CLSID和端口。 RottenPotato.exe # 更常见的用法是结合Metasploit的incognito模块或者直接用于令牌窃取。 # 例如在Meterpreter会话中 upload /path/to/RottenPotato.exe C:\\Temp\\potato.exe execute -Hc -f C:\\Temp\\potato.exe # 然后使用incognito来模拟令牌 use incognito list_tokens -u impersonate_token NT AUTHORITY\\SYSTEMRottenPotato避坑点在老系统上如果默认执行失败几乎就意味着此路不通因为其可调节的参数很少对系统环境依赖固定。不建议花费大量时间调试应转向JuicyPotato或其他方法。5. 常见问题、排查技巧与进阶思路即使理解了原理和步骤实战中依然会碰到各种问题。下面是我总结的常见问题排查清单。5.1 问题排查速查表问题现象可能原因排查步骤与解决方案JuicyPotato运行后无任何反应或立即退出1. 系统版本太高Win10 1809/Server 2019已打补丁。2. Credential Guard已启用。3. 当前账户没有SeImpersonatePrivilege。1.systeminfo确认版本。高版本系统建议直接放弃。2.reg query检查Credential Guard。3.whoami /priv确认权限。JuicyPotato报错[!] CreateProcessWithTokenW Failed1. 指定的-t参数与账户权限不匹配。2. 选择的CLSID在当前系统无效。3. 内部令牌模拟失败。1. 尝试更换-t参数如从t改为*。2. 更换CLSID或去掉-c参数让其自动寻找。3. 尝试更换监听端口-l。JuicyPotato卡住长时间无输出工具正在遍历CLSID列表进行测试这是一个耗时过程。耐心等待可能数分钟。如果急需可以尝试指定一个已知的可能CLSID。工具执行后弹出了cmd窗口但仍是原用户权限提权失败但指定的程序-p被以当前权限正常启动了。检查工具输出的所有信息看是否有之前的错误。这通常是CLSID或-t参数不对。RPC服务器不可用或访问被拒绝1. 防火墙或安全软件拦截了RPC通信。2. 系统服务状态异常。3. RottenPotato在较新系统上必然失败。1. 检查防火墙规则实战中很难操作。2. 对于RottenPotato在非老系统上放弃。对于JuicyPotato尝试更换端口-l。上传的工具被防病毒软件立即删除工具特征已被主流AV识别。1. 尝试对可执行文件进行免杀处理编码、混淆、加壳。2. 寻找替代的、未公开或自编译的版本。3. 考虑不使用文件落地的方式如使用PowerShell内存加载等。5.2 实战心得与进阶技巧CLSID的收集与共享不同系统版本、不同补丁状态、甚至不同软件安装如Oracle Java、旧版McAfee都会引入不同的COM组件。建立一个自己的CLSID知识库非常重要。当你在某个特定环境比如一个安装了特定旧版软件的Windows Server 2016上利用JuicyPotato成功时务必记录下可用的CLSID和系统环境信息。参数组合的穷举不要只试一次。-t参数t, u, *、-l端口、不同的-cCLSID这些可以组合尝试。写一个简单的批处理或PowerShell脚本来进行批量尝试是高效的做法。从Web Shell到“土豆”的路径很多时候我们获得的是Web Shell如aspx,php。你需要先将提权工具上传到目标。确保你有可写的目录权限。如果因为杀毒软件导致上传失败可以尝试将exe文件分割、编码如base64后上传再在目标机器上解码还原。后“土豆”时代的选择在Windows 10 1809和Server 2019之后的环境中“土豆”已经不再是首选。你应该熟练掌握其他提权方法PowerUp.ps1一款强大的PowerShell脚本能系统性地检查服务、计划任务、注册表、AlwaysInstallElevated等常见的错误配置。Token Manipulation直接的令牌窃取steal_tokenin Meterpreter或使用Incognito但这对进程有要求。DLL Hijacking寻找以高权限运行但存在DLL搜索路径缺陷的应用程序或服务。Unquoted Service Paths服务路径未用引号包裹且包含空格。Kernel Exploits最后的手段如利用CVE-2021-36934 (HiveNightmare)、CVE-2021-1675 (PrintNightmare) 等内核漏洞。使用前务必评估对系统稳定性的影响。清理痕迹在渗透测试中使用完毕后记得删除上传的工具文件并清理可能产生的日志如进程创建日志、命令行日志。JuicyPotato运行会产生子进程这些在审计日志中可能留下记录。最后我想强调的是权限提升没有银弹。RottenPotato和JuicyPotato是两把在特定历史时期和特定系统环境下非常锋利的“钥匙”但面对不断升级的Windows安全机制它们正在逐渐褪色。真正的“避坑指南”是建立一套系统性的提权思路从准确的信息收集开始判断系统版本和补丁快速尝试高成功率的已知方法如“土豆”之于老系统失败后立即转入全面的本地漏洞和错误配置检查。理解原理才能灵活应变掌握多种工具才不会在一条路上走到黑。希望这篇结合了大量实战踩坑经验的指南能让你下次面对Windows提权时心中更有底气操作更加精准。

相关新闻