Gopher 协议利用
gopher 协议利用
Gopher 协议
Gopher 是一个通信协议,用来设计,分配,搜索与检索文档中的 internet 协议的网络。利用 gopher 可以对 FTP,telnet,redis,memcache,基于一个 TCP 包的 exploit 等进行内网攻击,扩展了攻击面。
格式
1 | gopher://<host>:<port>/<gopher-path> |
如果省略 port,默认为 70 端口
gopher-path 可以是以下几种格式之一:
1 | 空 |
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 | GET /edit.php?a=Hi |
依照转换规则,转换为 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 | POST /edit.php HTTP/1.1 |
转换后
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 |
工具
FTP
TCP 流
1 | USER <user> |
redis
Mysql
FAST CGI
XXE
Gopher 协议利用