CVE重要漏洞复现-Fastjson1.2.24-RCE漏洞
本文仅供网络学习,不得用于非法目的,否则后果自负
1、漏洞简介
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了
阿里巴巴公司开源Java开发组件Fastjson存在反序列化漏洞(CNVD-2022-40233)。攻击者可利用该漏洞实施任意文件写入、服务端请求伪造等攻击行为,造成服务器权限被窃取、敏感信息泄漏等严重影响
该漏洞影响fastjson 1.2.80及之前所有版本
2、漏洞原理
2.1 原理概述
2.2 fastjson
fastjson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的java对象
2.3 Autotype
fastjson的主要功能就是将java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了,但是,fastjson在序列化以及反序列化的过程中并没有使用java自带的序列化机制,而是自定义了一套机制
对于JSON框架来说,想要把一个java对象转换成字符串,可以有两种选择:
1、基于属性
2、基于setter/getter
例如:
因为有了autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取@type的内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那么就可以利用这个特性,自己构造一个JSON字符串,并且使用@type指定一个自己想要使用的攻击类库
2.4 JNDI注入
JNDI注入和lookup函数
2.5 RMI
2.6 JdbcRowSetlmpl利用链分析
从java的函数文档可以查到DataSource是通过setDataSourceName来设置的,也就是datasource属性的set和get方法
所以这里就同时出现了get和set方法
2、找到调用了lookup方法的函数,下面进行分析那个函数能够触发lookup方法
(1)prepare()函数
这个函数的利用过程是execute()->prepare()->connect(),也就是得执行execute()方法才会执行到connect(),所以这个利用链使用的不是这个函数
(2)getDatabaseMetaData()函数
这个地方出现了connect函数,但是并没有set的方法,所以这个也不能成为利用链的一环
(3)setAuthCommit()函数
setAuthCommit()方法就使用了connect()函数,传值就是一个bool值,这个AuthCommit就既有set方法也有get方法
这个set方法很重要,只要能设置autoCommit就能调用set方法,而setAutoCommit()方法里面又调用了connect(),connect()里面就有我们需要的lookup(),从而构造整个的攻击链
2.7 JdbcRowSetlmpl利用
2.8 触发过程图
3、靶场模拟
3.1 实验环境
3.2 实验过程
docker拉取镜像
docker-compose up -d
启动环境并访问成功
通过DNSLog.cn来获取一个子域名
然后构造POST请求的正文
当然这样做是不行的,因为我们没有去修改请求头
将content-type修改为application/json
表明这个请求正文是json格式,后台才会处理这个反序列化的过程
然后去DNSLog.cn去查看一下,说明其存在漏洞
就是我们让它给我们反序列化inet address,它确实进行了反序列化的操作,还给我们做了域名解析
我们还可以使用bp或者Fidder进行content-type的修改
通过抓取的数据包,然后进去里面的头信息进行修改,然后再发送,就能给出现和上面一样的效果,也就能说明其存在漏洞
既然存在漏洞了,那接下来就考虑该如何去利用这个漏洞了?
漏洞利用
(1)编辑恶意类,以反弹shell为例,我们将其反弹到公网服务器上的8086端口
编译成Exploit.class
然后将这个Exploit.class文件放到Kali上去
然后在Kali上开启80服务
然后我们去看看能否访问,Kali的IP + 端口号,确实可以访问
开启一个LDAP服务器监听9999端口,远程加载Exploit类
使用marshalsec的目的是:帮我们做了一个中转,然后让其开启一个LDAP的服务
接下来我们使用Fidder进行操作
构造完成
意思就是让我们的目标主机进行反序列化的时候直接去调用远程的代码,就第二行(@type下面)
然后我们去公网服务器上开启监听
nc -lvp 8086
如果我们刚刚在Fidder上构造的请求发出去,然后公网服务器反弹成功,就说明我们的漏洞利用就已经完成了
然后点击execute,发送请求
反弹成功,也就是漏洞利用成功
确认一下,发现正确,是我们的docker环境
我们可以简单的对漏洞利用做一个总结:
第一台:我们搭建漏洞环境的主机,就叫Docker吧
第二台:kali,在这台主机里面做两件事情,第一件事情就是通过开放80端口来暴露我们Exploit这个恶意代码,另外一件事情就是开启我们的LDAP服务
第三台:公网服务器
第四台:我们的Windows主机
Windows访问我们的具有漏洞环境的主机,然后发送了一个JSON字符串,由于这个JSON字符串指定了@type,让这个目标主机(具有漏洞环境的主机)去远程调用LDAP服务的9999端口,然后这个LDAP服务器的9999端口就会给目标主机返回一个Exploit这个恶意代码,然后这个恶意代码就在目标主机上执行了,这个恶意代码里面让目标主机干的事情就是反弹到公网服务器
我们也可以去看一下它的内置的步骤
首先编译并上传命令执行代码,如http://evil.com/TouchFile.class:
然后将这个JAVA代码编译出来,编译成了Exploit.class
然后我们用这个新编译的文件进行一个替换,把之前编译好的文件替换了
然后在Kali开启80端口服务
然后我们启动marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class:
(我们使用jdk1.8的版本来开启rmi,不然版本太高不支持)
接下来就是发送请求进行调用
调用成功
可见,命令touch /tmp/success已成功执行:
(面试官如果问了不了解Fastjson,讲一下)
FastJson由于自定义了反序列化的机制,并且它的请求里面可以带上@type的方式,指定它反序列化哪个类,然后我们就可以利用lookup的函数来远程调用LDAP或RMI的远程方法,进而我们就能构造恶意代码在远程开起来,通过@type指定让fastJson反序列化哪个类,并且给这个类指定对应的属性,进而实现远程代码的调用,我们在攻击者主机上执行一个反弹shell的指令,然后就能把目标系统反弹到我们的攻击者主机上来了