Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞?
Redis在默认情况下,会绑定在0.0.0.0:6379。如果没有采取相关的安全策略,比如添加防火墙规则、避免其他非信任来源IP访问等,这样会使Redis服务完全暴露在公网上。如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在访问目标服务器时,可以在未授权的情况下访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行文件的读写等操作。攻击者可以成功地将自己的ssh公钥写入到目标服务器的 /root/.ssh文件夹下的authotrized_keys文件中,进而可以使用对应地私钥直接使用ssh服务登录目标服务器。
简单来讲,我们可以将漏洞的产生归结为两点:
redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略,直接暴露在公网上
没有设置密码认证(一般为空),可以免密码远程登录redis服务
漏洞可能产生的危害:
攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行flushall来清空所有数据
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器
既然我们已经知道了攻击手法,那么我们该如何实现这一漏洞的利用呢?
Redis未授权访问漏洞的利用 环境准备两台主机(这里我选择的是两台虚拟机,一台用的是Ubuntu,一台用的是Kali Linux)
redis-3.2.11.tar.gz
一、 安装redis服务 1. 从官网下载redis源码的压缩包 wget 2. 下载完成后,解压压缩包 tar xzf redis-3.2.11.tar.gz 3. 然后进入解压后的目录:cd redis-3.2.11,输入make并执行出现如下即编译成功:
4. make结束后,进入src目录:cd src,将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)你可能会碰到如下问题:
python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo cp redis-server /usr/bin/ cp: 无法创建普通文件'/usr/bin/redis-server': 文本文件忙这个时候你先去检查/usr/bin目录下是否已经存在redis-server,如果不存在的话,我们选择停止服务:
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-cli -h 127.0.0.1 -p 6379 shutdown或者直接杀死进程就好了:
python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo kill -9 PID我们再启动服务就好了~
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server此时我们再检查下/usr/bin目录下是否有redis-cli和redis-server:
python@ubuntu:~$ ls /usr/bin | grep redis 5. 返回目录redis-3.2.11,将redis.conf拷贝到/etc/目录下 python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/ 6. 编辑etc中的redis配置文件redis.conf python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf去掉ip绑定,允许除本地外的主机远程登录redis服务:
关闭保护模式,允许远程连接redis服务:
7. 使用/etc/目录下的redis.conf文件中的配置启动redis服务 root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf这里我又踩了一个大坑,我遇到了这样一个问题:
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server /etc/redis.conf *** FATAL CONFIG FILE ERROR *** Reading the configuration file, at line 80 >>> 'protected-mode no' Bad directive or wrong number of arguments