漏洞挖掘
针对这种漏洞的挖掘思路很简单:找到接收不可信 ObjectMessage 的地方 之后分析程序所使用的一些库,看看能不能找到一些gadgets来构造一个 POP链,实现一个漏洞利用。实际上基本所有实现了ObjectMessage的组件中,都不会对输入的消息进行身份验证,直接拿去反序列化了。下面看看最近在这方面出现的漏洞。
下面是其中一个漏洞概要的截图。
可见这类漏洞发送的罪魁祸首就是 getObject 函数接收了不可信的输入。
漏洞利用
漏洞原理搞清楚了,进行利用就非常简单了。漏洞的本质就是接收不可信数据进行反序列化。那么我们就把发送包含payload对象序列化之后的数据的ObjectMessage发送到有漏洞的程序那就ok了。
整个一个漏洞利用的流程可以用下图来形象的解释。
攻击者假装为JMS 生产者向Broker提交一个带有恶意payload的ObjectMessage之后 Broker把消息分发给 JMS消费者,其拿个这样一个消息后对其中的序列化对象部分进行反序列化,触发漏洞,然后实现代码执行。而往往JMS消费者不会只有一个,所以现实中的情况会是这样。
有趣...
在实际构造exploit时并没有上面讲的那么轻松,一个成功的exploit 所要考虑的东西还是挺多的,比如:
1.jre的版本
2.应用程序所使用的库
3.哪些库会在程序运行时的类路径中
4.是否开启 Java Security Manager
........
单纯的手工白盒分析是非常麻烦的,于是有了下面这个黑盒自动化工具来帮助我们。
JMET(Java Message Exploitation Tool)
下载地址:https://github.com/matthiaskaiser/jmet
工具支持的应用:
(责任编辑:安博涛)