Windows 本地提权工具 Juicy Potato 测试分析

发布于 2024-09-23 16:23:46 字数 6885 浏览 7 评论 0

0x00 前言

Juicy Potato 是一款 Windows 系统的本地提权工具,是在工具 RottenPotatoNG 的基础上做了扩展,适用条件更广

利用的前提是获得了 SeImpersonate 或者 SeAssignPrimaryToken 权限,通常在 webshell 下使用

那么,Juicy Potato 的使用方法有哪些,有哪些限制条件呢?本文将对其进行测试,根据原理分析限制条件

Juicy Potato 的下载地址:https://github.com/ohpe/juicy-potato

0x01 简介

本将要介绍以下内容:

  • 实现原理
  • 对 RottenPotatoNG 的扩展
  • 枚举可用 COM 对象的方法
  • 使用方法
  • 限制条件
  • 防御思路

0x02 实现原理

参考资料:

https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/

根据个人理解介绍实现原理

需要理解的几个知识:

  1. 使用 DCOM 时,如果以服务的方式远程连接,那么权限为 System,例如 BITS 服务
  2. 使用 DCOM 可以通过 TCP 连接到本机的一个端口,发起 NTLM 认证,该认证可以被重放
  3. LocalService 用户默认具有 SeImpersonate 和 SeAssignPrimaryToken 权限
  4. 开启 SeImpersonate 权限后,能够在调用 CreateProcessWithToken 时,传入新的 Token 创建新的进程
  5. 开启 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.listCLSID.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 时会报错,如下图

Alt text

出错在位置在 .\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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

酒绊

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

忆伤

文章 0 评论 0

眼泪也成诗

文章 0 评论 0

zangqw

文章 0 评论 0

旧伤慢歌

文章 0 评论 0

qq_GlP2oV

文章 0 评论 0

旧时模样

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文