DLL劫持与Windows辅助功能的黑客攻击技术

本文深入探讨了利用Windows Narrator等辅助功能程序进行DLL劫持的技术细节,详细介绍了攻击者如何借此实现用户级和系统级的持久化驻留,以及如何利用远程桌面协议(RDP)设置进行横向移动。

Hack-cessibility: 当DLL劫持遇到Windows辅助功能

为准备在MCTTP上的一场关于从VX-underground挖掘TTPs的演讲,Jason Lang和我阅读了大量不同的报告,并基于从中获得的想法进行了研究。

对我来说,研究的起点源于阅读各种论文中描述的持久化技术。一个引起我注意的技术是提到Narrator.exe在执行时会加载MSTTSLocEnUS.dll。鉴于过去对Narrator有过很多研究,我决定更仔细地看看这个技术是否仍然有效。本文展示的技术需要对目标系统拥有本地管理员权限。

我找到了关于这项技术的最早记录可以追溯到2013年,来自大神@Hexacorn。我当时想,这肯定是已经被修复了,毕竟过去这么久了。好吧,让我们一起来探索这个“兔子洞”。

首先,我需要验证这种情况是否仍然存在。我在运行Narrator的同时运行了进程监视器,发现了一些有趣的事情。

它似乎仍在寻找一个变体的dll,但是路径不同?这很奇怪。路径不再是旧的%windir%\system32\speech\engine\tts\msttslocenus.dll,而是变成了%windir%\system32\speech_onecore\engines\tts\msttsloc_onecoreenus.dll。这当然让我好奇,我是否可以创建一个dll,放在那里,并让它被执行。事实证明,这完全可以。

有趣的是,你甚至不需要创建一个带有导出函数的dll。它只是执行dll中attach语句里的任何内容。

唯一的问题是,当dll被执行时,Narrator会继续运行,所以你点击任何地方都会听到语音播报,这在攻击场景中并不实用。经过一番思考,我发现可以在dll内部编写代码来识别主线程并简单地将其挂起,同时继续执行我的dll代码所在的线程。经过一些尝试,我最终创建了下面这段完美的代码。

现在的流程是这样的:放置dll,启动Narrator.exe,然后dll冻结主程序,使其不会开始使用语音或高亮你点击的区域,并执行植入dll中的代码。

在研究Narrator和其他辅助功能的过程中,我的大脑在睡觉时提醒了我一件事……

作为用户的持久化

事实证明,你可以在HKCU\Software\Microsoft\Windows NOT\CurrentVersion\Accessibility下创建一个名为configurationREG_SZ值,并将你想要启动的辅助功能选项设置为该值。下面的截图展示了如何设置Narrator和CursorIndicator在登录时自动启动。

为了建立持久化,你可以植入恶意的msttsloc_onecoreenus.dll,然后将configuration设置为Narrator,这样就设置完成了。在我实验室中的一次注销和登录确认了这一点,如下面的视频片段所示。

作为SYSTEM的持久化

另一件很酷的事情是,如果你想要以SYSTEM身份建立持久化,你也可以做到。你只需要在HKLM配置单元下设置上面描述的相同值,而不是HKCU。示例如下图所示。

在这里设置Narrator将确保Narrator在登录屏幕出现时启动,并以SYSTEM身份执行。

横向移动

为了让这个技术更有用,你还可以在某些场景中远程触发它,并将其用于横向移动。然而,这需要你拥有使用regedit远程更改RDP设置的权限。像之前一样,传输恶意的msttsloc_onecoreenus.dll,但这次不是设置configuration值来自动启动Narrator,而是要导航到HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp,将SecurityLayer更改为0。

为了触发执行,你只需RDP到目标主机,当看到登录页面时,按下CTRL+WIN+ENTER来触发Narrator的启动,从而执行你的代码。代码会在你关闭RDP时停止,所以你的代码需要迁移到另一个进程或类似的地方,这部分练习我将留给你自己完成。

自带辅助功能

我发现的另一个有趣的事情是,你可以简单地创建自己的辅助功能选项(在注册表中它们被称为ATs),并将其配置在本文前面提到的configuration设置中运行。怎么做呢?在我的实验室中,我简单导出了CursorIndicator并在记事本中打开,调整了名称和描述。保存后,我将其导入注册表。

导入后,我导航到新的ATs,并更改二进制路径,如下面的截图所示。

接下来,你需要将想要执行的有效载荷放在c:\temp\crutch.exe这个位置。如果你要远程操作,你将需要使用网络注册表连接来添加这些键值,或者使用Impacket的reg.py等类似工具手动添加。

创建好自己的ATs后,你可以直接将名称添加到configuration中,无论是在HKLM还是HKCU下,它都将在下次启动/登录时运行。为了增加趣味性,你还可以指定一个UNC路径而不是本地文件系统路径,这意味着你可以将文件托管在网络共享上。

尾声

在撰写这篇博客文章并进行一些额外的谷歌搜索时,我最终找到了Adam(aka @Hexacorn)关于其中一些持久化技术的博客文章。

他还提到了一种启动ATs的非常酷的方法,即运行ATBroker.exe /start 。所以,在我们引入自己的示例中,命令将是ATBroker.exe /start Crutch

截至本文发布时,这些技术已在最新版本的Windows 10和11上进行了测试。

希望你觉得这篇文章有趣并学到了一些新东西。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计