Shiro下的CC链
slug
series-status
status
summary
date
series
type
password
icon
tags
category
引言
在我们常见的以及之前讲解过的反序列化利用链中,我们常用的就是CC1-CC7的利用链,用于执行命令或代码,但是在Shiro的原生项目中并没有继承Commons Collection,因此我们不能直接使用CC链去利用漏洞。一般来说会通过CB链进行攻击,不过对于在项目中不仅仅使用了Shiro,还使用了CC的话,那也可以通过CC去攻击。
这里我们先手动添加CC依赖后进行尝试攻击分析。
自行添加CC后进行漏洞利用
- 添加依赖

- 编译运行
- 我们先选择使用CC6的代码序列化后利用前文的exp生成攻击payload

- 然后利用burp进行发包

- 发现攻击并没有生效

- 回顾Shiro中的报错,发现提示
Unable to load clazz named [[Lorg.apache.commons.collections.Transformer;] from class loader [ParallelWebappClassLoader

- 这里的报错是说无法加载到Transformer数组类,也就是我们在ChainedTransformer中使用的数组类无法加载到
- 回到
DefaultSerializer
中的deserialize方法,可以看到这里它其实不是单纯的调用的Object的readObject方法

- 而是调用的ClassResolvingObjectInputStream的readObject方法
- 这个是Shiro里自定义的输入流,进到这个类内部,可以发现除了构造方法只有一个其他方法

- 这里这个resolveClass方法,是Java在反序列化过程中必定会被调用的一个方法
- 如果有一个类重写了的话就会调用重写后的方法
- 对比原resolveClass方法

- 可以看到这里原生的方法和这里不同的就是调用的谁的forName方法
- 而在Shiro中的这个ClassUtils是Shiro中自己写的一个工具类,观察它的forName方法

- 这里其实可以理解为ClassLoader的loadClass是没办法加载数组类的,但是Class对象的是可以的
- 具体的原理后文有时间会再讲解
- 因此我们要解决的就是不能在利用链中出现数组类
- 因此,整合多条利用链的代码为如下代码
- 执行效果

- 这里因为没有出现对数组的使用,因此可以成功执行了~
为什么加载不了数组类?
- 我们重新发送一下调用数组类的CC6的包然后单步调试
- 可以看到这里进到了resolveClass

- 然后进入forName

- 这里会接连调用:当前线程的类加载器、当前的类加载器、系统的类加载器
- 这里要注意,我们自己写的代码相关的最后编译后都是在这个WEB-INF下的

- 因此这里我们不需要关心JDK的类加载器,因为它是加载不到CC相关的类的,所以只关注当前线程的第一个类加载器即可
- 这里可以看到它的类加载器是这个
ParallelWebappClassLoader
(Tomcat中处理web程序的一个类加载器)

Tomcat类加载机制:https://www.jianshu.com/p/a18aecaecc89

- 这里简单介绍一下这些类加载器
- Catalina一看就知道是加载Tomcat自己的
- Shared是加载一些共享类的
- WebApp就是加载一些web程序的和jsp的
- 可以看到这里加载到了HashMap类

- 这里我们进入下一轮的loadClass,但是这里我的本地环境有些问题,步进到tomcat的源码中出了问题,因此后续的截图来自参考视频
- 这里之所以数组类会无法加载是因为在loadClass方法中,对于目标是否来自Tomcat自己的有不同的处理方法
- 对于来自自己的:

- 会调用这个findClass
- 然后对于非项目本身的是调用Class.forName

- 因此这里要看一下findClass为什么不能加载数组类
- 这里的findClass方法首先会调用
findClassInternal
方法

- 这里会先获取类的路径,最后会调用
defineClass
- 这里会把类名转换为文件名、路径+
.class
- 但是这里转换成数组类以后它的名字是
Lorg.apache.commons.collections.Transformer;
然后后边再加上.class
那这个文件它肯定没有,因为它名字解析的是有问题的,因此这里在Shiro的cc利用里是不能调用数组类的,这也是为什么网上大部分教程用的是CC2利用链并在项目里添加了Commons Collection 4版本~
- 因此,只有当它想加载的类是自己网站的依赖里的数组类才会出现加载不到的情况,如果是JDK的数组类其实是可以加载到的。
参考视频:https://www.bilibili.com/video/BV1dq4y1B76x
Loading...