Windows服务触发机制深度解析

本文深入探讨Windows服务触发器的各种类型及其激活方式,包括设备接口到达、域加入、防火墙端口事件、组策略等触发器机制,并提供了低权限用户如何利用这些机制启动服务的实用技术方法。

有多种方式可以触发Windows服务

Windows上有几个组件和技术容易被忽视。我认为服务触发器就是其中之一。在过去的几年里,我多次观察到人们发现服务触发器的情况。为此,我认为写一篇关于不同类型服务触发器及其激活方式的简短博客可能会有所帮助,这些方法几乎不需要编写代码。

服务触发器是Windows服务的一个配置选项,允许该服务在其他活动或条件满足时启动。其中一些条件基本上是静态的,例如计算机加入域或分配了IP地址。其他条件则更具动态性,例如接收到给定命名管道的连接请求或处理特定的跟踪消息。

服务触发器的有趣之处在于,其中几个触发器允许低权限用户启动他们可能没有权限启动的服务。在考虑内置组件时,远程注册表、WebClient和加密文件系统(EFS)都是渗透测试人员可能有兴趣启动但可能没有适当权限的服务。

1 列出服务触发器

有多种工具可以设置和列出Windows服务触发器。现在让我们来看看这些选项。

1.1 原生实用程序

预安装的实用程序sc.exe用于与服务控制管理器(SCM)交互。它已经存在很长时间了,许多通过命令行调用操作服务的应用程序都利用它。

它可以通过使用子命令qtriggerinfo显示给定服务的触发器。

图1 - qc qtriggerinfo输出

与Windows上的许多配置设置一样,服务触发器存储在注册表中。我们可以使用reg query递归查询服务子键TriggerInfo的这些值。

图2 - EFS服务触发器的注册表列表

1.2 Win32 API

服务配置(包括触发器信息)通过Win32 API公开。要使用Windows API检索服务触发器,开发人员需要调用QueryServiceConfig2。在此调用中,应将SERVICE_CONFIG_TRIGGER_INFO(8)作为第二个参数传递。可以在我们的Beacon Object File(BOF)仓库中找到示例。

图3 - sc_qtriggerinfo BOF

这个输出不是最好的,与sc.exe相比,主要是因为数据元素缺失,并且未记录的Type 0x7没有命名。如果任何读者有兴趣为我们的仓库做出贡献并添加缺失的信息,我很乐意审查并接受这样的拉取请求!

1.3 MS-SCMR

可以远程与SCM交互。在底层,这很大程度上是Windows API所做的,只是以更开发者友好的方式。对于服务触发器,[MS-SCMR 3.1.4.48]概述了用于列出的原始RPC消息。

目前,Impacket已经定义了支持结构,但没有使用它们的示例。

TrustedSec还发布了自己的用于启动远程RPC通信的框架,名为Titanis。Scm.exe qtriggers的示例输出如下。

图4 Titanis服务触发器列表

2 服务触发器的类型

在我们讨论如何滥用给定的服务触发器之前,我们需要了解首先存在哪些触发器。下面我们回顾截至本文撰写时存在的每种现有服务触发器类型。我们讨论的大多数触发器都在此处有文档记录。

2.1 设备接口到达

这种类型的触发器在连接匹配类硬件ID的新设备时启动服务。定义此类型触发器时不需要指定数据项。如果未提供数据项,则当任何匹配pTriggerSubtype中提供的类的设备连接时,触发器将触发。匹配指定类型的设备在启动时检查,并在那时触发触发器。如果计算机启动后连接了匹配给定类型和硬件ID的设备,触发器也会触发。

2.2 域加入

这个服务触发器的记录方式相当令人困惑。Microsoft Developer Network(MSDN)声明事件在计算机(离开||加入)域时触发。这可能正确也可能不正确,但很可能不是此触发器的预期用例。它根据计算机是否加入域来触发启动。将DOMAIN_JOIN_GUID设置为子类型将在计算机加入域时在启动时触发服务启动。DOMAIN_LEAVE_GUID仅在计算机未加入域时在启动时触发服务启动。

2.3 防火墙端口事件

据我确定,这个触发器不像宣传的那样工作。

如果我向服务添加端口9999/tcp的服务触发器,当对Windows防火墙进行ANY更改时,该服务就会启动。这可能是禁用现有防火墙规则、删除防火墙规则、添加新防火墙规则等。我创建的规则可以是TCP/UDP,并且可以引用任何端口,而不仅仅是为过滤逻辑指定的端口。

