找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 84|回复: 0

一种另类的 shiro 检测方式

[复制链接]

2万

主题

128

回帖

10万

积分

管理员

积分
105860
发表于 2022-5-10 12:22:09 | 显示全部楼层 |阅读模式 IP:山东省 移动/数据上网公共出口

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 mind 于 2022-5-10 12:32 编辑

一种另类的 shiro 检测方式

0x01 前言
shiro 这玩意今年出现在大众视野里,众多师傅大喊hw没有shiro不会玩,实际上追溯这个洞最早开始时候是2016年的事情了,也就是说因为某些攻防演练,这个洞火了起来,当然我也聊一点不一样东西,因为其他东西师傅们都玩出花了。


0x02 过程


首先判断 shirokey 这个过程,我之前采用的逻辑就是 YSOURLDNS 针对 dnslog 进行处理,如果没有 dnslog 的情况下,考虑直接用CC盲打,判断延迟。这种会存在一些小问题,比如当这个 shiro 没有 dnslog ,且 gadget 不是CC的情况下,可能就会漏过一些漏洞。大家判断是否是 shiro 的逻辑,普遍都是在 requestcookie 中写入 rememberMe=1 ,然后再来看 responseset-cookie 是否出现的 rememberMe=deleteMe 。下文就针对这个 rememberMe=deleteMe 进行深入研究,看看为啥会这样。网上已经有很多文章,包括我自己梳理了一遍 shiro 反序列化的整个过程,这里就不多赘述,核心点在 AbstractRememberMeManager#getRememberedPrincipals 这段代码中。




好了,下面我们分别来看两种情况。


1、key不正确的情况
当key错误的时候,我们知道 AbstractRememberMeManager#decrypt 是处理解密的过程。


进行处理,由于key错误自然是解不出自己想要的内容,所以进入到 JcaCipherService#crypt(Cipher cipher, byte[] bytes)  这里会抛出异常。

6.png


这里抛出异常之后,自然会进入到我们最开始核心点 AbstractRememberMeManager#getRememberedPrincipalscatch 异常捕获的逻辑当中,别急,先慢慢品一下这个。




跟进去 onRememberedPrincipalFailure 方法,这里代码就4行,不多赘述继续跟进 forgetIdentity 方法

  • forgetIdentity 方法当中从 subjectContext 对象获取 requestresponse ,继续由forgetIdentity(HttpServletRequest request, HttpServletResponse response)这个构造方法处理。








跟进forgetIdentity(HttpServletRequest request, HttpServletResponse response),


看到一个 removeFrom 方法。




继续跟进 removeFrom 方法,发现了给我们的 Cookie 增加 deleteMe 字段的位置了。






2、反序列化gadget还有一种情况,大家用反序列化 gadget 生成之后,拿shiro加密算法进行加密,但是最后依然在 response 里面携带了rememberMe=deleteMe。


1.png


这里再来品一下,还是回到 AbstractRememberMeManager#convertBytesToPrincipals 方法当中,这里的key肯定是正确的,所以经过 decrypt 处理之后返回 bytes 数组,进入了 deserialize 方法进行反序列化处理。




跟进 deserialize 方法,下面重点来了。

反序列化的 gadget 实际上并不是继承了 PrincipalCollection ,所以这里进行类型转换会报错。
2.png

但是在做类型转换之前,先进入了 DefaultSerializer#deserialize 进行反序列化处理,等处理结束返回 deserialized 时候,进行类型转换自然又回到了上面提到的类型转换异常,我们 key 不正确的情况下的 catch 异常捕获的逻辑里,后面的流程就和上述一样了。

3.png

0x03 构造


那么总结一下上面的两种情况,要想达到只依赖shiro自身进行key检测,只需要满足两点:
1.构造一个继承 PrincipalCollection 的序列化对象。
2.key正确情况下不返回 deleteMe ,key错误情况下返回 deleteMe


基于这两个条件下 SimplePrincipalCollection 这个类自然就出现了,这个类可被序列化,继承了 PrincipalCollection

4.png

构造POC实际上也很简单,构造一个这个空对象也是可以达到效果的。

5.png

当然,如果您有新的姿势,欢迎和我一起探讨。互相学习才是最好的进步。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|IOTsec-Zone|在线工具|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-5-18 12:30

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表