Redis 未授权访问

Redis默认未配置身份鉴别,当端口侦听在公网上时,攻击者可通过Redis未授权访问,获取到服务器shell。

上靶场!!!

shell redis获取key shell连接redis_redis


可以看到服务器开启了两个端口 48965 和 41617(由于靶场中途退出,重启后,截图上的两个端口和后边用的发生了改变),通过搭建 redis 客户端环境,对着两个端口连接测试,发现都可以直接连接到 redis 数据库。

shell redis获取key shell连接redis_网络_02


先查看一波,看一下配置保存数据文件的目录,看到是 /var/lib/redis 可以判断是Linux系统主机,而且只有48965端口可以正常使用

shell redis获取key shell连接redis_redis_03


看一下保存数据的文件名

shell redis获取key shell连接redis_redis_04


通过查看保存文件的所在目录,可以发现该服务器操作系统为Linux,然后尝试设置配置文件目录为 /root/.ssh ,通过上传自己的ssh公钥,然后ssh远程到该服务器

shell redis获取key shell连接redis_php_05


尝试设置目录为 /root/.ssh 发现权限不够,看来通过写ssh公钥的方式是行不通了,然后想到可以写 webshell 获取系统命令执行权限,但是目标服务器似乎没有提供web服务,尝试了80和8080这些端口都不是,最后尝试了一下题目中给定的端口…

shell redis获取key shell连接redis_服务器_06


surprise

shell redis获取key shell连接redis_服务器_07


找到了web界面,然后就要去找以下该站点的物理路径了,输入一个不存在的文件名或目录名

shell redis获取key shell连接redis_shell redis获取key_08


通过报错可以看出,这个网站使用的中间件是Apache,我们知道Linux中Apache默认的站点目录在 /var/www/html中,尝试设置redis文件保存目录为该目录,并且设置保存文件名为php

shell redis获取key shell连接redis_网络_09


很开心,我的设置是成功的,下面来验证以下这个站点的物理路径是否是该路径,这里设置一个字符串的键值,键为 script,值为我们希望写入到 shell.php中的内容,save保存以下,将该键值写入到shell.php中(之前设置了保存路径及保存文件名为 /var/www/html/shell.php)

shell redis获取key shell连接redis_redis_10


通过浏览器访问试试,可以看到在 Script前后有乱码,这就是我们使用 \n\n 换行的原因

shell redis获取key shell连接redis_shell redis获取key_11


既然站点的物理路径找到了,而且文件写入也没有问题,下面就直接写入一句话木马,上蚁剑

将一句话木马保存到shell.php中

shell redis获取key shell连接redis_服务器_12


shell redis获取key shell连接redis_服务器_13


右击进入虚拟终端

shell redis获取key shell连接redis_服务器_14


获取到 flag

shell redis获取key shell连接redis_shell redis获取key_15

这里因为权限的原因没有使用到ssh公钥的方式,而是使用到了通过网站获取shell,通过ssh方式的话,就是将保存目录设置为 /root/.ssh ,保存文件名设置为 authorized_keys ,然后将自己生成的公钥设置为字符串的值,保存后,使用ssh连接即可(当然,对方网络中防火墙可能设置了ssh只允许固定ip连接,或不允许连接,这样的话,就只能眼睁睁的看着了…通过端口转发突破防火墙这里不谈)