此外,也许更有趣的是,如果规则配置错误,提供了端口而没有提供协议,它将阻止Windows防火墙在后续启动时正常工作。这似乎是由于基础过滤引擎(BFE)服务在遇到此无效数据时无法启动。这导致每个依赖BFE的服务也无法启动。

图5 - 一些依赖BFE的服务

在这种状态下,所有端口将保持对入站连接的过滤,并且防火墙本身无法配置。尝试通过"设置"菜单重新启用防火墙时出现以下错误。

图6 - 重新启用防火墙时出错

此错误于2025年9月4日报告给Microsoft,他们认为这不是安全漏洞。

2.4 组策略

当命名子类型(计算机或用户)组策略更新时,此服务触发器运行。此服务触发器在未加入域的计算机上启动时不运行。如果配置了相应的计算机或用户组策略,则服务触发器将在加入域的计算机上启动时运行。如果不存在更改,则在运行gpupdate时不会触发。如果存在给定类型的策略,则无论是否有更改,它都将使用gpupdate /force运行。

2.5 IP地址可用

此触发器类型完全按照其说法执行。当网络适配器获取第一个IP地址或失去最后一个IP地址时,它将启动其触发器。这意味着在大多数正常环境中,服务将在启动时触发。似乎没有有意义的方法将触发器与特定接口链接。

2.6 网络端点

这是我认为大多数人最感兴趣的触发器类型。它分为两类:命名管道和RPC端点。对于命名管道,当应用程序尝试连接到给定命名管道时,给定服务启动。值得注意的是,服务不需要在该管道上监听。对于RPC端点,当端点映射器被询问指定UUID的位置时,给定服务启动。这使服务有机会启动,并向端点映射器注册,客户端应用程序能够连接到它,而无需已经运行服务。

2.7 系统状态更改 - WNF

这个提供程序测试起来有点棘手,因为它没有正式文档记录。它与使用Windows通知设施(WNF)发布的消息相关。我对这个触发器进行了一些随意的实验,但不足以让我想对它的工作方式做出声明性陈述。我主要想指出它的存在。如果你想了解更多关于WNF的信息,Unknown Known DLLs是我迄今为止找到的最全面的评论之一。

2.8 自定义 - ETW

Windows事件跟踪(ETW)是Windows的一个组件,提供了一个框架,用于注册、引发和使用来自各种提供程序的事件。应用程序可以注册为ETW消息的提供程序,并在启用时作为该提供程序生成事件。其他应用程序可以尝试注册跟踪会话并启用先前注册的提供程序。然后他们能够查看正在生成的消息。

WebClient是使用ETW消息启动的流行服务。让我们找到那个特定的触发器。首先,我们可以使用sc.exe qtriggerinfo webclient列出它:

图7 - sc.exe qtriggerinfo webclient输出

这告诉我们提供程序ID,它将引发此消息。要查看此提供程序当前是否已注册/可发现,我们可以运行诸如logman query providers | findstr /I 22b6d684-fa63-4578-87c9-effcbe6643c7的命令。

此命令将输出: Microsoft-Windows-WebdavClient-LookupServiceTrigger {22B6D684-FA63-4578-87C9-EFFCBE6643C7}

这似乎是我们正在查看的触发器的合适提供程序名称。

如果对此消息进行了任何额外的过滤,我们将在sc.exe qtriggerinfo输出中观察到它。在这种情况下,此提供程序引发的任何消息都应启动相关接口。二进制、字符串、关键字和级别过滤都对ETW触发器可行,并控制匹配的提供程序引发消息需要包含什么内容才能启动服务。

2.9 聚合服务触发器

还有另一种未记录的服务触发器类型名为Aggregate。Windows 11上使用此触发器类型的示例服务是CDPSvc。使用sc.exe qtriggerinfo列出它会得到相当令人困惑的结果,大概是因为sc.exe没有编码处理此触发器类型。

图8 - sc.exe qtriggerinfo CDPSvc输出

此类型的触发器引用GUID:

图9 - 通过注册表视图查看CDPSvc触发器

如果正确注册,此GUID应在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceAggregatedEvents下有相应条目:

图10 - ServiceAggregatedEvents子键

Trigger值的数据等于GUID。发现此GUID是一个子键,并具有以下值:

图11 - 进一步相关的注册表子键

