Has used vulnerable or signed drivers to modify security solutions on victim devices.1
Windows Service T1543.003
- Tactics
- Persistence, Privilege Escalation
- Platform
- Windows
- Version
- 1.6
- Created
- 17 January 2020
- Last modified
- 12 May 2026
- Contributors
- Matthew Demaske, Adaptforward; Pedro Harrison; Mayuresh Dani, Qualys; Wietze Beukema @Wietze; Akshat Pradhan, Qualys; Wirapong Petshagun
Adversaries may create or modify Windows services to repeatedly execute malicious payloads as part of persistence. When Windows boots up, it starts programs or applications called services that perform background system functions.[1] Windows service configuration information, including the file path to the service's executable or recovery programs/commands, is stored in the Windows Registry.
Windows Service MITRE reference T1543.003
26 groups have been recorded using this technique. Newest first; each entry carries MITRE’s procedure text and a link to the group’s full record. Click a name to filter the rules below.
Modified multiple services on victim machines to enable encryption operations.1 BlackByte has installed tools such as AnyDesk as a service on victim machines.2
Has deployed IPsec Helper malware post-exploitation and registered it as a service for persistence.1
Has created system services to establish persistence for deployed tooling.1
Created a service using the command sc create “SysUpdate” binpath= “cmd /c start “[file path]””&&sc config “SysUpdate” start= auto&&net
start SysUpdate for persistence.1
Created new Windows services for persistence that masqueraded as legitimate Windows services via name change.1
All 26 groups for this technique · 6 newest in this preview
5 campaigns have been recorded using this technique. Listed newest first; dates are year-granularity and attribution is MITRE’s.
During Operation Digital Eye, threat actors created a service named Visual Studio Code Service to run Visual Studio code.1
Used Windows Services with names such as Windows Defend for persistence of DUSTPAN.1
During Operation CuckooBees, the threat actors modified the IKEEXT and PrintNotify Windows services for persistence.1
During Operation Honeybee, threat actors installed DLLs and backdoors as Windows services.1
During the 2016 Ukraine Electric Power Attack, Sandworm Team used an arbitrary system service to load at system boot for persistence for Industroyer. They also replaced the ImagePath registry value of a Windows service with a new backdoor binary. 1
All 5 campaigns for this technique
109 software entries are documented implementing this technique. MITRE files each as a tool or as malware; newest first, then by how many groups carry them.
Has created persistence through the DLL variant of the MDeployer toolkit by creating a service called irnagentd that launches after the system is rebooted in Safe Mode.1
Has created a new PowerShell process using the CreateProcessA API.1
Has created a malicious service DISMsrv to maintain persistence.1
Has created a service to establish persistence.1
Has created a service to execute a payload.1
Has created a service named Microsoft Windows DeviceSync Service at HKLM\SYSTEM\CurrentControlSet\Services\DeviceSync\ to trigger execution when the system starts and to maintain persistence. 1
All 109 software entries for this technique · 6 newest in this preview
Offense vs defense T1543.003
Is defensive coverage keeping up with adversary use? Eight counts, each ranked against all 697 ATT&CK techniques. Attack sits left, defense right, so a shape leaning left means adversaries are better documented here than defenders are equipped. Hover any spoke for its percentile and the share of techniques that have more. The timeline below shows when each side arrived.
How it got here
Adversary activity (campaign spans) over cumulative rule output. Each source is plotted independently from zero, so neither line includes the other. Campaign dates are year-granularity.
Windows Service detection strategy DET0552
MITRE names one behaviour worth catching for this technique and breaks it into 1 analytic, one per platform. Each carries the log sources it needs and the fields you tune per environment.
Detection of Windows Service Creation or Modification
AN1527 · Windows
Detects creation or modification of Windows Services through command-line tools (e.g., sc.exe, powershell.exe), Registry key changes under HKLM\System\CurrentControlSet\Services, and service execution under SYSTEM with unsigned or anomalous binary paths. Detects privilege escalation via driver installation or CreateServiceW usage. Correlates parent-child lineage, startup behavior, and rare service names.
Log sources
The data this analytic draws on. You do not need every component — each one you already collect covers part of it. Each links to its ATT&CK record.
| Data component | Name | Channel |
|---|---|---|
| Process CreationDC0032 | WinEventLog:Sysmon | EventCode=1 |
| Service CreationDC0060 | WinEventLog:Security | EventCode=4697 |
| Windows Registry Key ModificationDC0063 | WinEventLog:Sysmon | EventCode=13, 14 |
| Driver LoadDC0079 | WinEventLog:Sysmon | EventCode=6 |
Tunable fields
MITRE calls these the analytic’s mutable elements: the thresholds and filters you set for your own environment.
| Field | What you tune |
|---|---|
| ServiceNamePattern | Regex for suspicious or uncommon service names (e.g., svhostx, winhelp, etc.) |
| ImagePathFilter | Flag services whose image path resides in uncommon directories (e.g., C:\Users\, C:\Temp\) |
| DriverExtensionList | Watch for .sys files loaded by sc, Registry, or ZwLoadDriver APIs |
| StartupTypeChangeWindow | Temporal window to correlate Registry Start key changes with service creation |
| UnsignedBinaryAlert | Raise alerts for unsigned binaries registered as services |
The Sysinternals tool Autoruns checks the registry and file system for known identify persistence mechanisms. It will output any tools identified, including built-in or added-on Microsoft functionality and third party software. Many of these locations are known by adversaries and used to obtain Persistence. Running Autoruns periodically in an environment makes it possible to collect and monitor its output for differences, which may include the removal or addition of persistent tools. Depending on the persistence mechanism and location, legitimate software may be more likely to make changes than an adversary tool. Thus, this analytic may result in significant noise in a highly dynamic environment. While Autoruns is a convenient method to scan for programs using persistence mechanisms its scanning nature does not conform well to streaming based analytics. This analytic could be replaced with one that draws from sensors that collect registry and file information if streaming analytics are desired.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-SICA | System Init Config Analysis |
Certain commands are frequently used by malicious actors and infrequently used by normal users. By looking for execution of these commands in short periods of time, we can not only see when a malicious user was on the system but also get an idea of what they were doing.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-PLA | Process Lineage Analysis |
Data model references
The CAR data model objects, actions and fields the logic reads. Map these to your own schema before implementing.
| Object | Action | Field |
|---|---|---|
| process | create | hostname |
| process | create | ppid |
| process | create | exe |
Implementations
Pseudocode is the canonical logic; the rest are CAR’s translations into vendor query languages.
processes = search Process:Create reg_processes = filter processes where (exe == "arp.exe" or exe == "at.exe" or exe == "attrib.exe" or exe == "cscript.exe" or exe == "dsquery.exe" or exe == "hostname.exe" or exe == "ipconfig.exe" or exe == "mimikatz.exe" or exe == "nbstat.exe" or exe == "net.exe" or exe == "netsh.exe" or exe == "nslookup.exe" or exe == "ping.exe" or exe == "quser.exe" or exe == "qwinsta.exe" or exe == "reg.exe" or exe == "runas.exe" or exe == "sc.exe" or exe == "schtasks.exe" or exe == "ssh.exe" or exe == "systeminfo.exe" or exe == "taskkill.exe" or exe == "telnet.exe" or exe == "tracert.exe" or exe == "wscript.exe" or exe == "xcopy.exe") reg_grouped = group reg by hostname, ppid where(max time between two events is 30 minutes) output reg_grouped
Sigma version of the above pseudocode, with some modifications.
DNIF version of the above pseudocode.
_fetch * from event where $LogName=WINDOWS-SYSMON AND $EventID=1 AND $App=regex(arp\.exe|at\.exe|attrib\.exe|cscript\.exe|dsquery\.exe|hostname\.exe|ipconfig\.exe|mimikatz.exe|nbstat\.exe|net\.exe|netsh\.exe|nslookup\.exe|ping\.exe|quser\.exe|qwinsta\.exe|reg\.exe|runas\.exe|sc\.exe|schtasks\.exe|ssh\.exe|systeminfo\.exe|taskkill\.exe|telnet\.exe|tracert\.exe|wscript\.exe|xcopy\.exe)i group count_unique $App limit 100 >>_agg count >>_checkif int_compare Count > 1 include
LogPoint version of the above pseudocode.
norm_id=WindowsSysmon event_id=1 image IN ["*\arp.exe", "*\at.exe", "*\attrib.exe", "*\cscript.exe", "*\dsquery.exe", "*\hostname.exe", "*\ipconfig.exe", "*\mimikatz.exe", "*\nbstat.exe", "*\net.exe", "*\netsh.exe", "*\nslookup.exe", "*\ping.exe", "*\quser.exe", "*\qwinsta.exe", "*\reg.exe", "*\runas.exe", "*\sc.exe", "*\schtasks.exe", "*\ssh.exe", "*\systeminfo.exe", "*\taskkill.exe", "*\telnet.exe", "*\tracert.exe", "*\wscript.exe", "*\xcopy.exe"] | chart count() as cnt by host | search cnt > 1
Unit tests
CAR’s own validation procedures for this analytic.
Within a command window, execute several of the commands in quick succession.
["ipconfig /all","hostname","systeminfo","reg.exe Query HKLM\\Software\\Microsoft"]
New executables that are started as a service are suspicious. This analytic looks for anomalous service executables.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-PLA | Process Lineage Analysis |
Data model references
The CAR data model objects, actions and fields the logic reads. Map these to your own schema before implementing.
| Object | Action | Field |
|---|---|---|
| process | create | parent_image_path |
Implementations
Pseudocode is the canonical logic; the rest are CAR’s translations into vendor query languages.
Create a baseline of services seen over the last 30 days and a list of services seen today. Remove services in the baseline from services seen today, leaving a list of new services.
processes = search Process:Create services = filter processes where (parent_image_path == "C:\Windows\System32\services.exe") historic_services = filter services (where timestamp < now - 1 day AND timestamp > now - 1 day) current_services = filter services (where timestamp >= now - 1 day) new_services = historic_services - current_services output new_services
Sigma/Windows Event Log rule with similar logic to the above pseudocode
LogPoint version of the above sigma rule.
norm_id=WinServer event_id=7045 | chart count() as cnt by file | search cnt < 5
Adversaries may modify the binary file for an existing service to achieve Persistence while potentially evading defenses. If a newly created or modified runs as a service, it may indicate APT activity. However, services are frequently installed by legitimate software. A well-tuned baseline is essential to differentiating between benign and malicious service modifications.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-SBV | Service Binary Verification |
Data model references
The CAR data model objects, actions and fields the logic reads. Map these to your own schema before implementing.
| Object | Action | Field |
|---|---|---|
| file | create | file_path |
| file | create | image_path |
| process | create | image_path |
| process | create | parent_exe |
Implementations
Pseudocode is the canonical logic; the rest are CAR’s translations into vendor query languages.
Look for events where a file was created and then later run as a service. In these cases, a new service has been created or the binary has been modified. Many programs, such as msiexec.exe, do these behaviors legitimately and can be used to help validate legitimate service creations/modifications.
legitimate_installers = ["C:\windows\system32\msiexec.exe", "C:\windows\syswow64\msiexec.exe", ...] file_change = search File:Create,Modify process = search Process:Create service_process = filter processes where (parent_exe == "services.exe") modified_service = join (search, filter) where ( file_change.time < service_process.time and file_change.file_path == service_process.image_path ) modified_service = filter modified_service where (modified_service.file_change.image_path not in legitimate_installers) output modified_service
There are several ways to cause code to execute on a remote host. One of the most common methods is via the Windows Service Control Manager (SCM), which allows authorized users to remotely create and modify services. Several tools, such as PsExec, use this functionality.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-RTA | RPC Traffic Analysis |
Data model references
The CAR data model objects, actions and fields the logic reads. Map these to your own schema before implementing.
| Object | Action | Field |
|---|---|---|
| flow | start | pid |
| process | create | parent_exe |
| process | create | pid |
Implementations
Pseudocode is the canonical logic; the rest are CAR’s translations into vendor query languages.
Look for processes launched from services.exe within 1 second of services.exe receiving a network connection.
process = search Process:Create flow = search Flow:Start service = filter process where (parent_exe == "services.exe") remote_start = join (flow, service ) where ( flow.hostname == service.hostname and flow.pid == service.pid and (flow.time < service.time < flow.time + 1 second) ) output remote_start
Windows runs the Service Control Manager (SCM) within the process services.exe. Windows launches services as independent processes or DLL loads within a svchost.exe group. To be a legitimate service, a process (or DLL) must have the appropriate service entry point SvcMain. If an application does not have the entry point, then it will timeout (default is 30 seconds) and the process will be killed.
D3FEND techniques
The defensive countermeasure this analytic implements, in MITRE’s D3FEND ontology.
| ID | Name |
|---|---|
| D3-PLA | Process Lineage Analysis |
Data model references
The CAR data model objects, actions and fields the logic reads. Map these to your own schema before implementing.
| Object | Action | Field |
|---|---|---|
| process | create | exe |
| process | create | parent_exe |
Implementations
Pseudocode is the canonical logic; the rest are CAR’s translations into vendor query languages.
Returns all processes named cmd.exe that have services.exe as a parent process. Because this should never happen, the /c flag is redundant in the search.
process = search Process:Create cmd = filter process where (exe == "cmd.exe" and parent_exe == "services.exe") output cmd
The Splunk version of the above pseudocode.
index=__your_sysmon_index__ EventCode=1 Image="C:\\Windows\\*\\cmd.exe" ParentImage="C:\\Windows\\*\\services.exe"
EQL version of the above pseudocode.
process where subtype.create and (process_name == "cmd.exe" and parent_process_name == "services.exe")
DNIF version of the above pseudocode.
_fetch * from event where $LogName=WINDOWS-SYSMON AND $EventID=1 AND $App=cmd.exe AND $ParentProcess=regex(.*services.exe.*)i limit 30
LogPoint version of the above pseudocode.
norm_id=WindowsSysmon event_id=1 image="C:\Windows\System32\cmd.exe" parent_image="C:\Windows\System32\services.exe"
Use auditing tools capable of detecting privilege and service abuse opportunities on systems within an enterprise and correct them.
On Windows 10, enable Attack Surface Reduction (ASR) rules to prevent an application from writing a signed vulnerable driver to the system. On Windows 10 and 11, enable Microsoft Vulnerable Driver Blocklist to assist in hardening against third party-developed service drivers.
Enforce registration and execution of only legitimately signed service drivers where possible.
Ensure that Driver Signature Enforcement is enabled to restrict unsigned drivers from being installed.
Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations.
| # | Test | Platform | Executor | Elevation | Prereqs | Cleanup | Ref | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01 | Modify Fax service to run PowerShell | windows | cmd | Required | — | Yes | ||||||||||||||||||||||||||
This test will temporarily modify the service Fax by changing the binPath to PowerShell
and will then revert the binPath change, restoring Fax to its original state.
Upon successful execution, cmd will modify the binpath for Input arguments
Attack command sc config #{service_name} binPath= "C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -noexit -c \"write-host 'T1543.003 Test'\""
sc start #{service_name}
Cleanup command sc config #{service_name} binPath= "#{service_binpath}" >nul 2>&1
GUID1fd55677-66fb-42fc-86e7-26baaf2f593c | ||||||||||||||||||||||||||||||||
| 02 | Service Installation CMD | windows | cmd | Required | 1 | Yes | ||||||||||||||||||||||||||
Download an executable from github and start it as a service.
Upon successful execution, powershell will download Input arguments
Attack command sc.exe create #{service_name} binPath= "#{binary_path}" start=#{startup_type} type=#{service_type}
sc.exe start #{service_name}
Cleanup command sc.exe stop #{service_name} >nul 2>&1
sc.exe delete #{service_name} >nul 2>&1
Prerequisite Service binary must exist on disk at specified location (#{binary_path}) Check if (Test-Path "#{binary_path}") {exit 0} else {exit 1}
Satisfy New-Item -Type Directory (split-path "#{binary_path}") -ErrorAction ignore | Out-Null
Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1543.003/bin/AtomicService.exe" -OutFile "#{binary_path}"
GUID1672da9b-0e77-44ca-894c-bac35b7307c6 | ||||||||||||||||||||||||||||||||
| 03 | Service Installation PowerShell | windows | PowerShell | Required | 1 | Yes | ||||||||||||||||||||||||||
Installs A Local Service via PowerShell.
Upon successful execution, powershell will download Input arguments
Attack command New-Service -Name "#{service_name}" -BinaryPathName "#{binary_path}"
Start-Service -Name "#{service_name}"
Cleanup command Stop-Service -Name "#{service_name}" 2>&1 | Out-Null
try {(Get-WmiObject Win32_Service -filter "name='#{service_name}'").Delete()}
catch {}
Prerequisite Service binary must exist on disk at specified location (#{binary_path}) Check if (Test-Path "#{binary_path}") {exit 0} else {exit 1}
Satisfy New-Item -Type Directory (split-path "#{binary_path}") -ErrorAction ignore | Out-Null
Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1543.003/bin/AtomicService.exe" -OutFile "#{binary_path}"
GUID203ae094-ef9c-4efb-9d10-2a99a1a6d4c9 | ||||||||||||||||||||||||||||||||
| 04 | TinyTurla backdoor service w64time | windows | cmd | Required | — | Yes | ||||||||||||||||||||||||||
It's running Dll as service to emulate the TinyTurla backdoor Related Talos Blog Input arguments
Attack command copy "#{dllfilename}" %systemroot%\system32\
sc create W64Time binPath= "c:\Windows\System32\svchost.exe -k TimeService" type= share start=auto
sc config W64Time DisplayName= "Windows 64 Time"
sc description W64Time "Maintain date and time synch on all clients and services in the network"
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost" /v TimeService /t REG_MULTI_SZ /d "W64Time" /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W64Time\Parameters" /v ServiceDll /t REG_EXPAND_SZ /d "%systemroot%\system32\w64time.dll" /f
sc start W64TimeCleanup command sc stop W64Time sc.exe delete W64Time del %systemroot%\system32\w64time.dll reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost" /v TimeService /f reg delete "HKLM\SYSTEM\CurrentControlSet\Services\W64Time\Parameters" /v ServiceDll /f GUID813ba171-35ab-4e38-b80b-0b02abb3fb48 | ||||||||||||||||||||||||||||||||
| 05 | Remote Service Installation CMD | windows | cmd | Required | 1 | Yes | ||||||||||||||||||||||||||
Download an executable from github and start it as a service on a remote endpoint
Upon successful execution, powershell will download Input arguments
Attack command sc.exe \\#{remote_host} create #{service_name} binPath= "#{binary_path}" start=#{startup_type} type=#{service_type}
sc.exe \\#{remote_host} start #{service_name}
Cleanup command sc.exe \\#{remote_host} stop #{service_name} >nul 2>&1
sc.exe \\#{remote_host} delete #{service_name} >nul 2>&1
Prerequisite Service binary must exist on disk at specified location (#{binary_path}) Check if (Test-Path "#{binary_path}") {exit 0} else {exit 1}
Satisfy New-Item -Type Directory (split-path "#{binary_path}") -ErrorAction ignore | Out-Null
Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1543.003/bin/AtomicService.exe" -OutFile "#{binary_path}"
GUIDba1e99f4-acb2-4cdd-8541-a41bfa3b171a | ||||||||||||||||||||||||||||||||
| 06 | Modify Service to Run Arbitrary Binary (Powershell) | windows | PowerShell | Required | — | Yes | ||||||||||||||||||||||||||
This test will use PowerShell to temporarily modify a service to run an arbitrary executable by changing its binary path and will then revert the binary path change, restoring the service to its original state. This technique was previously observed through SnapMC's use of Powerspolit's invoke-serviceabuse function. Reference Input arguments
Attack command Stop-Service -Name "#{service_name}" -force -erroraction silentlycontinue | Out-Null
set-servicebinarypath -name "#{service_name}" -path "#{new_bin_path}"
start-service -Name "#{service_name}" -erroraction silentlycontinue | out-nullCleanup command Stop-Service -Name "#{service_name}" -force -erroraction silentlycontinue | Out-Null
set-servicebinarypath -name "#{service_name}" -path "#{original_bin_path}" -erroraction silentlycontinue | out-nullGUID23ccdd8f-e7e6-4b24-b04b-c2dd1004f2c0 | ||||||||||||||||||||||||||||||||
Tests from Atomic Red Team (MIT licence) · technique definition