Multiple Remote Management Tool Vendors on Same Host

Identifies a Windows host where two or more distinct remote monitoring and management (RMM) or remote-access tool vendors are observed starting processes within the same eight-minute window. Legitimate MSP environments may run multiple tools, but this pattern can also indicate compromise, shadow IT, or attacker staging of redundant access. Processes are mapped to a single vendor label so multiple binaries from the same vendor do not inflate the count.

Elastic rule (View on GitHub)

  1[metadata]
  2creation_date = "2026/03/23"
  3integration = ["endpoint", "windows", "sentinel_one_cloud_funnel", "m365_defender", "system", "crowdstrike"]
  4maturity = "production"
  5updated_date = "2026/06/24"
  6
  7[rule]
  8author = ["Elastic"]
  9description = """
 10Identifies a Windows host where two or more distinct remote monitoring and management (RMM) or remote-access tool
 11vendors are observed starting processes within the same eight-minute window. Legitimate MSP environments may run
 12multiple tools, but this pattern can also indicate compromise, shadow IT, or attacker staging of redundant access.
 13Processes are mapped to a single vendor label so multiple binaries from the same vendor do not inflate the count.
 14"""
 15from = "now-9m"
 16interval = "8m"
 17language = "esql"
 18license = "Elastic License v2"
 19name = "Multiple Remote Management Tool Vendors on Same Host"
 20note = """## Triage and analysis
 21
 22### Investigating Multiple Remote Management Tool Vendors on Same Host
 23
 24This rule aggregates process start events by `host.id` and host name within the rule's nine-minute lookback window. Data can come from Elastic Defend, Sysmon, Winlogbeat, Windows Security / forwarded events, Microsoft Defender XDR, SentinelOne, or CrowdStrike FDR—where ECS process fields are populated. Each known RMM-related process name maps to one **vendor** label (e.g. TeamViewer, AnyDesk, ScreenConnect). If **two or more different vendor labels** appear within the same lookback window, the rule signals.
 25
 26### Possible investigation steps
 27
 28- Open **Esql.vendors_seen** and **Esql.processes_executable_values** on the alert to see which tools fired in the window.
 29- Confirm whether the host is an MSP-managed jump box, helpdesk workstation, or lab where multiple RMM stacks are expected.
 30- For servers or standard user endpoints, treat as higher risk: review install source, code signatures, and recent logons.
 31- Correlate with other alerts (ingress tool transfer, suspicious scripting, new persistence) on the same `host.id`.
 32- Check asset inventory and change tickets for approved RMM software.
 33
 34### False positive analysis
 35
 36- **MSP / IT tooling**: A technician machine with two approved agents (e.g. RMM + remote support) may match. Tune with host or organizational unit exceptions, or raise the vendor threshold if your environment standardizes on a known pair.
 37- **Vendor rebrands or bundles**: Rare overlaps during migrations can briefly show two vendors; validate timeline and packages.
 38
 39### Response and remediation
 40
 41- If unauthorized or unexplained: isolate the host, inventory installed remote-access software, remove unapproved tools, and reset credentials that may have been exposed. Enforce a single approved RMM stack per asset class where possible.
 42"""
 43
 44setup = """## Setup
 45
 46This rule is designed for data generated by [Elastic Defend](https://www.elastic.co/security/endpoint-security), which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.
 47
 48Setup instructions: https://ela.st/install-elastic-defend
 49
 50### Additional data sources
 51
 52This rule also supports the following third-party data sources. For setup instructions, refer to the links below:
 53
 54- [CrowdStrike](https://ela.st/crowdstrike-integration)
 55- [Microsoft Defender XDR](https://ela.st/m365-defender)
 56- [SentinelOne Cloud Funnel](https://ela.st/sentinel-one-cloud-funnel)
 57- [Sysmon Event ID 1 - Process Creation](https://ela.st/sysmon-event-1-setup)
 58- [Windows Process Creation Logs](https://ela.st/audit-process-creation)
 59"""
 60
 61references = [
 62    "https://attack.mitre.org/techniques/T1219/",
 63    "https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-025a",
 64    "https://lolrmm.io/",
 65]
 66risk_score = 47
 67rule_id = "c3f8a1d2-4b5e-4c6f-9a8b-1e2d3f4a5b6c"
 68severity = "medium"
 69tags = [
 70    "Domain: Endpoint",
 71    "OS: Windows",
 72    "Use Case: Threat Detection",
 73    "Tactic: Command and Control",
 74    "Resources: Investigation Guide",
 75    "Data Source: Elastic Defend",
 76    "Data Source: Sysmon",
 77    "Data Source: SentinelOne",
 78    "Data Source: Microsoft Defender XDR",
 79    "Data Source: Crowdstrike",
 80    "Data Source: Windows Security Event Logs",
 81    "Data Source: Winlogbeat",
 82]
 83timestamp_override = "event.ingested"
 84type = "esql"
 85
 86query = '''
 87from logs-endpoint.events.process-*, logs-crowdstrike.fdr*, logs-m365_defender.event-*, logs-sentinel_one_cloud_funnel.*, logs-system.security*, logs-windows.sysmon_operational-*, logs-windows.forwarded*, winlogbeat-* metadata _id, _version, _index
 88| where (host.os.type == "windows" or host.os.family == "windows")
 89    and event.category == "process"
 90    and event.type == "start"
 91    and process.name is not null
 92| eval Esql.rmm_vendor = case(
 93    process.name.caseless like "aa_v*.exe", "AnyAssist",
 94    process.name.caseless == "acroniscyberprotectconnectagent.exe", "Acronis",
 95    process.name.caseless == "aeroadmin.exe", "AeroAdmin",
 96    process.name.caseless == "agentmon.exe", "ConnectWiseAutomate",
 97    process.name.caseless == "anydesk.exe", "AnyDesk",
 98    process.name.caseless == "apc_admin.exe", "APC",
 99    process.name.caseless == "apc_host.exe", "APC",
100    process.name.caseless == "ateraagent.exe", "Atera",
101    process.name.caseless like "aweray_remote*.exe", "AweSun",
102    process.name.caseless == "awesun.exe", "AweSun",
103    process.name.caseless == "b4-service.exe", "BeyondTrust",
104    process.name.caseless == "basupsrvc.exe", "BeyondTrust",
105    process.name.caseless == "bomgar-scc.exe", "BeyondTrust",
106    process.name.caseless == "remote support.exe", "BeyondTrust",
107    process.name.caseless == "cagservice.exe", "BarracudaRMM",
108    process.name.caseless == "cloudracmd.exe", "CloudRadial",
109    process.name.caseless == "cloudrasd.exe", "CloudRadial",
110    process.name.caseless == "cloudraservice.exe", "CloudRadial",
111    process.name.caseless like "connectwisecontrol*.exe", "ScreenConnect",
112    process.name.caseless == "domotzagent.exe", "Domotz",
113    process.name.caseless == "domotz-windows-x64-10.exe", "Domotz",
114    process.name.caseless == "dwagsvc.exe", "DWService",
115    process.name.caseless == "dwrcc.exe", "DWService",
116    process.name.caseless == "dwrcs.exe", "DWService",
117    process.name.caseless == "dwrcst.exe", "DWService",
118    process.name.caseless like "fleetdeck_commander*.exe", "FleetDeck",
119    process.name.caseless == "g2aservice.exe", "GoTo",
120    process.name.caseless == "getscreen.exe", "GetScreen",
121    process.name.caseless == "gotoassistservice.exe", "GoTo",
122    process.name.caseless == "gotohttp.exe", "GoTo",
123    process.name.caseless == "gotoresolveprocesschecker.exe", "GoTo",
124    process.name.caseless == "gotoresolveremotecontrol.exe", "GoTo",
125    process.name.caseless == "gotoresolveservice.exe", "GoTo",
126    process.name.caseless == "gotoresolveterminal.exe", "GoTo",
127    process.name.caseless == "gotoresolveunattended.exe", "GoTo",
128    process.name.caseless == "helpwire.exe", "HelpWire",
129    process.name.caseless == "immyagent.exe", "ImmyBot",
130    process.name.caseless == "immybot.agent.ephemeral.exe", "ImmyBot",
131    process.name.caseless == "immyupdater.exe", "ImmyBot",
132    process.name.caseless == "imperoclientsvc.exe", "Impero",
133    process.name.caseless == "imperoserversvc.exe", "Impero",
134    process.name.caseless == "isllight.exe", "ISLOnline",
135    process.name.caseless == "isllightclient.exe", "ISLOnline",
136    process.name.caseless == "jumpcloud-agent.exe", "JumpCloud",
137    process.name.caseless == "komari.exe", "Komari",
138    process.name.caseless == "komari-agent.exe", "Komari",
139    process.name.caseless == "level.exe", "Level",
140    process.name.caseless == "lmi_rescue.exe", "LogMeIn",
141    process.name.caseless == "lmi_rescue_srv.exe", "LogMeIn",
142    process.name.caseless == "lmiignition.exe", "LogMeIn",
143    process.name.caseless == "logmein.exe", "LogMeIn",
144    process.name.caseless == "ltsvc.exe", "ConnectWiseAutomate",
145    process.name.caseless == "ltsvcmon.exe", "ConnectWiseAutomate",
146    process.name.caseless == "lttray.exe", "ConnectWiseAutomate",
147    process.name.caseless == "lunixar.exe", "Lunixar",
148    process.name.caseless == "lunixarremote.exe", "Lunixar",
149    process.name.caseless == "lunixarupdater.exe", "Lunixar",
150    process.name.caseless == "lvagent.exe", "Level",
151    process.name.caseless == "manageengine_remote_access_plus.exe", "ManageEngine",
152    process.name.caseless == "meshagent.exe", "MeshCentral",
153    process.name.caseless == "mikogo-service.exe", "Mikogo",
154    process.name.caseless == "nezha-agent.exe", "Nezha",
155    process.name.caseless == "ninjarmmagent.exe", "NinjaOne",
156    process.name.caseless == "ninjarmmagentpatcher.exe", "NinjaOne",
157    process.name.caseless == "ninjarmm-cli.exe", "NinjaOne",
158    process.name.caseless == "parsec.exe", "Parsec",
159    process.name.caseless == "pservice.exe", "Pulseway",
160    process.name.caseless == "quickassist.exe", "QuickAssist",
161    process.name.caseless == "r_server.exe", "Radmin",
162    process.name.caseless == "radmin.exe", "Radmin",
163    process.name.caseless == "radmin3.exe", "Radmin",
164    process.name.caseless == "rcengmgru.exe", "Rsupport",
165    process.name.caseless == "rcclient.exe", "RPCSuite",
166    process.name.caseless == "rcmgrsvc.exe", "Rsupport",
167    process.name.caseless == "rcservice.exe", "RPCSuite",
168    process.name.caseless == "remotedesktopmanager.exe", "Devolutions",
169    process.name.caseless == "remotely_agent.exe", "Remotely",
170    process.name.caseless == "remotely_desktop.exe", "Remotely",
171    process.name.caseless == "remotepc.exe", "RemotePC",
172    process.name.caseless == "remotepcdesktop.exe", "RemotePC",
173    process.name.caseless == "remotepcservice.exe", "RemotePC",
174    process.name.caseless == "remoteview.exe", "Rsupport",
175    process.name.caseless == "rfusclient.exe", "RemoteUtilities",
176    process.name.caseless == "rmm.agent.exe", "SuperOps",
177    process.name.caseless == "romserver.exe", "RealVNC",
178    process.name.caseless == "romviewer.exe", "RealVNC",
179    process.name.caseless == "rpcsuite.exe", "RPCSuite",
180    process.name.caseless == "rserver3.exe", "Radmin",
181    process.name.caseless == "rustdesk.exe", "RustDesk",
182    process.name.caseless == "rutserv.exe", "RemoteUtilities",
183    process.name.caseless == "rutview.exe", "RemoteUtilities",
184    process.name.caseless == "rvagent.exe", "Rsupport",
185    process.name.caseless == "rvagtray.exe", "Rsupport",
186    process.name.caseless == "saazapsc.exe", "Kaseya",
187    process.name.caseless like "screenconnect*.exe", "ScreenConnect",
188    process.name.caseless == "session_win.exe", "ZohoAssist",
189    process.name.caseless == "simplegatewayservice.exe", "SimpleHelp",
190    process.name.caseless == "simplehelpcustomer.exe", "SimpleHelp",
191    process.name.caseless == "smpcview.exe", "Splashtop",
192    process.name.caseless == "spclink.exe", "Splashtop",
193    process.name.caseless == "splashtop-streamer.exe", "Splashtop",
194    process.name.caseless == "splashtopsos.exe", "Splashtop",
195    process.name.caseless == "spsrv.exe", "Splashtop",
196    process.name.caseless == "sragent.exe", "Splashtop",
197    process.name.caseless == "srservice.exe", "Splashtop",
198    process.name.caseless == "srmanager.exe", "Splashtop",
199    process.name.caseless == "srserver.exe", "Splashtop",
200    process.name.caseless == "strwinclt.exe", "Splashtop",
201    process.name.caseless == "supremo.exe", "Supremo",
202    process.name.caseless == "supremoservice.exe", "Supremo",
203    process.name.caseless == "syncro.app.runner.exe", "Splashtop",
204    process.name.caseless == "syncro.installer.exe", "Splashtop",
205    process.name.caseless == "syncro.overmind.service.exe", "Splashtop",
206    process.name.caseless == "syncro.service.exe", "Splashtop",
207    process.name.caseless == "syncrolive.agent.exe", "Splashtop",
208    process.name.caseless == "syncrolive.agent.runner.exe", "Splashtop",
209    process.name.caseless == "syncrolive.service.exe", "Splashtop",
210    process.name.caseless == "tacticalrmm.exe", "TacticalRMM",
211    process.name.caseless == "tailscale.exe", "Tailscale",
212    process.name.caseless == "tailscaled.exe", "Tailscale",
213    process.name.caseless == "teamviewer.exe", "TeamViewer",
214    process.name.caseless == "teamviewer_desktop.exe", "TeamViewer",
215    process.name.caseless == "teamviewer_service.exe", "TeamViewer",
216    process.name.caseless == "tiagent.exe", "Tiflux",
217    process.name.caseless == "ticlientcore.exe", "Tiflux",
218    process.name.caseless == "todesk_service.exe", "ToDesk",
219    process.name.caseless == "toolsiq.exe", "ToolsIQ",
220    process.name.caseless == "tsclient.exe", "Techinline",
221    process.name.caseless == "tvn.exe", "TightVNC",
222    process.name.caseless == "tvnserver.exe", "TightVNC",
223    process.name.caseless == "tvnviewer.exe", "TightVNC",
224    process.name.caseless == "twingate.exe", "Twingate",
225    process.name.caseless like "ultravnc*.exe", "UltraVNC",
226    process.name.caseless like "ultraviewer*.exe", "UltraViewer",
227    process.name.caseless == "velociraptor.exe", "Velociraptor",
228    process.name.caseless == "vncserver.exe", "RealVNC",
229    process.name.caseless == "vncviewer.exe", "RealVNC",
230    process.name.caseless == "winvnc.exe", "RealVNC",
231    process.name.caseless == "winwvc.exe", "TightVNC",
232    process.name.caseless == "za_access.exe", "ZohoAssist",
233    process.name.caseless == "za_connect.exe", "ZohoAssist",
234    process.name.caseless == "zaservice.exe", "ZohoAssist",
235    process.name.caseless == "zmagent.exe", "ZohoAssist",
236    process.name.caseless == "zohomeeting.exe", "ZohoAssist",
237    process.name.caseless == "zohotray.exe", "ZohoAssist",
238    process.name.caseless == "zohours.exe", "ZohoAssist",
239    process.name.caseless == "zohoursservice.exe", "ZohoAssist",
240    ""
241  )
242| where Esql.rmm_vendor != "" and Esql.rmm_vendor is not NULL
243| stats Esql.vendor_count = count_distinct(Esql.rmm_vendor),
244        Esql.vendors_seen = values(Esql.rmm_vendor),
245        Esql.processes_executable_values = values(process.executable),
246        Esql.first_seen = min(@timestamp),
247        Esql.last_seen = max(@timestamp)
248  by host.name, host.id
249| where Esql.vendor_count >= 2
250| sort Esql.vendor_count desc
251| keep host.id, host.name, Esql.*
252'''
253
254[[rule.threat]]
255framework = "MITRE ATT&CK"
256
257[[rule.threat.technique]]
258id = "T1219"
259name = "Remote Access Tools"
260reference = "https://attack.mitre.org/techniques/T1219/"
261
262[[rule.threat.technique.subtechnique]]
263id = "T1219.002"
264name = "Remote Desktop Software"
265reference = "https://attack.mitre.org/techniques/T1219/002/"
266
267[rule.threat.tactic]
268id = "TA0011"
269name = "Command and Control"
270reference = "https://attack.mitre.org/tactics/TA0011/"

