关于shiro无cc链利用杂谈记录

0x1题记

很早之前在打shiro遇见过这么情况,有key无利用链,那段时间又出来了一个shiro无cc利用链,但是在实际打时好时坏,想研究下为什么,最近有空记录下吧,当时用的工具应该是这个。


image.png

0x2环境

引入shiro必要依赖后,可以看到自动导入了cb依赖


image.png

手动将其去掉后,发现启动异常,说明cb是一个必要的依赖,也是shiro无cc链利用前提。


image.png

0x3cb1利用

看样子是可以直接用cb链打,使用cb链生成payload再AES加密通过rememberMe发送,。并没有计算机弹出,打失败了,看下tomcat异常,有个类没有,是cc依赖中的,跟一下看哪调用了。

Caused by: org.apache.shiro.util.UnknownClassException: Unable to load class named [org.apache.commons.collections.comparators.ComparableComparator] from the thread context, current, or system/application ClassLoaders.  All heuristics have been exhausted.  Class could not be found.

在cb链中会通过Comparator去调用TemplatesImpl的getOutputProperties()方法最后执行,如下。


image.png

这里传进去的是string,调用的第二个构造函数,然后会获取ComparableComparator的实例,这是在commons.collections依赖中的,由于此处的环境没有依赖,导致异常。


image.png

0x4nocc利用

既然如此,找一个实现了Comparator的接口传过去,让其调用第三个构造函数即可。在Comparator.java的示例中使用String.CASE_INSENSITIVE_ORDER


image.png

修改为

BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);

生成payload发送,攻击成功


image.png

0x5版本问题

回到开头,当时为什么会出现大量情况打不了。
经过测试,高版本的shiro使用的cb版本为1.9.3,当时工具使用的为1.8.3,由于打的payload和目标服务器的版本不一致,导致报错如下

Caused by: java.io.InvalidClassException: org.apache.commons.beanutils.BeanComparator; local class incompatible: stream classdesc serialVersionUID = -3490850999041592962, local class serialVersionUID = -2044202215314119608

将cb版本修改为1.9.3重新生成payload发送,利用成功。


image.png

0x6后记

在使用shiro较高版本后,发现其自动引入了commons.collections依赖,版本为3.2.2,这不正好解决了之前cb1链利用失败的那个问题。


image.png

重新使用cb链生成payload测试,发送后利用成功。虽然引入了commons.collections依赖,但是版本为3.2.2,用cc链仍然打不了。

你可能感兴趣的:(关于shiro无cc链利用杂谈记录)