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

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

漏洞利用
Redis未授权访问
影响版本:配置不当的全版本
漏洞原理:配置不当导致未授权访问:
- 未设置密码认证
- 允许任意 IP 连接
- 直接暴露在公网且没有添加防火墙规则等安全策略

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

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

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

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

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

利用Redis写SSH公钥
原理:在数据库中插入一条数据,将本机的公钥作为 value,key 值随意,然后通过修改数据库的默认路径为 /root/.ssh,默认缓冲文件为 authorized_keys,把缓冲的数据保存在文件里,这样就可以在服务器端的 /root/.ssh 下生成一个授权的 key。
注意:此方法需要 Redis 以 root 用户身份运行才能生效。
先生成 SSH 密钥对:
1 | |

处理公钥格式:公钥前后各加两个换行符,防止 Redis 的文件头尾信息干扰公钥解析:
1 | |
然后将公钥写入缓存:
1 | |

最后修改备份设置,将备份路径指向 SSH 目录,备份文件名指向认证文件:
1 | |
到这一步由于权限不够就失败了:

最后携带私钥登录:
1 | |
利用Redis写计划任务
原理:在数据库中插入一条数据,将计划任务的内容作为 value,key 值随意,然后通过修改数据库默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,从而成功写入计划任务实现反弹 shell。
注意事项:
- 写计划任务只能在 CentOS 上使用,Ubuntu 无法复现
- 原因:Redis 写文件后权限为 644,Ubuntu 要求
/var/spool/cron/crontabs/<username>权限必须为 600 才能执行,而 CentOS 的/var/spool/cron/<username>在 644 权限下也能执行- 同样需要 root 用户权限
1 | |
主从复制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 | |
