0x1题记
很早之前在打shiro遇见过这么情况,有key无利用链,那段时间又出来了一个shiro无cc利用链,但是在实际打时好时坏,想研究下为什么,最近有空记录下吧,当时用的工具应该是这个。
0x2环境
引入shiro必要依赖后,可以看到自动导入了cb依赖
手动将其去掉后,发现启动异常,说明cb是一个必要的依赖,也是shiro无cc链利用前提。
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()方法最后执行,如下。
这里传进去的是string,调用的第二个构造函数,然后会获取ComparableComparator的实例,这是在commons.collections依赖中的,由于此处的环境没有依赖,导致异常。
0x4nocc利用
既然如此,找一个实现了Comparator的接口传过去,让其调用第三个构造函数即可。在Comparator.java的示例中使用String.CASE_INSENSITIVE_ORDER
修改为
BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);
生成payload发送,攻击成功
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发送,利用成功。
0x6后记
在使用shiro较高版本后,发现其自动引入了commons.collections依赖,版本为3.2.2,这不正好解决了之前cb1链利用失败的那个问题。
重新使用cb链生成payload测试,发送后利用成功。虽然引入了commons.collections依赖,但是版本为3.2.2,用cc链仍然打不了。