一,环境配置
1,下载压缩包文件,上传到虚拟机解压,并进入文件目录,使用docker-compose up -d构建并运行镜像,
(这里面可能涉及docker 的镜像源或者代理的问题,导致镜像拉取不下来,可以配置代理,或者更改国内镜像源)
2.运行了镜像过后,他是用本地的8091端口映射为容器内的80端口,直接访问虚拟机的8091端口就行了
二,分析
1,直接访问虚拟机的8091端口,页面显示源码内容,可以看到定义了curl函数,执行url的请求,但是对url的值做了过滤,不允许file://,dict://,127.0.0.1,../,localhost等字样,但是为对http://做过滤,同时下面只要有info参数就会显示phpinfo的信息,我们可以在里面获取docker”内网“中的IP地址
根据传入的info参数,进入了phpinfo页面,可以获取到网站的服务器实际内网地址是172.18.0.3:80,下一步的思路是通过给url传入http://172.18.0.3:port可以查看该服务器主机有没有其他开发的端口,如mysql的3306之类的。
直接用burp抓包,再自动攻击的模块中,选中端口直接从1到65535爆破,当然如果从1到65535爆破的话时间也是非常长的,可以选取一些指定的端口,就比如mysql3306,redis6379等等
结果就是除了网站服务器本机除了80端口开放,并没有其他端口开放了,这情况下可以换个思路,有可能他的数据库等等放在内网其他主机上
接下来尝试爆破出其他内网存活主机:如下图可以看到主机最后一位为1,2,3的长度不一样,当然172.18.0.3是网站的服务器内网地址,现在我们可以尝试爆破172.18.0.1的开放端口,和172.18.0.2的开放端口
接下来流程还是更上面一样,爆破端口,或者用常用端口先试一下,我这边用一些常用端口测试,测试出了redis的报错信息,那就说明在内网地址为172.18.0.2的主机上存在redis数据库
这时候就可以结合ssrf+gopher+redis进行渗透了,这里补充一下知识点:
Gopher 是一种早期的网络协议,支持发送多行文本请求,它可以构造任意TCP请求(包括redis)格式如下:
gopher://<host>:<port>/<TCP数据流>
而redis默认是没有设置密码的,如果管理员没有给他设置密码,同时又存在ssrf漏洞未严格过滤,这就导致了我们可以利用gopher协议伪造出恶意访问链接,让redis写入文件(如ssh公钥,webshell)
这里至于gopher内容如何构造,我们可以使用一款工具Gophers,这个需要python2安装https://github.com/tarunkant/Gopherus
下载好过后直接进入文件,给执行权限,安装运行即可。
可以使用gopherus --help来看帮助文档
gopherus --exploit redis命令可以构建访问并执行ridis命令的gopherus协议的链接
因为前面访问172.18.0.2的时候存在80端口,我们可以在默认路径下通过redis写webshell,我这里生成的是在默认/var/www/html路径下写的<?php phpinfo();代码,直接复制他生成的gopher协议的信息
这里还需要将他生成的gopher协议的信息的地址更改一下,再对这个信息做一次url编码,因为生成的gopher协议信息包含%字符,在传输给服务器的时候,会先对其进行url解码,导致gopher协议内容被破坏,gopher协议的解析器识别不了这个内容。
但是发现并没有文件,所以可能这个路径下不能写文件,现在我们可以尝试爆破出其他有没有可写文件的路径
可以用在网上找一份目录字典,在burp中进行爆破,可以看到存在/var/www/html/upload目录,接下来就尝试能不能在这个目录下写文件
重新构造gopher:
直接再次访问,这时候页面再转圈圈,说明几乎成功了,正在写入
然后我们进入docker看一下
确实是写进去了,但是内容有点问题,这里我们可以写脚本生成gopher协议的内容,也可以在网上寻找脚本,重新试一次。总之大体思路就是这样。