搜索(默认)值在以下位置产生一些结果:

  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\NetworkServiceTriggers\Triggers\bc90d167-9470-4139-a9ba-be0bbbf5b74d\D09BDEB5-6171-4A34-BFE2-06FA82652568:fdd099c6-df06-4904-83b4-a87a27903c70
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Brokers\{fdd099c6-df06-4904-83b4-a87a27903c70}
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Brokers\{fdd099c6-df06-4904-83b4-a87a27903c70}

我不完全理解这个触发器如何工作,这可能是一个未来研究的领域。

3 激活服务触发器

在本节中,我们将讨论如何激活每个服务触发器,不包括WNF和Aggregate。

3.1 设备接口到达

我无法找到在不插入USB驱动器等设备的情况下触发此类型接口的方法。最多,我可以看到设置一个你期望始终连接的子类型(例如GUID_DEVINTERFACE_KEYBOARD - Windows drivers | Microsoft Learn)。在这一点上,你将有一个看起来按需启动的服务,但基本上总是会启动。

3.2 域加入

与上面类似,我会看到这用于自动启动服务而不更改其启动类型。在加入域的盒子上植入服务或想更改现有服务以始终启动?添加此触发器类型。

3.3 防火墙端口事件

鉴于发现此规则的过滤无法正常工作,它可以像上面一样使用。当Windows启动并应用防火墙配置时,此规则似乎会触发,导致在启动时自动启动服务的另一种方式。

3.4 组策略

这种特定方法对于在系统启动时自动启动没有用处。对于安全测试,我想不出安装使用此触发器类型的服务的逻辑原因。如果你碰巧遇到一个你想启动的使用此触发器类型的服务,你可以通过执行gpupdate /force作为低权限用户触发它。

3.5 IP地址可用

如果你有一个仅在活动IP地址可用时运行的植入程序,我可以看到使用此触发器类型。需要注意的是,此触发器查找的是IP地址,而不是互联网。完全可能配置此触发器,而显示为可用IP地址的是未连接互联网的网络。

3.6 网络端点

这些触发器对我们作为渗透测试人员非常有趣,主要是因为它们应该允许我们远程启动服务,并且可能作为低权限用户。

命名管道触发器在程序尝试与该管道通信时启动。我们可以从简单的cmd.exe会话执行此触发。首先,确保相关服务未禁用。触发器在禁用的服务上不起作用。可以使用诸如以下的命令检查:

图12 - sc.exe qc remoteregistry输出

在上面的实例中,我们看到START_TYPE设置为4(DISABLED),所以通常这不会工作。我已将其更改为3(DEMAND)以继续此示例。

我们需要知道我们正在命中什么端点,我们可以从sc.exe qtriggerinfo中找到。在这种情况下,我们看到它是winreg的命名管道事件。

图13 - sc.exe qtriggerinfo remoteregistry输出

最后,我们可以使用基本的PowerShell ls别名触发此服务启动。

图14 - 通过命名管道启动remoteregistry

RPC端点类似,但触发起来有点困难。让我们以ClipSVC为例。

图15 - 审查ClipSVC状态

此服务当前已停止,按需启动,并且应在端点映射器被询问接口64D1D045-F675-460B-8A94-570246B36DAB时启动。我们可以尝试使用rpcping启动此服务。

图16 - 通过rpcping启动ClipSVC

我想指出,对于上面的两个示例,连接本身不需要有意义地完成。正是尝试启动到给定命名管道的连接或询问端点映射器给定接口在哪里的行为导致这些服务启动。

3.7 自定义 - ETW

本地触发具有ETW触发器的服务不应该引起太多麻烦。让我们看一个不在其他每个示例中的服务,edgeupdate。要触发此服务,我们需要编写一些代码。我们可以一路回溯到2015年,查看Tyranid’s Lair: Starting WebClient Service Programmatically以获取基本代码大纲。将GUID换为有问题的GUID(5ef81e80-ca64-475b-b469-485dbc993fe2)然后BOOM!…edgeupdate服务启动。请注意,如果你尝试这个,它会立即停止,所以之后的查询可能会显示服务已停止。如果你想知道事件完整程序流程的更多信息,Will WebClient Start - SpecterOps提供了消息如何路由以及基于此触发器启动服务的消费者可能失败点的良好概述。

4 结语

我们回顾了Windows服务触发器以及如何使用低/无代码解决方案激活这些触发器。希望你们中的一些测试人员觉得这很有信息量,并可能将其用作未来研究的起点。直到下次,祝黑客愉快,触发顺利!

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