文章总结: 文章详细介绍了利用Windows辅助功能(Narrator.exe)实现持久化与横向移动的技术。通过在特定路径放置恶意DLL文件(msttsloc_onecoreenus.dll)并修改注册表配置,攻击者可实现用户级或系统级的持久化。该技术还可用于横向移动,通过RDP连接并触发辅助功能执行恶意代码。文章还提供了创建自定义辅助功能选项的方法,增强攻击隐蔽性。
综合评分: 91
文章分类: 红队,内网渗透,渗透测试,漏洞分析
利用 Windows 辅助功能实现持久化与横向移动
aeverj
红队工坊
2025年11月25日 08:00
北京
翻译自 Hack-cessibility: When DLL Hijacks Meet Windows Helpers
在为 MCTTP 准备一场关于从 [VX-underground]https://vx-underground.org/ 挖掘 TTP(战术、技术和程序,Tactics, Techniques, and Procedures)的演讲时,我和 Jason Lang都从阅读各种报告中获得了灵感,并基于这些想法展开了研究。对我来说,这一切始于阅读各类论文中描述的各种持久化技术。其中一个引起我注意的技术是:Narrator.exe(讲述人程序)在执行时会加载 MSTTSLocEnUS.dll 文件。由于我过去经常研究讲述人功能,我决定深入看看这个技术现在是否还有效。需要注意的是,本文展示的技术需要在你操作的系统上拥有本地管理员权限。
我找到了关于这个技术的最早引用,来自大神 @Hexacorn,可以追溯到 2013 年(哇)。我当时想,这么久远的技术,现在肯定已经被修复了吧?那么,让我们一起探索这个兔子洞吧。
验证漏洞是否依然存在
首先,我需要验证这个问题是否仍然存在。于是我在运行进程监视器(procmon)的同时启动了讲述人。结果发现了一些有趣的东西。
它仍然在寻找一个 dll 文件的变体,只不过路径不同了?这很奇怪。它不再寻找旧路径 %windir%\system32\speech\engine\tts\msttslocenus.dll,而是改为寻找 %windir%\system32\speech_onecore\engines\tts\msttsloc_onecoreenus.dll。当然,这让我好奇:我能不能创建一个 dll 文件,放在那里,然后让它被执行呢?结果证明,这完全可行。有趣的是,你甚至不需要创建一个带有导出函数的 dll。它会直接执行你在 dll 的 attach 语句中编写的任何代码。
唯一的问题是,当 dll 被执行时,讲述人会继续运行,所以你会听到语音播报你点击的所有内容,这在攻击场景中并不实用。我决定好好思考一下,最后发现我可以在 dll 内部编写代码来识别主线程,然后暂停它,同时继续执行我的 dll 代码所在的线程。经过一番尝试和失败后,我最终[创建了这段代码]https://github.com/api0cradle/Narrator-dll,完美实现了我的设想。
现在的流程是这样的:你植入 dll 文件并启动 Narrator.exe,然后 dll 会冻结主程序,使其不会开始语音播报或高亮显示你点击的区域,同时执行植入的 dll 中的代码。由于我过去研究过讲述人和其他辅助功能,在我睡觉时,大脑突然提醒了我一件事……
以用户身份实现持久化
原来,你可以在 HKCU\Software\Microsoft\Windows NOT\CurrentVersion\Accessibility 下创建一个名为 configuration 的 reg_sz 注册表项,并将你想要启动的辅助功能选项设置为其值。下面的截图展示了如何在登录时自动启动_讲述人_和_光标指示器_。
为了建立持久化,你可以植入恶意的 msttsloc_onecoreenus.dll 文件,然后将 configuration 设置为 Narrator,就大功告成了。我在实验室中通过注销和登录验证了这一点,如下面的视频片段所示。
以系统身份实现持久化
另一个很酷的功能是,如果你想以 SYSTEM 身份建立持久化,也完全可以做到。你只需要在 HKLM 注册表配置单元下设置与上述相同的值,而不是在 HKCU 下。示例如下截图所示。
在这里设置讲述人将确保讲述人在登录屏幕出现时启动,并以 SYSTEM 身份执行。
横向移动
为了让这个技术更强大,在某些场景下你还可以远程触发它,将其用于横向移动。不过,这需要你拥有使用注册表编辑器远程更改 RDP 设置的权限。和之前一样,你先传输恶意的 msttsloc_onecoreenus.dll 文件,但不是在 configuration 值中设置讲述人使其自动启动,而是导航到 HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp,并将 SecurityLayer 更改为 0。
要触发执行,你只需通过 RDP 连接到目标主机,然后在看到登录页面时按下 CTRL+WIN+ENTER 来触发讲述人的启动,从而执行你的代码。代码会在你关闭 RDP 时立即停止,所以你的代码需要迁移到另一个进程或采取类似措施,这个练习就留给你自己完成了。
自带辅助功能
我发现的另一个有趣的事情是,你可以简单地创建自己的辅助功能选项(在注册表中称为 ATs),并将其配置为在本文前面提到的 configuration 设置中运行。怎么做呢?在我的实验室中,我只是导出了 CursorIndicator,然后在记事本中打开它来调整名称和描述。保存后,我将其导入到注册表中。
导入后,我导航到新的 ATs 并更改了二进制文件路径,如下截图所示。
接下来,你需要将想要执行的载荷放在 c:\temp\crutch.exe 位置。如果你要远程执行此操作,需要使用连接到网络注册表并添加键/值,或者使用 Impacket 的 reg.py 等工具手动添加它们。创建自己的 ATs 后,你可以直接在 HKLM 或 HKCU 的 configuration 中添加名称,它将在下次启动/登录时运行。为了增加趣味性,你还可以指定 UNC 路径而不是本地文件系统,这意味着如果你愿意,可以将文件托管在网络共享上。
结语
在撰写这篇博客文章并进行一些额外的 Google 搜索时,我最终找到了 [Adam(又名 @Hexacorn)的一篇博客文章]https://www.hexacorn.com/blog/2016/07/22/beyond-good-ol-run-key-part-42/,其中涉及了一些关于持久化的相同研究。
他还提到了一种启动 ATs 的很酷的方法,即运行 ATBroker.exe /start。所以,在我们引入自己的 ATs 的例子中,命令就是 ATBroker.exe /start Crutch。这些技术已在本博客文章发布时的最新版本 Windows 10 和 11 上进行了测试。
希望你觉得这篇文章有趣,并学到了一些新东西。
如果你对网络安全、红队攻防技术充满热情,渴望学习更多实战技巧,例如渗透测试、自动化脚本编写、免杀技术等, 欢迎关注我的公众号
在这里,我会持续分享更多高质量的技术文章,与你一同探索网络安全的奥秘,提升实战技能! 让我们一起在队攻防的道路上,不断精进,突破边界!
免责声明: 本文仅供安全技术研究与学习交流之用。 严禁将本文所提及的技术用于任何非法用途,包括但不限于未经授权的渗透测试、网络攻击、恶意代码传播等。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队工坊 aeverj《利用 Windows 辅助功能实现持久化与横向移动》