网盾网络安全培训学校育,只培训技术精英
全国免费咨询电话: 15827351614
Redis未授权访问漏洞分析

漏洞成因

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

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

漏洞危害

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

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

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

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

漏洞复现

环境搭建

攻击机kali192.168.25.128受害机ubuntu192.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安装成功:

 

 

2、redis基本配置

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

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

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

cp redis.conf /etc/

 

 

使用如下命令启动redis服务

redis-server /etc/redis.conf

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

 

 

之后,查看redis配置文件

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

确保bind 127.0.0.1没有启用,如下图:

 

 

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

漏洞利用

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

第一种,利用redis写入shell

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

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

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

web服务器运行中

ubuntu中的web目录信息如下:

 

 

下面开始攻击。

通过redis-cli连接到ubuntu

 

 

如下图,写入成功:

 

 

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

 

 

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

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

 

 

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

 

 

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

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

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

 

 

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

 

 

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

第三种,

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

先启用nc监听端口:

 

 

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

 

 

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

 

 

解决方案

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