声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
No.1
起因
该洞主要是weblogic的coherence.jar存在可以构造反序列化的gadget类,通过T3协议处理后导致漏洞触发,本文主要是学习weblogicT3序列化,并构造利用链的过程。
No.2
利用链分析
通过网上公布的poc,得知利用链如下:
![4a2c6d562c94447b1c832940fa7b6b2b.png](https://i-blog.csdnimg.cn/blog_migrate/2887eaaea1d30ca4d1ddf4c5b1bd86b7.jpeg)
poc
![1399aed5ec5ade70983cd2d0fbd710ef.png](https://i-blog.csdnimg.cn/blog_migrate/48e7605dbf4f63db34ff434c3e3a9c48.jpeg)
首先查看ReflectionExtractor.extract方法:
![80c7125db8edc4dc2fd960d94f823ef6.png](https://i-blog.csdnimg.cn/blog_migrate/66543dedb23a8017ac16eabc12c695a9.jpeg)
![61ab3222e8cc1d352265a69425f1cc96.png](https://i-blog.csdnimg.cn/blog_migrate/00d59c96fe3b4f1d13ce2e3fbcc6e442.jpeg)
![6b87d6a5c899c128305baa1ea41b7efc.png](https://i-blog.csdnimg.cn/blog_migrate/a225deb94b3f872a92afcbd5569f0e3e.jpeg)
可以看到这里return了一个method.invoke,进一步构造代码如下。
![283d65c5549b55fbf6c3a3a644deeee2.png](https://i-blog.csdnimg.cn/blog_migrate/f1a1e1e5c424b1771e0dc2d8cb29c356.jpeg)
![09ba3eb0a3758cb81ba9a213addfc60a.png](https://i-blog.csdnimg.cn/blog_migrate/d0b7e7be271509550c9d7b30068bebbc.jpeg)
可以利用该代码直接弹出cmd,ReflectionExtractor 这个方法设置了method和invoke的方法。poc最开使得代码类似于CommonsCollections1的transform都是做了一个this.method的赋值。
![8b42c01199b5375b8aab348378d21b4a.png](https://i-blog.csdnimg.cn/blog_migrate/a8ced2037f349b668cd38b9e7287976c.jpeg)
但是只有触发extract方法时,该反射调用的最终方法才会被执行。这里根据payload,进一步跟入,查看LimitFilter类的toString方法
![5564160b039e970d2f37a2877aa4fe08.png](https://i-blog.csdnimg.cn/blog_migrate/ab75f394e5a649c7f03a196fd2f9445e.jpeg)
这里可以看到在LimitFilter的toString方法中之只要满足判断this.m_comparator的值属于ValueExtractor类就能进行对extract方法的调用。而reflectionExtractor刚好属于ValueExtractor类
构造测试代码
![57461237cafe12b687fbcf9e2bceb550.png](https://i-blog.csdnimg.cn/blog_migrate/51958445c90a6092bc7c2ed4bff36858.jpeg)
这里相当于执行了第一个测试代码的reflectionExtractor.extract(runtime);这里整个invoke反射链就完成了,接下来是如何进行readObject的。
这里可以看到这个BadAttributeValueExpException和CommonsCollections1使用的反序列化方法是一样的。执行BadAttributeValueException.readObject前,把val赋值为LimitFilter这个类就回调用toString方法,而LimitFilter.toString刚好形成之前的反射链。
![6fba074779ea70383f0a66ccac1773fc.png](https://i-blog.csdnimg.cn/blog_migrate/f47605963b6a598a4ea0fe6c1f42c17d.jpeg)
BadAttributeValueException的readObject方法
![f76c5dc8b8bc4d62ad72baac5a7d7808.png](https://i-blog.csdnimg.cn/blog_migrate/95466e4de1716ea4d1635a10ed500bf8.jpeg)
![7469f181232c5080f95285bdd0822424.png](https://i-blog.csdnimg.cn/blog_migrate/af75f8d688ba096648d258be310b49c8.jpeg)
至此整个反序列化完成
![73cf0034eae673fbacfdfb20b124c0a9.png](https://i-blog.csdnimg.cn/blog_migrate/fbb7b166f94852874800c39363c5e7bf.jpeg)
![98ebfe535aa8109117648e13b08dd637.png](https://i-blog.csdnimg.cn/blog_migrate/65bbe86d534e8ca37febfcbd72e88842.jpeg)
使用此条链会出现如下报错是因为Runtime这个类没实现序列化接口。原理已经搞清楚了修改一下poc就可以利用了。
![de0858024c1700a014ac88b51b05c756.png](https://i-blog.csdnimg.cn/blog_migrate/9a51d32e10db55155f6b97c520e057cd.jpeg)
No.3
修复建议
升级补丁,参考oracle官网发布的补丁https://www.oracle.com/security-alerts/cpujan2020.html 如果不依赖T3协议进行JVM通信,禁用T3协议。
进入WebLogic控制台,在base_domain配置页面中,进入安全选项卡页面,点击筛选器,配置筛选器。在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则框中输入 7001 deny t3 t3s 保存生效(需重启)
![0b218e5fe9f4ec63c96484651835aebc.png](https://i-blog.csdnimg.cn/blog_migrate/1e60cb97df1a5fb720952cd4840c692b.jpeg)
https://www.easyaq.com