Gopher 协议利用

gopher 协议利用

Gopher 协议

Gopher 是一个通信协议,用来设计,分配,搜索与检索文档中的 internet 协议的网络。利用 gopher 可以对 FTP,telnet,redis,memcache,基于一个 TCP 包的 exploit 等进行内网攻击,扩展了攻击面。

格式

1
gopher://<host>:<port>/<gopher-path>

如果省略 port,默认为 70 端口

gopher-path 可以是以下几种格式之一:

1
2
3
4
# 定界“/”也可以为空, gophertype 默认为 “1”
<gophertype><selector>
<gophertype><selector>%09<search>
<gophertype><selector>%09<search>%09<gopher_string>

gophertype 是一个单字符字段,表示 URL 所引用资源的 gopher 类型

selector 是 gopher 选择器字符串。在 gopher 协议中, gopher 选择器字符串,是一个8位字节序列,可以包含除 09H(制表符),0AH(LF)和 0DH(CR)以外的任意8位字节。

search 用于向 gopher 搜索引擎提交搜索数据,和 selector 之间用 %09 分隔。

gopher 客户端通过将 gopher selector 字符串发送到 gopher 服务器来指定要检索的项目

转换规则

  • 如果第一个字符是>或者< 那么丢弃该行字符串,表示请求和返回的时间。

  • 如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。

  • 将\r字符串替换成%0d%0a。

  • 空白行替换为%0a。

  • 问号需要转码为URL编码%3f,同理空格转换成%20。

  • 在包的最后要加%0d%0a,代表消息结束。

转换实例

需要在传输的数据前加一个无用字符

使用 gopher 协议发送 HTTP 请求

一个简单的 GET 请求:

1
2
3
GET /edit.php?a=Hi HTTP/1.1
Host: 127.0.0.1
Connection: close

依照转换规则,转换为 gopher 协议

1
gopher://192.168.11.1:80/_GET%20/edit.php%3fa=Hi%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aConnection:%20close%0d%0a

POST 同理

1
2
3
4
5
POST /edit.php HTTP/1.1
Host: 127.0.0.1
Connection: close
Content-Type: application/x-www-form-urlencoded
a=Hi

转换后

1
gopher://192.168.11.1:80/_POST%20/edit.php%3fa=Hi%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aConnection:%20close%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0a

工具

Gopherus

FTP

TCP 流

1
2
3
4
5
6
7
USER <user>
PASS <pass>
PWD
EPSV
TYPE A
LIST
QUIT

redis

Mysql

FAST CGI

XXE

作者

lll

发布于

2020-10-03

更新于

2022-09-19

许可协议