Triage and analysis

Investigating Multiple Remote Management Tool Vendors on Same Host

This rule aggregates process start events by host.id and host name within the rule's nine-minute lookback window. Data can come from Elastic Defend, Sysmon, Winlogbeat, Windows Security / forwarded events, Microsoft Defender XDR, SentinelOne, or CrowdStrike FDR—where ECS process fields are populated. Each known RMM-related process name maps to one vendor label (e.g. TeamViewer, AnyDesk, ScreenConnect). If two or more different vendor labels appear within the same lookback window, the rule signals.

Possible investigation steps

  • Open Esql.vendors_seen and Esql.processes_executable_values on the alert to see which tools fired in the window.
  • Confirm whether the host is an MSP-managed jump box, helpdesk workstation, or lab where multiple RMM stacks are expected.
  • For servers or standard user endpoints, treat as higher risk: review install source, code signatures, and recent logons.
  • Correlate with other alerts (ingress tool transfer, suspicious scripting, new persistence) on the same host.id.
  • Check asset inventory and change tickets for approved RMM software.

False positive analysis

  • MSP / IT tooling: A technician machine with two approved agents (e.g. RMM + remote support) may match. Tune with host or organizational unit exceptions, or raise the vendor threshold if your environment standardizes on a known pair.
  • Vendor rebrands or bundles: Rare overlaps during migrations can briefly show two vendors; validate timeline and packages.

Response and remediation

  • If unauthorized or unexplained: isolate the host, inventory installed remote-access software, remove unapproved tools, and reset credentials that may have been exposed. Enforce a single approved RMM stack per asset class where possible.

References

Related rules

to-top