Java反序列化漏洞分析(二)-Shiro550

本文首发于微信公众号:谁不想当剑仙

本文最后更新于:2021年6月15日 晚上

这是一篇失败的文章,要学的东西太多了,高看我自己了。终究是纸上得来终觉浅,绝知此事要躬行

0x00 纠错

首先纠正一下上篇文章Java反序列化漏洞分析(一)-Shiro550的错误错误,上篇提到dnslog使用原生环境搭建没有打成功,这是错的错的错的,其实是可以打的。我给搞错了,URLDNS 这个利用链本身不依赖于任何第三方库,同时不限制jdk的版本,所以通常是用来检测反序列化的点(目标出网),我当时没打成功,是因为我做实验时,用了同一条dnslog的url打过一遍,第二遍死活不出结果,写这篇文章时又测了几次,发现是url的锅,要不停的变换才会一直出结果原生的shiro550可以使用dnslog探测

Java默认有TTL缓存,DNS解析会进行缓存,所以可能会出现第一次收到DNS的log,后面可能收不到的情况。

0x01 原生Shiro550执行命令

当使用URLDNS链打过去,在DNSLOG平台有回显的时候,就说明这个地方存在反序列化漏洞。

但是要利用的话还得是使用CC链等利用链去进行命令的执行(shiro550中自带的是cc3.2.1版本的组件)。

经过测试ysoserial拥有的CommonsCollections利用链从1-7都无法成功执行命令, 都是报错image-20210528211554019

image-20210525211529910

无法反序列化一个数组,经常敲代码,修bug的都知道,报错的位置一般都在最下边的,去看看

at org.apache.shiro.io.DefaultSerializer.deserialize(DefaultSerializer.java:77) 直接点过去看看image-20210526220345069

可以看到在初探Java反序列化漏洞(一)中提到的重点函数readObject()函数,但是又有一点点不一样,它这里是new了一个ClassResolvingObjectInputStream,而非传统的ObjectInputStream 问题就可能出现在这里,全局搜索看下image-20210526220837880

这里是通过 ClassUtils.forName(osc.getName());来反射调用的,而前面都是通过Class.forName(“java.lang.Runtime”); 来进行反射执行命令的image-20210526221020003

直接在这里下断点,然后使用CC2链打一下,调试半天也没看懂,太菜了,先记下 参考文章中说的是

Shiro resovleClass 使用的是ClassLoader.loadClass()而非Class.forName(),而ClassLoader.loadClass不支持装载数组类型的class。

别人在环境中引入了commons-collections4.0,使得ysoserial的CommonsCollections2利用链可以成功利用。这是因为CommonsCollections2用的是非数组形式的利用链,在该利用链上没有出现数组类型的对象,这使得在shiro的环境下,可以正确执行命令。(后续学习这条链)

0x01 构造新的利用链

我不会。。。 看半天还是没看懂,前置知识缺的有点多,直接放链接吧

https://www.anquanke.com/post/id/192619#h2-3

总结就是利用链中的ChainedTransformer这个类的利用是无法成功的,因为它的类属性iTransformers是数组类型的Transformers,最终通过使用TemplatesImpl.newTransformer函数来动态loadClass构造好的evil class bytes

通过大佬改造的https://github.com/wh1t3p1g/ysoserial CommonsCollections10 利用链打一下image-20210527084745187

这个图又是假的,淦,用大佬的CC10链打了之后,突然怀疑之前的命令搞错了,我之前是用whoami测试的,我想起了mac命令执行不太一样,重新用open -a Calculator试了一遍,发现CC2链又可以成功了,瞬间凌乱(已经把添加的commons-collections4.0版本给注释了),这两天一直在重新测试找原因,通过重新下载shiro,切换版本重新来一遍,CC2并不可以打原生的shiro550,用大佬的CC10也打不出来,原因也找不到,前置知识缺的太多了,再搞下去也是浪费时间。

最终找到我为啥可以打成功,因为我在shiro/samples/web目录下生成过war包,当时是在测试4.0版本RCE,生成的target目录没有删除,之后启动的时候应该都是使用target目录下的东西,即使去除4.0版本依旧没用,生成的war包并没有改变还是可以RCE的4.0版本,搞得我怀疑人生。还有说JRMP 这个Gadget可以打,也是废了,没成功。

不搞了,心累,等补充完知识,再重新来吧

接下来通过https://github.com/frohoff/ysoserial这个项目来学习java反序列化的利用链吧,慢慢来吧。

0x02 参考

推荐一个Chrome插件—Toby for Chrome,适合舍不得关标签页,留待后续研究的。

中途参考的文章太多了,就用这个插件生成的分享链接吧

https://www.gettoby.com/p/m9955hzbsf6s


来杯奶茶