一、了解漏洞
1.redis是什么?
redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
2.redis未授权访问是什么漏洞?
Redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
二、分析漏洞原理
1.redis未授权访问漏洞产生的原因是什么?
(1)默认情况下,redis会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,攻击者可远程登录redis服务;
(2)如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下,未授权访问 Redis 以及读取 Redis 的数据。
2.一个系统存在这个漏洞会导致什么后果?
(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
(2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
(3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
三、漏洞的重现和利用
(注意!实验平台我采用的是Fedora26)
1.安装并配置redis
使用源码编译安装:
(1) 从官网下载源码的压缩包:wget http://download.redis.io/releases/redis-3.2.11.tar.gz
(2) 使用tar xzf redis-3.2.11.tar.gz解压压缩包,
然后进入解压后的目录:cd redis-3.2.11
输入make并回车;
(3) 进入src目录,将redis-server和redis-cli拷贝到/usr/bin目录下(这样可以在终端直接输入redis-server或者redis-cli启动服务,不必每次都要进入安装目录):
(4) 进入目录redis-3.2.11,将redis.conf拷贝到/etc/目录下,
然后编辑etc中的redis.conf如下所示:
(5)输入redis-server /etc/redis.conf &启动redis服务;
2.安装ssh服务:
fedora安装有ssh服务但没有启动,需使用systemctl start sshd命令启动ssh服务
3.利用重现:
首先打开两个虚拟机,网络都设置为桥接网卡,界面为环回适配器,混杂模式为全部允许
然后使用ifconfig命令查看两台虚拟机的ip:
发现ip一样,使用ifconfig 网卡名 ip地址 up命令修改攻击端(右侧虚拟机)ip为192.168.0.147:
虚拟机A为被攻击端(ip为192.168.0.146),B为攻击端(ip为192.168.0.147)
在A中开启redis-server:
在B中生成ssh公钥和私钥,这里密码设置为空:
进入.ssh目录,将生成的公钥保存到1.txt:
将1.txt写入redis(使用redis-cli -h ip命令,开始前先ping一下目标主机ip确定能通):
可以ping通,若是ping不通再运行一遍修改ip的命令ifconfig 网卡名 ip地址up
将1.txt写入redis(redis-cli的路径为B主机中redis的路径):
redis-cli命令远程登录A主机的redis服务,然后获取redis备份的路径:
更改redis备份路径:
设置上传公钥的备份文件名字为authorized_keys:
检查是否更改成功,没有问题就保存然后退出:
开启主机A和主机B的ssh服务(Fedor默认ssh服务关闭),命令为systemctl start sshd.serveice:
在主机B使用ssh免密登录主机A:
四、使用openvas对该存在漏洞的系统进行扫描
扫描结果发现redis服务空密码漏洞
这个漏洞可能会造成远程无密码登陆
该漏洞使用了编号为1.3.6.1.4.1.25623.1.0.105291的nvt,找到文件名:
找到该nvt的源码
原理是获得redis服务的端口号,直接空密码连接一下,如果能登录redis服务,则说明redis为空密码,有漏洞。