跳到主要内容

工程实践:使用 Fuzztag 爆破反序列化链(2.0)

· 阅读需 3 分钟
Yak Project
网络安全垂直语言团队

前情回顾

在之前的更新中,我们新增了几个标签,yso:exec、yso:urldns、yso:headerecho、yso:bodyexecheaderauth、yso:dnslog,这些Fuzztag 涵盖了对反序列化链的爆破以及回显利用,为了涵盖更多的使用场景,本次新增了两个探测 Gadget的标签,并且在Web Fuzzer中增加了这些标签的提示功能。

新增标签

新增标签:yso:find_gadget_by_dns、yso:find_gadget_by_bomb,这两个标签可用于探测 Gadget,方便大家进行反序列化漏洞的利用链的探测。

yso:find_gadget_by_dns(domain)标签用于 dns出网的利用链探测,使用时只需填写一个 dnslog的域名即可,如yso:find_gadget_by_dns(test.dnstunnel.run)。

原理简单来说就是通过URLDNS这条链探测一个Class,通过一些特有的Class来判断是否存在对应的利用链。

FIND_GADGET_BY_BOMB

yso:find_gadget_by_bomb(className)标签可用于不出网的利用链探测,使用时可以使用内置的all参数,all参数会使用一份内置的Class<->Gadget对应表进行探测。

当然也可以手动输入需要探测的Class

如yso:find_gadget_by_bomb(java.util.HashMap)。

原理简单来说就是通过构造反序列化炸弹消耗服务器性能,达到类似sleep(10000)的效果,通过判断响应时间来判断探测的Class是否存在。

以上具体原理细节部分见参考文章:https://gv7.me/articles/2021/construct-java-detection-class-deserialization-gadget/

实战演练

1环境搭建

为了方便,这里直接使用了vulhub中的JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504)当作测试环境。

2漏洞检测

使用 yso:find_gadget_by_dns(domain)探测利用链

构造如下数据包:

查看dnslog

从dnslog的返回结果,对比版本号可以很方便的看出

存在CommonsCollections1/3/5/6/7、CommonsBeanutils2链,同时还探测出了目标的操作系统为linux。

我们再使用Yso-Java-Hack模块进行确认,如下选择CommonsCollections5生成payload进行测试。

发送payload

检查结果

执行成功,结果符合预期。

使用 yso:find_gadget_by_bomb(className)探测利用链

构造如下数据包:

通过对响应时间的排序可以发现,其中的几个数据包响应明显不同,同时查看Payload字段发现和yso:find_gadget_by_dns探测结果一致。

自定义检测Class,如java.util.HashMap,该类存在,因此响应时间较长。

检测一个不存在的Class,如java.util.HashMapxx,该类不存在,因此响应正常。

通过上述的实际操作,结果符合我们的预期。

(ps:探测出来的利用链并非均可利用,如某些利用链有 Jdk 版本要求)

标签提示功能

由于陆续添加的标签也越来越长了,因此添加了对yso开头标签的一些提示功能,如下图:


本文首发于 Yak Project 公众号,阅读原文