Windows 本地提权工具 Juicy Potato 测试分析
0x00 前言
Juicy Potato 是一款 Windows 系统的本地提权工具,是在工具 RottenPotatoNG 的基础上做了扩展,适用条件更广
利用的前提是获得了 SeImpersonate 或者 SeAssignPrimaryToken 权限,通常在 webshell 下使用
那么,Juicy Potato 的使用方法有哪些,有哪些限制条件呢?本文将对其进行测试,根据原理分析限制条件
Juicy Potato 的下载地址:https://github.com/ohpe/juicy-potato
0x01 简介
本将要介绍以下内容:
- 实现原理
- 对 RottenPotatoNG 的扩展
- 枚举可用 COM 对象的方法
- 使用方法
- 限制条件
- 防御思路
0x02 实现原理
参考资料:
根据个人理解介绍实现原理
需要理解的几个知识:
- 使用 DCOM 时,如果以服务的方式远程连接,那么权限为 System,例如 BITS 服务
- 使用 DCOM 可以通过 TCP 连接到本机的一个端口,发起 NTLM 认证,该认证可以被重放
- LocalService 用户默认具有 SeImpersonate 和 SeAssignPrimaryToken 权限
- 开启 SeImpersonate 权限后,能够在调用 CreateProcessWithToken 时,传入新的 Token 创建新的进程
- 开启 SeAssignPrimaryToken 权限后,能够在调用 CreateProcessAsUser 时,传入新的 Token 创建新的进程
Juicy Potato 的实现流程如下:
1、加载 COM,发出请求,权限为 System
在指定 ip 和端口的位置尝试加载一个 COM 对象
RottenPotatoNG 使用的 COM 对象为 BITS,CLSID 为 {4991d34b-80a1-4291-83b6-3328366b9097}
可供选择的 COM 对象不唯一,Juicy Potato 提供了多个,详细列表可参考如下地址:https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
2、回应步骤 1 的请求,发起 NTLM 认证
正常情况下,由于权限不足,当前权限不是 System,无法认证成功
3、针对本地端口,同样发起 NTLM 认证,权限为当前用户
由于权限为当前用户,所以 NTLM 认证能够成功完成
RottenPotatoNG 使用的 135 端口
Juicy Potato 支持指定任意本地端口,但是 RPC 一般默认为 135 端口,很少被修改
4、分别拦截两个 NTLM 认证的数据包,替换数据,通过 NTLM 重放使得步骤 1(权限为 System) 的 NTLM 认证通过,获得 System 权限的 Token
重放时需要注意 NTLM 认证的 NTLM Server Challenge 不同,需要修正
5、利用 System 权限的 Token 创建新进程
如果开启 SeImpersonate 权限,调用 CreateProcessWithToken,传入 System 权限的 Token,创建的进程为 System 权限
或者
如果开启 SeAssignPrimaryToken 权限,调用 CreateProcessAsUser,传入 System 权限的 Token,创建的进程为 System 权限
利用的关键:
当前用户支持 SeImpersonate 或者 SeAssignPrimaryToken 权限
以下用户具有该权限:
- 本地管理员组成员和本地服务帐户
- 由服务控制管理器启动的服务
- 由组件对象模型 (COM) 基础结构启动的并配置为在特定帐户下运行的 COM 服务器
针对提权的话,主要是第三类用户,常见的为 LocalService 用户,例如 IIS 和者 sqlserver 的用户
0x03 枚举可用 COM 对象的方法
Juicy Potato 提供了枚举可用 COM 对象的方法,步骤如下:
1、获得可用 CLSID 的列表
使用 GetCLSID.ps1,地址如下:https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1
注:使用时同级目录下需要包含支持文件 .\utils\Join-Object.ps1
执行成功后生成文件 CLSID.list
和 CLSID.csv
2、使用批处理调用 juicypotato.exe 逐个测试 CLSID
批处理地址如下:https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat
juicypotato.exe 的参数如下:
juicypotato.exe -z -l !port! -c %%i >> result.log
-z 表示测试模式,只验证 Token,不使用 Token 创建进程
-l 为端口,起始为 1000,每次循环加 1
-c 为从文件 CLSID.list 获得的 CLSID
Juicy Potato 已经测试了如下 Windows 系统:
- Windows 7 Enterprise
- Windows 8.1 Enterprise
- Windows 10 Enterprise
- Windows 10 Professional
- Windows Server 2008 R2 Enterprise
- Windows Server 2012 Datacenter
- Windows Server 2016 Standard
我在测试的过程中,在 Server2012 下执行 GetCLSID.ps1 时会报错,如下图
出错在位置在 .\utils\Join-Object.ps1
这里给出一种修改方法:
1、枚举所有满足条件的 CLSID
powershell 代码如下:
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null
$CLSID = Get-ItemProperty HKCR:\clsid\* | select-object AppID,@{N='CLSID'; E={$_.pschildname}} | where-object {$_.appid -ne $null}
foreach($a in $CLSID)
{
Write-Host $a.CLSID
}
可以选择将结果保存为 CLSID.list
2、使用批处理调用 juicypotato.exe 逐个验证
地址如下:https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat
bat 脚本不需要做修改
0x04 使用方法
1、查看当前用户权限,是否符合要求
whoami /priv
如果开启 SeImpersonate 权限,juicypotato 的参数可以使用 -t t
如果开启 SeAssignPrimaryToken 权限,juicypotato 的参数可以使用 -t u
如果均开启,可以选择 -t *
如果均未开启,那么无法提权
2、查看 RPC 默认端口是否为 135
如果被修改(例如为 111),juicypotato 的参数可以使用 -n 111
如果系统禁用了 RPC,并不是一定无法提权,需要满足如下条件:
找到另一系统,能够以当前用户的权限进行远程 RPC 登录,此时 juicypotato 的参数可以使用 -k <ip>
例如 Win7、WIn8 系统,默认配置下,允许 135 端口的入站规则即可进行远程 RPC 登录
添加防火墙规则允许 135 端口入站的命令如下:
netsh advfirewall firewall add rule name="135" protocol=TCP dir=in localport=135 action=allow
也可以选择将防火墙关闭,可参考绕过 UAC 关闭防火墙的代码:https://github.com/3gstudent/Use-COM-objects-to-bypass-UAC/blob/master/DisableFirewall.cpp
3、根据操作系统选择可用的 CLSID
参考列表
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
例如测试系统 Server2012,选择 CLSID 为 {8BC3F05E-D86B-11D0-A075-00C04FB68820}
4、选择一个系统未占用的端口作为监听端口
例如,最终参数如下:
JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {8BC3F05E-D86B-11D0-A075-00C04FB68820}
表示开启 SeImpersonate 权限创建进程,监听端口 1111,使用的 CLSID 为 {8BC3F05E-D86B-11D0-A075-00C04FB68820}
0x05 限制条件
经过以上的分析,Juicy Potato 的限制条件如下:
- 需要支持 SeImpersonate 或者 SeAssignPrimaryToken 权限
- 开启 DCOM
- 本地支持 RPC 或者远程服务器支持 PRC 并能成功登录
- 能够找到可用的 COM 对象
0x06 防御思路
站在防御的角度,服务器禁用 DCOM,禁用 RPC,或者为每一个 COM 对象配置属性均不现实
针对 Juicy Potato 的关键在于权限的控制,阻止攻击者获得 SeImpersonate 或者 SeAssignPrimaryToken 权限
0x07 补充
更多学习资料:https://bugs.chromium.org/p/project-zero/issues/detail?id=325&redir=1
0x08 小结
本文对 Juicy Potato 进行测试,总结使用方法,同 RottenPotatoNG 进行比较,分析原理,找到限制条件和防御思路。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论