Redis未授权访问漏洞实验

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key – value 缓存产品有以下三个特点:1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。3.Redis支持数据的备份,即master-slave模式的数据备份。

漏洞描述

部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

漏洞的产生条件:(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

https://files.jb51.net/file_images/article/201707/201771694630532.png?201761694637

(图片来源脚本之家)

漏洞复现

安装Redis,首先去官网下载Redis软件包

wget http://download.redis.io/releases/redis-3.2.11.tar.gz

解压软件包tar xzf redis-3.2.11.tar.gz

进入redis-3.2.11目录执行make

make结束后进入src目录将redis-server和redis-cli复制到/usr/bin下面,这样启动redis-server和redis-cli就不用每次都进入安装目录了。(在这里首次解压的时候并未发现这两个文件,原因是Redis是C实现的,所以需要gcc来进行编译)

接着返回目录redis-3.2.11,将redis配置文件redis.conf拷贝到/etc/目录下

漏洞环境配置

去掉ip绑定,允许除本地外的主机远程登录redis服务

关闭保护模式(protected-mode),允许远程连接redis服务

漏洞重现测试

这里192.168.1.2作为受害者,192.168.1.3作为攻击者。先在受害者机器上面开启开启redis服务

在攻击者机器上面生成公钥和私钥

进入.ssh目录,将生成的公钥保存到key.txt

测试攻击者机器和受害者机器之间是否可以互相通讯

使用redis-cli -h ip命令连接主机A,将key.txt文件写入redis

怀疑原因是防火墙和selinux,所以把防火墙和selinux都关闭了。重新写入,成功。

远程登录受害者主机的redis服务,并更改redis备份路径为ssh公钥存放目录,一般默认为/root/.ssh),使用CONFIG GET dir命令得到redis备份的路径。

 

 

 

 

 

设置上传公钥的备份文件名字为authorized_keys

 

 

 

检查是否更改成功,然后保存退出。

 

 

 

 

 

在两台主机上面同时开启ssh服务,并在攻击者机器上面以root身份连接受害者机器。

成功利用redis未授权访问漏洞实现了ssh免密码登录目标服务器。

修复建议

以下操作需要重启

1.禁用一些高危命令

修改 redis.conf 文件,禁用远程修改 DB 文件地址

rename-command FLUSHALL “”

rename-command CONFIG “”

rename-command EVAL “”

或者通过修改redis.conf文件,改变这些高危命令的名称

rename-command FLUSHALL “name1”

rename-command CONFIG “name2”

rename-command EVAL “name3”

2 以低权限运行 Redis 服务(重启redis才能生效)

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

groupadd -r redis && useradd -r -g redis redis

3 为 Redis 添加密码验证(重启redis才能生效)

修改 redis.conf 文件,添加

requirepass mypassword

(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)

4 禁止外网访问 Redis(重启redis才能生效)

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

bind 127.0.0.1

在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错

5 修改默认端口

修改配置文件redis.conf文件

Port 6379

默认端口是6379,可以改变成其他端口(不要冲突就好)

6 保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。

将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

chmod 400 ~/.ssh/authorized_keys

为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:

chattr +i ~/.ssh

如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

至此,实验全部结束。文中部分内容转载于互联网,由于无法确定原作者,因此未注明。