Windows Service Triggers: Enumeration and Abuse
Reading time: 7 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Windows Service Triggers permettent au Service Control Manager (SCM) de dĂ©marrer/arrĂȘter un service lorsqu'une condition se produit (par ex., une adresse IP devient disponible, une connexion Ă un named pipe est tentĂ©e, un Ă©vĂ©nement ETW est publiĂ©). MĂȘme si vous n'avez pas les droits SERVICE_START sur un service cible, vous pouvez parfois le dĂ©marrer en provoquant le dĂ©clenchement de son trigger.
Cette page se concentre sur l'énumération pratique orientée attaquant et les moyens peu contraignants d'activer des triggers courants.
Astuce : Démarrer un service intégré privilégié (par ex., RemoteRegistry, WebClient/WebDAV, EFS) peut exposer de nouveaux listeners RPC/named-pipe et débloquer d'autres chaßnes d'abus.
Enumerating Service Triggers
- sc.exe (local)
- Lister les triggers d'un service :
sc.exe qtriggerinfo <ServiceName> - Registry (local)
- Les triggers se trouvent sous :
HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>\TriggerInfo - Dump récursif :
reg query HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>\TriggerInfo /s - Win32 API (local)
- Appeler QueryServiceConfig2 avec SERVICE_CONFIG_TRIGGER_INFO (8) pour récupérer SERVICE_TRIGGER_INFO.
- Docs: QueryServiceConfig2[W/A] and SERVICE_TRIGGER/SERVICE_TRIGGER_SPECIFIC_DATA
- RPC over MSâSCMR (remote)
- Le SCM peut ĂȘtre interrogĂ© Ă distance pour rĂ©cupĂ©rer les infos de trigger en utilisant MSâSCMR. Titanis de TrustedSec expose ceci :
Scm.exe qtriggers. - Impacket dĂ©finit les structures dans msrpc MS-SCMR ; vous pouvez implĂ©menter une requĂȘte distante en utilisant celles-ci.
High-Value Trigger Types and How to Activate Them
Network Endpoint Triggers
Ceux-ci démarrent un service lorsqu'un client tente de parler à un endpoint IPC. Utile pour des utilisateurs à faibles privilÚges car le SCM démarrera automatiquement le service avant que votre client puisse réellement se connecter.
- Named pipe trigger
- Comportement : Une tentative de connexion client à \.\pipe<PipeName> provoque le démarrage du service par le SCM afin qu'il puisse commencer à écouter.
- Activation (PowerShell):
$pipe = new-object System.IO.Pipes.NamedPipeClientStream('.', 'PipeNameFromTrigger', [System.IO.Pipes.PipeDirection]::InOut)
try { $pipe.Connect(1000) } catch {}
$pipe.Dispose()
-
Voir aussi : Named Pipe Client Impersonation pour l'abus post-démarrage.
-
RPC endpoint trigger (Endpoint Mapper)
-
Comportement : Interroger l'Endpoint Mapper (EPM, TCP/135) pour un interface UUID associée à un service provoque le démarrage du service afin qu'il puisse enregistrer son endpoint.
-
Activation (Impacket):
# Queries local EPM; replace UUID with the service interface GUID
python3 rpcdump.py @127.0.0.1 -uuid <INTERFACE-UUID>
Custom (ETW) Triggers
Un service peut enregistrer un trigger lié à un provider/événement ETW. Si aucun filtre additionnel (keyword/level/binary/string) n'est configuré, n'importe quel événement provenant de ce provider démarrera le service.
- Exemple (WebClient/WebDAV) : provider {22B6D684-FA63-4578-87C9-EFFCBE6643C7}
- Lister le trigger :
sc.exe qtriggerinfo webclient - Vérifier que le provider est enregistré :
logman query providers | findstr /I 22b6d684-fa63-4578-87c9-effcbe6643c7 - Ămettre des Ă©vĂ©nements correspondants nĂ©cessite gĂ©nĂ©ralement du code qui logge vers ce provider ; s'il n'y a pas de filtres, n'importe quel Ă©vĂ©nement suffit.
Group Policy Triggers
Sous-types : Machine/User. Sur des hĂŽtes joint au domaine oĂč la policy correspondante existe, le trigger s'exĂ©cute au boot. gpupdate seul ne dĂ©clenchera rien sans modifications, mais :
- Activation :
gpupdate /force - Si le type de policy pertinent existe, cela provoque de maniÚre fiable le déclenchement et le démarrage du service.
IP Address Available
Se déclenche lorsque la premiÚre IP est obtenue (ou la derniÚre perdue). Souvent déclenché au démarrage.
- Activation : basculer la connectivité pour retrigger, par ex. :
netsh interface set interface name="Ethernet" admin=disabled
netsh interface set interface name="Ethernet" admin=enabled
Device Interface Arrival
DĂ©marre un service lorsqu'une interface d'appareil correspondante arrive. Si aucun data item n'est spĂ©cifiĂ©, n'importe quel pĂ©riphĂ©rique correspondant au GUID de sous-type du trigger le fera dĂ©clencher. ĂvaluĂ© au boot et lors du hotâplug.
- Activation : Attacher/insérer un périphérique (physique ou virtuel) qui correspond à la classe/ID matériel spécifiée par le sous-type du trigger.
Domain Join State
Malgré la formulation confuse de MSDN, ceci évalue l'état de jointure au domaine au boot :
- DOMAIN_JOIN_GUID â dĂ©marrer le service si la machine est jointe au domaine
- DOMAIN_LEAVE_GUID â dĂ©marrer le service seulement si elle N'EST PAS jointe au domaine
System State Change â WNF (undocumented)
Certains services utilisent des triggers basés sur WNF non documentés (SERVICE_TRIGGER_TYPE 0x7). L'activation nécessite la publication de l'état WNF pertinent ; les détails dépendent du nom de l'état. Contexte de recherche : internals de Windows Notification Facility.
Aggregate Service Triggers (undocumented)
Observés sur Windows 11 pour certains services (par ex., CDPSvc). La configuration agrégée est stockée dans :
- HKLM\SYSTEM\CurrentControlSet\Control\ServiceAggregatedEvents
La valeur Trigger dâun service est un GUID ; la sous-clĂ© avec ce GUID dĂ©finit l'Ă©vĂ©nement agrĂ©gĂ©. Le dĂ©clenchement de n'importe quel Ă©vĂ©nement constituant dĂ©marre le service.
Firewall Port Event (quirks and DoS risk)
Un trigger ciblĂ© sur un port/protocole spĂ©cifique a Ă©tĂ© observĂ© se dĂ©clencher sur n'importe quel changement de rĂšgle firewall (dĂ©sactivation/suppression/ajout), pas seulement sur le port spĂ©cifiĂ©. Pire, configurer un port sans protocole peut corrompre le dĂ©marrage de BFE Ă travers les reboots, entraĂźnant l'Ă©chec en cascade de nombreux services et cassant la gestion du firewall. Ă traiter avec une extrĂȘme prudence.
Practical Workflow
- ĂnumĂ©rez les triggers sur les services intĂ©ressants (RemoteRegistry, WebClient, EFS, âŠ) :
sc.exe qtriggerinfo <Service>reg query HKLM\SYSTEM\CurrentControlSet\Services\<Service>\TriggerInfo /s
- Si un Network Endpoint trigger existe :
- Named pipe â tenter une ouverture client vers \.\pipe<PipeName>
- RPC endpoint â effectuer une lookup Endpoint Mapper pour l'interface UUID
- Si un ETW trigger existe :
- Vérifiez le provider et les filtres avec
sc.exe qtriggerinfo; s'il n'y a pas de filtres, n'importe quel événement de ce provider démarrera le service
- Pour Group Policy/IP/Device/Domain triggers :
- Utilisez des leviers environnementaux :
gpupdate /force, basculer les NICs, hot-plug de périphériques, etc.
Related
- After starting a privileged service via a Named Pipe trigger, you may be able to impersonate it:
Named Pipe Client Impersonation
Quick command recap
- List triggers (local):
sc.exe qtriggerinfo <Service> - Registry view:
reg query HKLM\SYSTEM\CurrentControlSet\Services\<Service>\TriggerInfo /s - Win32 API:
QueryServiceConfig2(..., SERVICE_CONFIG_TRIGGER_INFO, ...) - RPC remote (Titanis):
Scm.exe qtriggers - ETW provider check (WebClient):
logman query providers | findstr /I 22b6d684-fa63-4578-87c9-effcbe6643c7
Detection and Hardening Notes
- Faire une baseline et auditer TriggerInfo sur les services. Examiner aussi HKLM\SYSTEM\CurrentControlSet\Control\ServiceAggregatedEvents pour les triggers agrégés.
- Surveiller les requĂȘtes EPM suspectes pour des UUID de services privilĂ©giĂ©s et les tentatives de connexion Ă des named-pipe prĂ©cĂ©dant des dĂ©marrages de services.
- Restreindre qui peut modifier les triggers de service ; considérer comme suspect toute défaillance inattendue de BFE aprÚs des changements de trigger.
References
- Thereâs More than One Way to Trigger a Windows Service (TrustedSec)
- QueryServiceConfig2 function (Win32 API)
- MS-SCMR: Service Control Manager Remote Protocol â QueryServiceConfig2
- TrustedSec Titanis (SCM trigger enumeration)
- Cobalt Strike BOF example â sc_qtriggerinfo
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
HackTricks