Redis未授权访问漏洞分析 – 作者:frost729

漏洞成因

redis默认绑定在 0.0.0.0:6379,且防火墙未配置不信任IP禁止访问策略,redis直接暴露在公网

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

漏洞危害

攻击者可远程登录redis,导致敏感信息泄露。

攻击者登录redis后,可更改redis设置,也可使用flushall命令,删除所有数据。

攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。

如果redis以root身份运行,攻击者可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

漏洞复现

环境搭建

攻击机 kali 192.168.25.128
受害机 ubuntu 192.168.25.130

1、在ubuntu上安装redis:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz #下载redis
tar -xzf redis-2.8.17.tar.gz #解压包

进入解压目录,执行如下命令:

make

如果make命令执行失败,且报错:

jemalloc/jemalloc.h: No such file or directory

这是由于没有安装gcc,可以用如下命令安装:

sudo apt-get install gcc

运行redis时可能还会报错,运行失败,提示运行当前redis需要更高版本的tcl,运行如下命令安装tcl:

sudo apt-get install tcl 

以上都安装成功之后,运行如下命令,重新编译redis

make distclean  && make

出现如下界面,redis安装成功:

1607158527_5fcb4aff3b531b3ce046f.png!small?1607158527546

2、redis基本配置

进入redis解压目录下的src目录,执行如下命令:

# 执行下面两条命令的目的是,每次可以直接在终端启动服务,而不必每次都进入安装目录
cp redis-server /usr/bin 
cp redis-cli /usr/bin

返回redis解压目录,执行如下命令:

cp redis.conf /etc/

1607163355_5fcb5ddb088336f265825.png!small?1607163370641

使用如下命令启动redis服务

redis-server /etc/redis.conf

出现如下界面,启动成功:

1607163393_5fcb5e01727250f370a54.png!small?1607163393825

之后,查看redis配置文件

vim ../../etc/redis.conf 

确保bind 127.0.0.1没有启用,如下图:1607159186_5fcb4d92f00377f618b99.png!small?1607159187154

自此,环境部署完成,下面开始攻击。

漏洞利用

未授权访问的漏洞一共有3种利用方式,分别开始介绍。

第一种,利用redis写入shell

要能成功写入shell,需要满足如下条件:

可以通过redis-cli远程登录受害机

知道web发布绝对路径,且路径有读写权限

web服务器运行中

ubuntu中的web目录信息如下:

1607160268_5fcb51ccac36a32a3e26b.png!small?1607160268922

下面开始攻击。

通过redis-cli连接到ubuntu

1607160378_5fcb523a69558a9ac420b.png!small?1607160378627

如下图,写入成功:

1607163761_5fcb5f713c77078506b2a.png!small?1607163761928

直接在kali中访问写入的脚本,执行成功:

1607163873_5fcb5fe1682394bc60022.png!small?1607163873838

第二种,利用密钥登录,获取root权限

在kali中生成ssh登录需要的公钥和私钥,将公钥保存到test.txt文件中,方便一会儿写入ubuntu:

1607164484_5fcb6244ac8aaca96f68a.png!small?1607164485260

将tes.txt文件中的公钥写入到ubuntu:

1607164900_5fcb63e4f06bc5db71ab8.png!small?1607164901268

redis-cli中的-x参数表示:从标准输入读取数据作为该命令的最后一个参数。

之后,还需要一步,就是设置redis的默认备份目录和备份文件。因为要通过ssh免密登录, 所以这里设置目录和备份文件,基本上是固定的。

默认的,ssh的免密登录公钥存默认放在目录/root/.ssh下,且密钥存放文件为:authorized_keys。如果ubuntu中没有/root/.ssh目录,自己可以手动创建一个。

1607165573_5fcb6685c3ad5c1ca1be1.png!small?1607165574185

至此,kali的公钥已经写入到ubuntu中。然后,在kali中用密钥登录ubuntu:

1607166566_5fcb6a667a3f268bf0db8.png!small?1607166567493

这里说明一点,要确保ubuntu是安装了ssh的,否则无法成功入侵。以上为成功通过root登录ubuntu。

第三种,利用crontab设置定时任务,反弹shell

这种方式想获取shell,前提是权限要允许,可以设置定时任务,且任务设置完毕是可执行的。

先启用nc监听端口:

1607169846_5fcb773683eb6daf338e8.png!small?1607169846646

之后设置定时任务,将shell写入到ubuntu的定时任务中:

1607169968_5fcb77b0891a9c2b82059.png!small?1607169968871

之后等待,很快就会连接到ubuntu:

1607170272_5fcb78e011c6f92d8b7fe.png!small?1607170272367

解决方案

1. 在redis.conf文件中,绑定redis访问IP地址,指定固定的IP地址才能访问redis;

bind 127.0.0.1

2. 在redis.conf文件中,为redis添加密码验证

requirepass mypassword

3. 为redis配置单独的运行账户,以最低权限运行,且禁止redis账户远程登录

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

来源:freebuf.com 2020-12-05 20:32:44 by: frost729

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论