aws-pentesting
$
npx mdskill add wgpsec/AboutSecurity/aws-pentestingExecute 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
- 401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
- ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
- ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
- ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
- ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
- ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
- adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
- adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
- agent-security|
- ai-data-security|