aws-pentesting

$npx mdskill add wgpsec/AboutSecurity/aws-pentesting

Execute end-to-end AWS penetration tests across 47+ services.

  • Guide attackers from zero credentials to full control.
  • Integrates with IAM, S3, EC2, Lambda, and STS APIs.
  • Selects tactics based on current asset type and phase.
  • Outputs actionable attack paths via decision trees.
SKILL.md
.github/skills/aws-pentestingView on GitHub ↗
---
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)为主线,组织从"零凭据"到"完全控制"的完整渗透路径,并通过决策树引导到专项技能深入。

## 深入参考

识别到具体攻击阶段后,加载对应参考文档获取完整技术细节:

- 未授权枚举技术清单(25+ 服务) → 读 [references/unauthenticated-enum.md](references/unauthenticated-enum.md)
- 持久化技术清单(22+ 服务) → 读 [references/persistence-techniques.md](references/persistence-techniques.md)

## 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 快速枚举流程

```bash
# 1. 检查 Bucket 是否存在并可列出
aws s3 ls s3://TARGET-BUCKET --no-sign-request

# 2. 如果可列出,递归下载敏感文件
aws s3 cp s3://TARGET-BUCKET/ ./loot/ --recursive --no-sign-request \
  --exclude "*" --include "*.env" --include "*.pem" --include "*.key" \
  --include "*credentials*" --include "*config*"

# 3. 通过 Bucket 反查 Account ID
pip install s3-account-search
s3-account-search arn:aws:iam::YOUR_ACCT:role/YOUR_ROLE s3://TARGET-BUCKET
```

### Cognito 快速利用

```bash
# 如果发现 Identity Pool ID(格式:region:guid),获取未认证凭据
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"

# 如果发现 User Pool Client ID,尝试注册
aws cognito-idp sign-up --client-id CLIENT_ID --username test@test.com --password 'P@ssw0rd123!'
```

→ 完整的 25+ 服务枚举清单,读 [references/unauthenticated-enum.md](references/unauthenticated-enum.md)

## Phase 2: 凭据验证与权限评估

获取凭据后,第一步是验证有效性并评估权限范围。

### 2.1 凭据验证

```bash
# 身份确认(最基础的检查)
aws sts get-caller-identity

# 返回示例:
# Account: 123456789012
# UserId: AIDA...
# Arn: arn:aws:iam::123456789012:user/developer

# 判断凭据类型
aws sts get-access-key-info --access-key-id AKIA...
```

### 2.2 权限枚举

```bash
# 方法一:直接查询 IAM 策略(需要 iam 读权限)
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

# 方法二:如果是 Role
aws iam list-attached-role-policies --role-name ROLENAME
aws iam list-role-policies --role-name ROLENAME

# 方法三:暴力枚举权限(无需 IAM 读权限)
# enumerate-iam 工具会尝试调用大量 API 来探测可用权限
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](references/persistence-techniques.md)

参考 `aws-post-exploit` 技能,获取数据窃取与横向移动深度指南

## 附录: AWS 速查

### 常用 AWS CLI 命令

```bash
# 身份与权限
aws sts get-caller-identity                           # 当前身份
aws iam get-user                                      # 当前 IAM 用户信息
aws iam list-attached-user-policies --user-name USER  # 附加的策略
aws iam list-roles                                    # 列出所有角色
aws organizations list-accounts                       # 列出组织内所有账户

# 枚举资源
aws s3 ls                                             # 列出所有 S3 Bucket
aws ec2 describe-instances --region REGION             # 列出 EC2 实例
aws lambda list-functions --region REGION              # 列出 Lambda 函数
aws rds describe-db-instances --region REGION           # 列出 RDS 实例
aws secretsmanager list-secrets --region REGION         # 列出 Secrets

# 凭据操作
aws sts assume-role --role-arn ARN --role-session-name s   # 切换角色
aws sts get-session-token --duration-seconds 43200         # 获取临时凭据

# 元数据服务(从 EC2 实例内部)
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)不受区域限制。
More from wgpsec/AboutSecurity