Wdd
该文章首发在i春秋论坛,欢迎各位师傅完成专业爱好者认证,可第一时间获取最新技术资讯和实战技能分享。
(识别二维码,快速完成认证)
本文以Jackson为发掘目标,通过自研Java扫描工具发现新的调用链的方法和思路。
其实原本是想写一个代码审计扫描器的,但是由于工作量较大,中途缩减用来寻找调用链,于是就分享一下通过Python进行静态自动化调用链的发掘,当然通过规则配置也可以对其他调用链进行自动扫描和发掘。
01
Jackson简述
Jackson从2021年底就不再接受新的CVE了,也就是说通过绕过黑名单方式的CVE已经不收了,就算不收,也不能阻拦研究的热情。
1.主要发掘思路
继承原有类:在已经证实存在利用的基础链上,发现继承存在利用的类。
发现新的类:通过特征以及Jackson的利用特征来找到新的调用链。
2.扫描思路
扫描器通过Python首先将Java源文件解析为dict树,型如:
然后通过规则匹配的方式去匹配,给一个简易的规则样式。
这条规则的含义代表找到调用类型为URL,调用方法为openConnection,循环递归查找,即找到满足条件的方法,同时会在当前类中寻找调用此方法,最后指定这个方法的前缀。
主要的难点在于将Java再转为dict树和后期规则的编写,以及对规则内容的适配。现阶段就是规则+代码同时改的阶段。
3.Jackson利用特征
利用分为:远程jndi调用,xxe,ssrf等,不同的利用方式会使用不同的关键方法。本篇主要抛砖引玉,寻找ssrf相关的调用链。
除了调用规则和方法,Jackson需要要求方法必须是set,或者get,为了方便调用,还需要传入参数为string类型的,这样更加方便我们的调用,通过内部代码进行适配。
02
继承JEditorPane
已经有的调用链就不写了,我们找一些很少有人分析的,比如JEditorPane,javax.swing.JEditorPane。
简单的看一下,JEditorPane类中存在setPage方法,此方法有一个String的入参,然后将url传入setPage。
在这里调用getStream
最终调用openConnection
那么用自动扫描工具时,就可以根据继承关系去找符合两个条件的类。
一个条件是继承JEditorPane,还有一个条件是不能有setpage方法,因为如果子类没有setpage方法就会调用父类的setpage方法。
针对jdk1.7的包进行扫描:找到了一个类HTMLPane,具体位置是 sun.tools.jconsole.HTMLPane。
可以看到完美的符合我们的条件。
写一个demo测试一下。
成功绕过&利用
03
发现新的类
根据我们上面分析的,已经找到了一个触发点,就是URL.openConnection,那么我们自动扫描规则是:
通过找到一个方法存在URL.openConnection,并且这个方法是set或者get开头,参数流的尽头必须是传入参数,还得是String类型的。
规则和代码如下:
限制方法以及流:
可以看到成功扫描到了JEditorPane
要找到一个成功的调用链,还得再次进行筛选,并且要引入多个库进行扫描,由于目前本地数据没有那么多,所以只能给出示例扫描。
04
总结
按照人工智能的发展趋势,以后AI会实现自动寻找调用链的操作,但目前还没有成型的产品,所以不影响我们自己写一个自动化寻找调用链的工具。
原本是想写扫描器的,但由于工作量太大,并且内容和寻找调用链的方式有重合的部分,所幸直接改成自动化调用链检索工具。功能还未完善,需要时间修改测试,所以暂不开源了,仅当做寻找调用链的工具。
小伙伴们如果对本篇文章感兴趣,欢迎来i春秋论坛交流探讨,互相切磋。网络安全本来就是一个比较杂的学科,从我个人的经验来说,想要学好网络安全,首先要脚踏实地打好基础,并抱有浓厚的学习兴趣,同时多分析漏洞原理,可以向技术大佬们虚心请教,有项目实操机会尽量参加,可以快速提升实战技能。
原文始发于微信公众号(i春秋):Jackson调用链自动化发掘思路
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论