gopher协议利用

原理

​ Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;

gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议

限制:gopher协议在各个编程语言中的使用限制

img

–wite-curlwrappers:运用curl工具打开url流
curl使用curl --version查看版本以及支持的协议

image-20201112134237536

Gopher协议格式

URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
  • gopher的默认端口是70
  • 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码

Gopher发送请求HTTP GET请求:

使用Gopher协议发送一个请求,环境为:nc起一个监听,curl发送gopher请求

nc启动监听,监听2333端口:nc -lp 2333

使用curl发送http请求,命令为

root@kali ~# curl gopher://192.168.17.129:2333/abcd

此时nc收到的消息为:

root@Ubuntu ~# nc -lp 2333
bcd

可以发现url中的a没有被nc接受到,如果命令变为

root@kali ~# curl gopher://192.168.17.129:2333/_abcd

此时nc收到的消息为:

root@Ubuntu ~# nc -lp 2333
abcd

所以需要在使用gopher协议时在url后加入一个字符(该字符可随意写)

那么如何发送HTTP的请求呢?例如GET请求。此时我们联想到,直接发送一个原始的HTTP包不就可以吗?在gopher协议中发送HTTP的数据,需要以下三步:

1、构造HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议

准备一个PHP代码

<?php
    echo "Hello ".$_GET["name"]."\n"
?>

一个GET型的HTTP包,如下:

GET /ssrf.php?name=c0tfl0g HTTP/1.1
Host: 192.168.17.1

URL编码后为:

curl gopher://192.168.17.1:80/_GET%20/ssrf.php%3fname=c0tfl0g%20HTTP/1.1%0d%0AHost:%20192.168.17.1%0d%0A

image-20201112135125744

在转换为URL编码时候有这么几个坑

1、问号(?)需要转码为URL编码,也就是%3f
2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a
3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)

Gopher发送请求HTTP POST请求:

发送POST请求前,先看下POST数据包的格式

POST /ssrf.php HTTP/1.1
host:192.168.17.1

name=c0tfl0g

那我们将上面的POST数据包进行URL编码并改为gopher协议

curl gopher://192.168.17.1:80/_POST%20/ssrf.php%20HTTP/1.1%0d%0AHost:192.168.17.10d%0A%0d%0Aname=c0tfl0g%0d%0A

ssrf.php的代码为

<?php
    echo "Hello ".$_POST["name"]."\n"
?>

使用curl发起gopher的POST请求后,结果为

image-20201112135747716

这里有个疑问:为什么发起了2次请求?为什么会把参数name=Margin当作一个请求?这个地方我调试了很久,发现问题出现在POST请求头中,我之前发POST请求都是直接用脚本,但从来没考虑过哪些参数是POST请求必须的,经过排查,发现有4个参数为必要参数(四个参数的含义不再赘述):

POST /ssrf.php HTTP/1.1
host:192.168.17.1
Content-Type:application/x-www-form-urlencoded
Content-Length:12

name=c0tfl0g
curl gopher://192.168.17.1:80/_POST%20/ssrf.php%20HTTP/1.1%0d%0AHost:192.168.17.1%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:12%0d%0A%0d%0Aname=c0tfl0g%0d%0A

image-20201112140207536

发现请求正常,OK,那我们现在就介绍完了gopher协议的GET和POST请求。

Gopherus

此工具生成gopher链接,用于利用SSRF并在各种服务器中获取RCE

项目地址:https://github.com/tarunkant/Gopherus

使用方法

安装:

chmod +x install.sh
sudo ./install.sh
python gopherus.py -h
CommandDescription
gopherus --helpHelp
gopherus --exploitArguments can be :
–exploit mysql
–exploit postgresql
–exploit fastcgi
–exploit redis
–exploit zabbix
–exploit pymemcache
–exploit rbmemcache
–exploit phpmemcache
–exploit dmpmemcache
–exploit smtp

参考文章与工具:

https://github.com/firebroo/sec_tools/tree/master/common-gopher-tcp-stream

https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher

https://xz.aliyun.com/t/5844

https://zhuanlan.zhihu.com/p/112055947

<think>好的,我现在需要回答用户关于Gopher协议的介绍、历史和工作原理的问题。首先,我要回顾用户提供的引用内容,看看有哪些相关信息可以利用。根据引用[1],Gopher是由明尼苏达大学团队在1991年开发的,目的是创建简单高效的信息检索工具。另外,用户还提到了其他引用,比如引用[2]和[3]关于网络协议的层次和组成要素,引用[4]则补充了网络协议的一般概念。 首先,我需要整理Gopher协议的基本介绍,包括它的定义、开发背景和时间。然后历史部分需要说明它的发展过程,可能包括其鼎盛时期和后来的没落原因,比如与HTTP的竞争。接着是工作原理,这部分需要结合协议的结构,可能涉及到它的菜单驱动接口、客户端-服务器交互方式,以及使用的协议层次。根据引用[2],第四层负责数据传输,但Gopher可能应用在应用层,所以需要确认协议的分层位置。 另外,引用[3]提到的协议三要素(语义、语法、时序)可能需要应用到Gopher协议的分析中,解释其如何符合这些要素。例如,Gopher的请求和响应格式属于语法,支持的操作类型属于语义,交互顺序属于时序。但用户的问题可能不需要这么深入,所以需要简明扼要地描述工作原理,而引用这些要素作为补充说明。 需要确保回答结构清晰,分点介绍,每个部分都有对应的引用支持。同时,生成的相关问题要基于用户可能感兴趣的扩展方向,比如与其他协议的比较、没落原因、现代应用等。最后,检查是否符合系统级指令,如使用正确的中文、LaTeX格式(虽然这个问题可能不需要数学公式,但要注意如果有技术术语可能需要适当格式),以及引用标识的正确添加。</think>### Gopher协议介绍 #### 1. 基本定义 Gopher是一种基于**客户端-服务器模型**的分布式文档检索协议,通过**分层菜单导航**实现信息访问。其设计核心是简化用户操作,仅需通过键盘方向键即可浏览文本资源[^1]。 #### 2. 历史背景 - **1991年**:由明尼苏达大学Mark P. McCahill团队开发,名称源自该校吉祥物"金花鼠(Gopher)" - **鼎盛时期**:1993年前后成为主流协议,全球超10,000个Gopher服务器 - **转折点**:1993年WWW协议(HTTP)诞生后逐渐被取代,因其仅支持纯文本且扩展性不足[^1] #### 3. 工作原理 **协议分层结构**(参考OSI模型[^2]): | 层级 | 功能说明 | |------|----------| | 应用层 | 定义文档请求命令和菜单结构 | | 传输层 | 使用TCP端口70进行数据传输 | **协议三要素解析**[^3]: - **语义**:支持`GET`请求、目录列表查询、文本下载等操作 - **语法**:请求格式为`<选择器字符串><CR><LF>`,例如请求根目录:`\r\n` - **时序**:客户端建立TCP连接→发送选择器→服务器返回响应→关闭连接 **典型交互流程**: ```plaintext 客户端 服务器 |----连接端口70---->| |---发送选择器----->| |<----返回菜单------| |----断开连接------>| ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值