| name | aws-pentesting |
| description | AWS 云环境渗透测试总体方法论。当目标使用 AWS 云服务、发现 AWS 相关资产(S3 Bucket/EC2 实例/Lambda 函数/CloudFront 分发)、获取 AWS 凭据(AK/SK/Session Token/IAM Role)、或需要对 AWS 环境进行安全评估时使用。提供从未授权枚举到提权、后渗透、持久化的全流程攻击决策树,引导到专项技能深入。覆盖 47+ AWS 服务攻击面 |
| metadata | {"tags":"aws,amazon,cloud,ec2,s3,lambda,iam,sts,rds,eks,ecs,cloudfront,枚举,提权,后渗透,持久化,AWS渗透,云安全","category":"cloud"} |
AWS 云环境渗透测试方法论
AWS 是全球最大的公有云平台,承载了大量企业核心业务系统。其超过 200 项服务构成了庞大的攻击面——IAM 策略配置错误、S3 Bucket 暴露、EC2 元数据泄露、Lambda 函数 URL 未鉴权等问题在实际评估中频繁出现。本技能以攻击阶段(Phase)为主线,组织从"零凭据"到"完全控制"的完整渗透路径,并通过决策树引导到专项技能深入。
深入参考
识别到具体攻击阶段后,加载对应参考文档获取完整技术细节:
Phase 0: 攻击面判断
拿到一个 AWS 相关目标后,首先判断当前手持的资产类型,决定进入哪个攻击阶段:
当前持有什么?
├── 无任何凭据
│ ├── 有目标域名/IP → Phase 1(未授权枚举)
│ ├── 有 SSRF 漏洞 → 直接打元数据服务获取凭据 → Phase 2
│ └── 仅知道组织名称 → OSINT + Phase 1
│
├── 有 AWS AK/SK(AKIA 开头 = 长期密钥)
│ └── → Phase 2(凭据验证与权限评估)
│
├── 有临时凭据(ASIA 开头 + SessionToken)
│ └── → Phase 2(注意:有效期通常 1-12 小时,需快速行动)
│
├── 在 EC2/Lambda/ECS 实例内部
│ └── → 通过元数据获取绑定的 IAM Role 凭据 → Phase 2
│
└── 有 AWS SSO Token / IAM Identity Center 会话
└── → Phase 2(需额外确认可访问的账户和角色)
AWS 凭据类型速查
| 凭据类型 | 识别特征 | 有效期 | 获取方式 |
|---|
| 长期 AK/SK | AccessKeyId 以 AKIA 开头,20 字符 | 永久(直到轮换) | 控制台创建 / 泄露获取 |
| 临时 STS 凭据 | AccessKeyId 以 ASIA 开头 + SessionToken | 15分钟 ~ 36小时 | AssumeRole / GetSessionToken |
| IAM Role(实例绑定) | 通过 169.254.169.254 获取 | 自动轮换 | EC2/Lambda/ECS 元数据 |
| SSO Token | JSON 格式,含 accessToken 字段 | 通常 8 小时 | ~/.aws/sso/cache/ |
| Cognito Token | JWT 格式 Identity/Access Token | 1 小时 | Cognito Identity Pool |
Canary Token 检测
在使用获取到的凭据前,应先判断是否为蜜罐令牌(Canary Token)。使用蜜罐凭据会立即触发告警。常见特征:
- AccessKeyId 与已知蜜罐服务(如 Thinkst Canaries、SpaceCrab)的格式匹配
- 来自异常渠道(故意暴露的配置文件、过于明显的泄露点)
- 可通过
aws sts get-access-key-info --access-key-id AKIA... 查询所属账户,与已知蜜罐账户比对
Phase 1: 未授权枚举
在没有任何 AWS 凭据的情况下,仍可对目标进行大量信息收集。AWS 有 25+ 服务存在未授权枚举面。
高价值枚举目标
| 目标 | 攻击方式 | 价值 |
|---|
| S3 Bucket | 域名枚举 + 暴力猜解 + DNS CNAME | 数据泄露、获取凭据文件 |
| Lambda Function URL | https://{id}.lambda-url.{region}.on.aws/ | Web 漏洞利用 |
| Cognito User Pool | 尝试注册新用户 | 获取认证身份 → IAM Role |
| Cognito Identity Pool | 获取未认证 IAM Role | 直接获取 AWS 凭据 |
| EC2 公开端口 | Nmap + 服务指纹 | SSRF → 元数据 → IAM 凭据 |
| 公开 AMI / EBS 快照 | describe-images --executable-users all | 提取硬编码凭据 |
| API Gateway | https://{id}.execute-api.{region}.amazonaws.com/ | API 漏洞利用 |
| CloudFront 分发 | https://{id}.cloudfront.net | Origin 发现、缓存投毒 |
S3 快速枚举流程
aws s3 ls s3://TARGET-BUCKET --no-sign-request
aws s3 cp s3://TARGET-BUCKET/ ./loot/ --recursive --no-sign-request \
--exclude "*" --include "*.env" --include "*.pem" --include "*.key" \
--include "*credentials*" --include "*config*"
pip install s3-account-search
s3-account-search arn:aws:iam::YOUR_ACCT:role/YOUR_ROLE s3://TARGET-BUCKET
Cognito 快速利用
aws cognito-identity get-id --identity-pool-id "us-east-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
aws cognito-identity get-credentials-for-identity --identity-id "us-east-1:yyyyy"
aws cognito-idp sign-up --client-id CLIENT_ID --username test@test.com --password 'P@ssw0rd123!'
→ 完整的 25+ 服务枚举清单,读 references/unauthenticated-enum.md
Phase 2: 凭据验证与权限评估
获取凭据后,第一步是验证有效性并评估权限范围。
2.1 凭据验证
aws sts get-caller-identity
aws sts get-access-key-info --access-key-id AKIA...
2.2 权限枚举
aws iam get-user
aws iam list-attached-user-policies --user-name USERNAME
aws iam list-user-policies --user-name USERNAME
aws iam list-groups-for-user --user-name USERNAME
aws iam list-attached-role-policies --role-name ROLENAME
aws iam list-role-policies --role-name ROLENAME
pip install enumerate-iam
enumerate-iam --access-key AKIA... --secret-key ...
2.3 权限评估决策树
当前身份权限如何?
├── 有 iam:* 或 AdministratorAccess → 已是管理员,直接 Phase 4
├── 有 iam 读权限但无写权限 → 枚举所有用户/角色/策略,寻找提权路径 → Phase 3
├── 有特定服务权限(如 s3:*、ec2:*、lambda:*)
│ ├── 检查是否有 iam:PassRole → 可能通过 PassRole 提权 → Phase 3
│ ├── 有 ec2:RunInstances + iam:PassRole → EC2 提权 → Phase 3
│ └── 可直接利用当前权限进行后渗透 → Phase 4
└── 权限极低 → 尝试暴力枚举更多权限,或回到 Phase 1 寻找更多入口
参考 aws-iam-policy-analysis 技能,进行深度策略分析
参考 cloud-iam-audit 技能,进行跨云 IAM 审计
参考 cloud-aksk-exploit 技能,获取 AK/SK 完整利用链
2.4 自动化审计工具
| 工具 | 用途 | 命令 |
|---|
| enumerate-iam | 暴力枚举可用权限 | enumerate-iam --access-key ... --secret-key ... |
| Pacu | AWS 利用框架(枚举+提权+后渗透) | pacu → import_keys → exec iam__enum_permissions |
| ScoutSuite | 多云安全审计报告 | scout aws -p PROFILE |
| Prowler | AWS 安全最佳实践检查 | prowler aws --profile PROFILE |
| CloudFox | 攻击路径发现 | cloudfox aws --profile PROFILE all-checks |
| PMapper | IAM 提权路径图分析 | pmapper --profile PROFILE graph create |
Phase 3: 提权
AWS 提权的核心思路:利用当前权限去获取更高权限。AWS 有数百个权限,其中很多组合可以形成提权路径。
常见提权路径概览
| 提权路径 | 关键权限 | 原理 |
|---|
| iam:CreatePolicyVersion | 创建新的策略版本 | 新建一个 Admin 权限的策略版本并设为默认 |
| iam:AttachUserPolicy / AttachRolePolicy | 附加托管策略 | 直接给自己附加 AdministratorAccess |
| iam:PutUserPolicy / PutRolePolicy | 设置内联策略 | 给自己写入 Allow * 策略 |
| iam:PassRole + ec2:RunInstances | PassRole 到 EC2 | 启动绑定高权限 Role 的 EC2 实例 |
| iam:PassRole + lambda:CreateFunction | PassRole 到 Lambda | 创建绑定高权限 Role 的 Lambda 并执行 |
| sts:AssumeRole | 角色链 | 切换到更高权限的 Role |
| iam:CreateLoginProfile | 为用户创建控制台密码 | 接管其他用户的控制台访问 |
| iam:UpdateAssumeRolePolicy | 修改角色信任策略 | 使自己可以 AssumeRole 到高权限角色 |
PassRole 提权原理
iam:PassRole 是 AWS 提权中最核心的权限之一。它允许用户将一个 IAM Role "传递"给 AWS 服务。如果用户有 iam:PassRole 加上某个服务的创建权限(如 ec2:RunInstances、lambda:CreateFunction),就可以创建一个绑定了高权限 Role 的资源,然后通过该资源间接获得高权限。
攻击者拥有: iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction
│
├─ 1. 创建 Lambda 函数,绑定一个拥有 AdministratorAccess 的 Role
├─ 2. Lambda 代码中调用 IAM API 给攻击者账户添加 Admin 策略
└─ 3. 调用该 Lambda → 攻击者获得管理员权限
参考 aws-iam-privesc 技能,获取 46 个服务的详细提权路径
Phase 4: 后渗透与持久化
获得较高权限后,进入后渗透阶段。目标是数据获取、横向移动和建立持久化。
4.1 数据发现与获取
优先搜索哪些数据源?
├── S3 Bucket → 文档、备份、日志、配置文件
├── RDS / DynamoDB → 业务数据库
├── Secrets Manager / Parameter Store → 凭据和配置
├── EBS 快照 → 挂载后可读取完整文件系统
├── CloudWatch Logs → 应用日志中的敏感信息
└── CodeCommit → 代码仓库
4.2 横向移动
AWS 环境中的横向移动主要发生在两个维度:
跨账户移动:
- 利用
OrganizationAccountAccessRole(管理账户 → 成员账户)
- 利用跨账户角色信任策略(
sts:AssumeRole)
- 利用共享资源(S3 Bucket Policy、KMS Key Policy)
跨服务移动:
- EC2 实例上的 SSM Agent → SSM RunCommand 横向到其他实例
- ECS/EKS 任务角色 → 容器逃逸到宿主机
- Lambda 函数角色 → 修改函数代码执行任意操作
4.3 持久化技术概览
| 服务 | 持久化方法 | 隐蔽性 |
|---|
| IAM | 创建后门用户/角色、添加 Access Key、修改信任策略 | 低(IAM 变更易被审计) |
| Lambda | Layer 后门、Extension 注入、版本/别名权重分配、异步自循环 | 高 |
| EC2 | UserData 后门、AMI 后门、SSH Key 注入、安全组连接跟踪 | 中 |
| STS | Role Chain Juggling(角色链循环续期) | 高 |
| CloudFormation | CDK Bootstrap 信任外部账户 | 中 |
| Cognito | 添加外部身份提供商、修改风险配置 | 高 |
| SSM | CreateAssociation 定时执行命令 | 中 |
| EventBridge | 定时规则触发恶意 Lambda/ECS 任务 | 中 |
| SNS/SQS | 添加外部订阅者持续窃取消息 | 高 |
| ECR | 仓库策略后门、镜像投毒 | 高 |
→ 完整的 22+ 服务持久化技术清单,读 references/persistence-techniques.md
参考 aws-post-exploit 技能,获取数据窃取与横向移动深度指南
附录: AWS 速查
常用 AWS CLI 命令
aws sts get-caller-identity
aws iam get-user
aws iam list-attached-user-policies --user-name USER
aws iam list-roles
aws organizations list-accounts
aws s3 ls
aws ec2 describe-instances --region REGION
aws lambda list-functions --region REGION
aws rds describe-db-instances --region REGION
aws secretsmanager list-secrets --region REGION
aws sts assume-role --role-arn ARN --role-session-name s
aws sts get-session-token --duration-seconds 43200
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
AWS 服务缩写对照表
| 缩写 | 全称 | 攻击面关键词 |
|---|
| IAM | Identity and Access Management | 权限策略、角色信任、提权 |
| STS | Security Token Service | 临时凭据、AssumeRole |
| EC2 | Elastic Compute Cloud | 实例、元数据、安全组、AMI |
| S3 | Simple Storage Service | Bucket 策略、ACL、公开访问 |
| Lambda | Lambda (Serverless) | 函数 URL、Layer、环境变量 |
| RDS | Relational Database Service | 公开访问、快照泄露 |
| EKS | Elastic Kubernetes Service | RBAC、ServiceAccount |
| ECS | Elastic Container Service | 任务定义、IAM Role |
| ECR | Elastic Container Registry | 镜像仓库策略 |
| CloudFront | CloudFront (CDN) | Origin 暴露、缓存规则 |
| SNS | Simple Notification Service | Topic 策略、订阅者 |
| SQS | Simple Queue Service | 队列策略、消息窃取 |
| SSM | Systems Manager | RunCommand、Parameter Store |
| KMS | Key Management Service | Key Policy、Grant |
| Cognito | Cognito | User Pool、Identity Pool |
注意事项
CloudTrail 审计感知: 几乎所有 AWS API 调用都会被 CloudTrail 记录。以下操作会产生高可见性日志事件:
- IAM 变更(CreateUser、AttachPolicy、CreateAccessKey)
- 角色切换(AssumeRole)
- 跨区域操作
部分 API 在 CloudTrail 中为"数据事件"(如 S3 GetObject),默认不记录但组织可能启用了。
GuardDuty 检测风险: GuardDuty 会检测以下行为:
- 凭据在异常 IP/区域使用
- EC2 实例与已知恶意 IP 通信
- S3 大规模数据导出
- IAM 异常权限变更
- DNS 隧道流量
速率限制: AWS API 有速率限制(通常每秒 5-20 次调用),暴力枚举时需注意节流,否则会触发 ThrottlingException 并可能引起告警。
区域差异: AWS 资源是区域隔离的。枚举时需遍历所有启用的区域(aws ec2 describe-regions),不要只检查 us-east-1。全球服务(IAM、Route53、CloudFront、STS)不受区域限制。