Redis 未授权访问致 RCE 实战
漏洞基本信息
| 项目 | 内容 |
|---|---|
| 漏洞名称 | Redis 未授权访问致远程代码执行 (RCE) |
| 漏洞原理 | 主从复制 (Master-Slave Replication) & 模块加载 |
| 危险等级 | Critical |
| 受影响版本 | Redis 4.x / 5.x 部分版本 |
| 测试环境 | Kali Linux (Vulhub / Docker) |
| 靶场目录 | ~/Desktop/vulhub/redis/4-unacc |
漏洞成因分析
Redis 默认配置下如果未开启 requirepass(认证密码)并绑定在 0.0.0.0,攻击者可直接远程连入数据库。
- 未授权进入:攻击者利用
6379端口的未授权访问特性直接操控数据库。 - 主从同步利用:这是 RCE 的关键。攻击者通过伪造一个恶意的 Master 节点,利用 Redis 的
SLAVEOF指令诱导受害节点进行全量同步。 - 恶意模块传输:在同步过程中,攻击者会将一个编译好的恶意动态链接库(
.so文件)作为“同步数据”发送给受害节点。 - 指令触发:受害节点接收到该文件并保存后,攻击者通过
MODULE LOAD指令将其加载进内存,从而在 Redis 内部扩展出执行系统命令的新功能。
渗透测试过程 (Exploit)
免责声明: 本实验仅用于安全教学与授权渗透测试,严禁用于任何非法用途。
1. 探测与指纹识别
利用 redis-cli 连入目标,确认是否存在未授权访问,并获取版本信息以判断是否支持 Module 特性。
1 | # 连接目标 Redis |
尝试使用 redis-rogue-server 工具进行主从复制攻击。遇到的困难:在 Docker 环境下,容器与宿主机存在网络隔离,导致 Setting dbfilename 后同步卡死。技术分析:容器无法主动连接回宿主机的 127.0.0.1 端口下载恶意插件。
2. 手工注入恶意模块
为了绕过网络环境限制,改用 “本地注入” 方案:
文件落地:将恶意插件 exp.so 强行拷贝至目标容器内部。
1 | docker cp exp.so 4-unacc-redis-1:/tmp/exp.so |
模块加载:在 Redis 终端执行加载指令。
1 | 127.0.0.1:6379> module load /tmp/exp.so |
3. RCE 执行
利用已加载的 system 模块提供的接口,执行系统级指令:
1 | 127.0.0.1:6379> system.exec "id" |
至此,已成功获取目标服务器的系统权限。
4. 深度防御建议
认证强化:在 redis.conf 中配置 requirepass 设置复杂的强密码。
网络隔离:修改 bind 配置,仅允许可信 IP 访问,或绑定在 127.0.0.1。
权限最小化:严禁以 root 权限运行 Redis 服务(本次实验中 Redis 已降权至 redis 用户运行,有效防止了攻击者直接获取 Root 权限)。
指令屏蔽:使用 rename-command 将 MODULE、SLAVEOF、CONFIG 等高危命令重命名。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ukio!




