Multiple Remote Management Tool Vendors on Same Host


Description

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.

Query · esql

from 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
| where (host.os.type == "windows" or host.os.family == "windows")
    and event.category == "process"
    and event.type == "start"
    and process.name is not null
| eval Esql.rmm_vendor = case(
    process.name.caseless like "aa_v*.exe", "AnyAssist",
    process.name.caseless == "acroniscyberprotectconnectagent.exe", "Acronis",
    process.name.caseless == "aeroadmin.exe", "AeroAdmin",
    process.name.caseless == "agentmon.exe", "ConnectWiseAutomate",
    process.name.caseless == "anydesk.exe", "AnyDesk",
    process.name.caseless == "apc_admin.exe", "APC",
    process.name.caseless == "apc_host.exe", "APC",
    process.name.caseless == "ateraagent.exe", "Atera",
    process.name.caseless like "aweray_remote*.exe", "AweSun",
    process.name.caseless == "awesun.exe", "AweSun",
    process.name.caseless == "b4-service.exe", "BeyondTrust",
    process.name.caseless == "basupsrvc.exe", "BeyondTrust",
    process.name.caseless == "bomgar-scc.exe", "BeyondTrust",
    process.name.caseless == "remote support.exe", "BeyondTrust",
    process.name.caseless == "cagservice.exe", "BarracudaRMM",
    process.name.caseless == "cloudracmd.exe", "CloudRadial",
    process.name.caseless == "cloudrasd.exe", "CloudRadial",
    process.name.caseless == "cloudraservice.exe", "CloudRadial",
    process.name.caseless like "connectwisecontrol*.exe", "ScreenConnect",
    process.name.caseless == "domotzagent.exe", "Domotz",
    process.name.caseless == "domotz-windows-x64-10.exe", "Domotz",
    process.name.caseless == "dwagsvc.exe", "DWService",
    process.name.caseless == "dwrcc.exe", "DWService",
    process.name.caseless == "dwrcs.exe", "DWService",
    process.name.caseless == "dwrcst.exe", "DWService",
    process.name.caseless like "fleetdeck_commander*.exe", "FleetDeck",
    process.name.caseless == "g2aservice.exe", "GoTo",
    process.name.caseless == "getscreen.exe", "GetScreen",
    process.name.caseless == "gotoassistservice.exe", "GoTo",
    process.name.caseless == "gotohttp.exe", "GoTo",
    process.name.caseless == "gotoresolveprocesschecker.exe", "GoTo",
    process.name.caseless == "gotoresolveremotecontrol.exe", "GoTo",
    process.name.caseless == "gotoresolveservice.exe", "GoTo",
    process.name.caseless == "gotoresolveterminal.exe", "GoTo",
    process.name.caseless == "gotoresolveunattended.exe", "GoTo",
    process.name.caseless == "helpwire.exe", "HelpWire",
    process.name.caseless == "immyagent.exe", "ImmyBot",
    process.name.caseless == "immybot.agent.ephemeral.exe", "ImmyBot",
    process.name.caseless == "immyupdater.exe", "ImmyBot",
    process.name.caseless == "imperoclientsvc.exe", "Impero",
    process.name.caseless == "imperoserversvc.exe", "Impero",
    process.name.caseless == "isllight.exe", "ISLOnline",
    process.name.caseless == "isllightclient.exe", "ISLOnline",
    process.name.caseless == "jumpcloud-agent.exe", "JumpCloud",
    process.name.caseless == "komari.exe", "Komari",
    process.name.caseless == "komari-agent.exe", "Komari",
    process.name.caseless == "level.exe", "Level",
    process.name.caseless == "lmi_rescue.exe", "LogMeIn",
    process.name.caseless == "lmi_rescue_srv.exe", "LogMeIn",
    process.name.caseless == "lmiignition.exe", "LogMeIn",
    process.name.caseless == "logmein.exe", "LogMeIn",
    process.name.caseless == "ltsvc.exe", "ConnectWiseAutomate",
    process.name.caseless == "ltsvcmon.exe", "ConnectWiseAutomate",
    process.name.caseless == "lttray.exe", "ConnectWiseAutomate",
    process.name.caseless == "lunixar.exe", "Lunixar",
    process.name.caseless == "lunixarremote.exe", "Lunixar",
    process.name.caseless == "lunixarupdater.exe", "Lunixar",
    process.name.caseless == "lvagent.exe", "Level",
    process.name.caseless == "manageengine_remote_access_plus.exe", "ManageEngine",
    process.name.caseless == "meshagent.exe", "MeshCentral",
    process.name.caseless == "mikogo-service.exe", "Mikogo",
    process.name.caseless == "nezha-agent.exe", "Nezha",
    process.name.caseless == "ninjarmmagent.exe", "NinjaOne",
    process.name.caseless == "ninjarmmagentpatcher.exe", "NinjaOne",
    process.name.caseless == "ninjarmm-cli.exe", "NinjaOne",
    process.name.caseless == "parsec.exe", "Parsec",
    process.name.caseless == "pservice.exe", "Pulseway",
    process.name.caseless == "quickassist.exe", "QuickAssist",
    process.name.caseless == "r_server.exe", "Radmin",
    process.name.caseless == "radmin.exe", "Radmin",
    process.name.caseless == "radmin3.exe", "Radmin",
    process.name.caseless == "rcengmgru.exe", "Rsupport",
    process.name.caseless == "rcclient.exe", "RPCSuite",
    process.name.caseless == "rcmgrsvc.exe", "Rsupport",
    process.name.caseless == "rcservice.exe", "RPCSuite",
    process.name.caseless == "remotedesktopmanager.exe", "Devolutions",
    process.name.caseless == "remotely_agent.exe", "Remotely",
    process.name.caseless == "remotely_desktop.exe", "Remotely",
    process.name.caseless == "remotepc.exe", "RemotePC",
    process.name.caseless == "remotepcdesktop.exe", "RemotePC",
    process.name.caseless == "remotepcservice.exe", "RemotePC",
    process.name.caseless == "remoteview.exe", "Rsupport",
    process.name.caseless == "rfusclient.exe", "RemoteUtilities",
    process.name.caseless == "rmm.agent.exe", "SuperOps",
    process.name.caseless == "romserver.exe", "RealVNC",
    process.name.caseless == "romviewer.exe", "RealVNC",
    process.name.caseless == "rpcsuite.exe", "RPCSuite",
    process.name.caseless == "rserver3.exe", "Radmin",
    process.name.caseless == "rustdesk.exe", "RustDesk",
    process.name.caseless == "rutserv.exe", "RemoteUtilities",
    process.name.caseless == "rutview.exe", "RemoteUtilities",
    process.name.caseless == "rvagent.exe", "Rsupport",
    process.name.caseless == "rvagtray.exe", "Rsupport",
    process.name.caseless == "saazapsc.exe", "Kaseya",
    process.name.caseless like "screenconnect*.exe", "ScreenConnect",
    process.name.caseless == "session_win.exe", "ZohoAssist",
    process.name.caseless == "simplegatewayservice.exe", "SimpleHelp",
    process.name.caseless == "simplehelpcustomer.exe", "SimpleHelp",
    process.name.caseless == "smpcview.exe", "Splashtop",
    process.name.caseless == "spclink.exe", "Splashtop",
    process.name.caseless == "splashtop-streamer.exe", "Splashtop",
    process.name.caseless == "splashtopsos.exe", "Splashtop",
    process.name.caseless == "spsrv.exe", "Splashtop",
    process.name.caseless == "sragent.exe", "Splashtop",
    process.name.caseless == "srservice.exe", "Splashtop",
    process.name.caseless == "srmanager.exe", "Splashtop",
    process.name.caseless == "srserver.exe", "Splashtop",
    process.name.caseless == "strwinclt.exe", "Splashtop",
    process.name.caseless == "supremo.exe", "Supremo",
    process.name.caseless == "supremoservice.exe", "Supremo",
    process.name.caseless == "syncro.app.runner.exe", "Splashtop",
    process.name.caseless == "syncro.installer.exe", "Splashtop",
    process.name.caseless == "syncro.overmind.service.exe", "Splashtop",
    process.name.caseless == "syncro.service.exe", "Splashtop",
    process.name.caseless == "syncrolive.agent.exe", "Splashtop",
    process.name.caseless == "syncrolive.agent.runner.exe", "Splashtop",
    process.name.caseless == "syncrolive.service.exe", "Splashtop",
    process.name.caseless == "tacticalrmm.exe", "TacticalRMM",
    process.name.caseless == "tailscale.exe", "Tailscale",
    process.name.caseless == "tailscaled.exe", "Tailscale",
    process.name.caseless == "teamviewer.exe", "TeamViewer",
    process.name.caseless == "teamviewer_desktop.exe", "TeamViewer",
    process.name.caseless == "teamviewer_service.exe", "TeamViewer",
    process.name.caseless == "tiagent.exe", "Tiflux",
    process.name.caseless == "ticlientcore.exe", "Tiflux",
    process.name.caseless == "todesk_service.exe", "ToDesk",
    process.name.caseless == "toolsiq.exe", "ToolsIQ",
    process.name.caseless == "tsclient.exe", "Techinline",
    process.name.caseless == "tvn.exe", "TightVNC",
    process.name.caseless == "tvnserver.exe", "TightVNC",
    process.name.caseless == "tvnviewer.exe", "TightVNC",
    process.name.caseless == "twingate.exe", "Twingate",
    process.name.caseless like "ultravnc*.exe", "UltraVNC",
    process.name.caseless like "ultraviewer*.exe", "UltraViewer",
    process.name.caseless == "velociraptor.exe", "Velociraptor",
    process.name.caseless == "vncserver.exe", "RealVNC",
    process.name.caseless == "vncviewer.exe", "RealVNC",
    process.name.caseless == "winvnc.exe", "RealVNC",
    process.name.caseless == "winwvc.exe", "TightVNC",
    process.name.caseless == "za_access.exe", "ZohoAssist",
    process.name.caseless == "za_connect.exe", "ZohoAssist",
    process.name.caseless == "zaservice.exe", "ZohoAssist",
    process.name.caseless == "zmagent.exe", "ZohoAssist",
    process.name.caseless == "zohomeeting.exe", "ZohoAssist",
    process.name.caseless == "zohotray.exe", "ZohoAssist",
    process.name.caseless == "zohours.exe", "ZohoAssist",
    process.name.caseless == "zohoursservice.exe", "ZohoAssist",
    ""
  )
| where Esql.rmm_vendor != "" and Esql.rmm_vendor is not NULL
| stats Esql.vendor_count = count_distinct(Esql.rmm_vendor),
        Esql.vendors_seen = values(Esql.rmm_vendor),
        Esql.processes_executable_values = values(process.executable),
        Esql.first_seen = min(@timestamp),
        Esql.last_seen = max(@timestamp)
  by host.name, host.id
| where Esql.vendor_count >= 2
| sort Esql.vendor_count desc
| keep host.id, host.name, Esql.*

Implementation guide

This rule is designed for data generated by Elastic Defend, which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.

Setup instructions: https://ela.st/install-elastic-defend

Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

Analyst notes

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.
Raw source Multiple Remote Management Tool Vendors on Same Host · Elastic TOML
Esc
Published by elastic/detection-rules ↗, licensed under Elastic License 2.0 ↗. Reproduced here unmodified.
[metadata]
creation_date = "2026/03/23"
integration = ["endpoint", "windows", "sentinel_one_cloud_funnel", "m365_defender", "system", "crowdstrike"]
maturity = "production"
updated_date = "2026/06/24"

[rule]
author = ["Elastic"]
description = """
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.
"""
from = "now-9m"
interval = "8m"
language = "esql"
license = "Elastic License v2"
name = "Multiple Remote Management Tool Vendors on Same Host"
note = """## 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.
"""

setup = """## Setup

This 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.

Setup instructions: https://ela.st/install-elastic-defend

### Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

- [CrowdStrike](https://ela.st/crowdstrike-integration)
- [Microsoft Defender XDR](https://ela.st/m365-defender)
- [SentinelOne Cloud Funnel](https://ela.st/sentinel-one-cloud-funnel)
- [Sysmon Event ID 1 - Process Creation](https://ela.st/sysmon-event-1-setup)
- [Windows Process Creation Logs](https://ela.st/audit-process-creation)
"""

references = [
    "https://attack.mitre.org/techniques/T1219/",
    "https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-025a",
    "https://lolrmm.io/",
]
risk_score = 47
rule_id = "c3f8a1d2-4b5e-4c6f-9a8b-1e2d3f4a5b6c"
severity = "medium"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Command and Control",
    "Resources: Investigation Guide",
    "Data Source: Elastic Defend",
    "Data Source: Sysmon",
    "Data Source: SentinelOne",
    "Data Source: Microsoft Defender XDR",
    "Data Source: Crowdstrike",
    "Data Source: Windows Security Event Logs",
    "Data Source: Winlogbeat",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from 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
| where (host.os.type == "windows" or host.os.family == "windows")
    and event.category == "process"
    and event.type == "start"
    and process.name is not null
| eval Esql.rmm_vendor = case(
    process.name.caseless like "aa_v*.exe", "AnyAssist",
    process.name.caseless == "acroniscyberprotectconnectagent.exe", "Acronis",
    process.name.caseless == "aeroadmin.exe", "AeroAdmin",
    process.name.caseless == "agentmon.exe", "ConnectWiseAutomate",
    process.name.caseless == "anydesk.exe", "AnyDesk",
    process.name.caseless == "apc_admin.exe", "APC",
    process.name.caseless == "apc_host.exe", "APC",
    process.name.caseless == "ateraagent.exe", "Atera",
    process.name.caseless like "aweray_remote*.exe", "AweSun",
    process.name.caseless == "awesun.exe", "AweSun",
    process.name.caseless == "b4-service.exe", "BeyondTrust",
    process.name.caseless == "basupsrvc.exe", "BeyondTrust",
    process.name.caseless == "bomgar-scc.exe", "BeyondTrust",
    process.name.caseless == "remote support.exe", "BeyondTrust",
    process.name.caseless == "cagservice.exe", "BarracudaRMM",
    process.name.caseless == "cloudracmd.exe", "CloudRadial",
    process.name.caseless == "cloudrasd.exe", "CloudRadial",
    process.name.caseless == "cloudraservice.exe", "CloudRadial",
    process.name.caseless like "connectwisecontrol*.exe", "ScreenConnect",
    process.name.caseless == "domotzagent.exe", "Domotz",
    process.name.caseless == "domotz-windows-x64-10.exe", "Domotz",
    process.name.caseless == "dwagsvc.exe", "DWService",
    process.name.caseless == "dwrcc.exe", "DWService",
    process.name.caseless == "dwrcs.exe", "DWService",
    process.name.caseless == "dwrcst.exe", "DWService",
    process.name.caseless like "fleetdeck_commander*.exe", "FleetDeck",
    process.name.caseless == "g2aservice.exe", "GoTo",
    process.name.caseless == "getscreen.exe", "GetScreen",
    process.name.caseless == "gotoassistservice.exe", "GoTo",
    process.name.caseless == "gotohttp.exe", "GoTo",
    process.name.caseless == "gotoresolveprocesschecker.exe", "GoTo",
    process.name.caseless == "gotoresolveremotecontrol.exe", "GoTo",
    process.name.caseless == "gotoresolveservice.exe", "GoTo",
    process.name.caseless == "gotoresolveterminal.exe", "GoTo",
    process.name.caseless == "gotoresolveunattended.exe", "GoTo",
    process.name.caseless == "helpwire.exe", "HelpWire",
    process.name.caseless == "immyagent.exe", "ImmyBot",
    process.name.caseless == "immybot.agent.ephemeral.exe", "ImmyBot",
    process.name.caseless == "immyupdater.exe", "ImmyBot",
    process.name.caseless == "imperoclientsvc.exe", "Impero",
    process.name.caseless == "imperoserversvc.exe", "Impero",
    process.name.caseless == "isllight.exe", "ISLOnline",
    process.name.caseless == "isllightclient.exe", "ISLOnline",
    process.name.caseless == "jumpcloud-agent.exe", "JumpCloud",
    process.name.caseless == "komari.exe", "Komari",
    process.name.caseless == "komari-agent.exe", "Komari",
    process.name.caseless == "level.exe", "Level",
    process.name.caseless == "lmi_rescue.exe", "LogMeIn",
    process.name.caseless == "lmi_rescue_srv.exe", "LogMeIn",
    process.name.caseless == "lmiignition.exe", "LogMeIn",
    process.name.caseless == "logmein.exe", "LogMeIn",
    process.name.caseless == "ltsvc.exe", "ConnectWiseAutomate",
    process.name.caseless == "ltsvcmon.exe", "ConnectWiseAutomate",
    process.name.caseless == "lttray.exe", "ConnectWiseAutomate",
    process.name.caseless == "lunixar.exe", "Lunixar",
    process.name.caseless == "lunixarremote.exe", "Lunixar",
    process.name.caseless == "lunixarupdater.exe", "Lunixar",
    process.name.caseless == "lvagent.exe", "Level",
    process.name.caseless == "manageengine_remote_access_plus.exe", "ManageEngine",
    process.name.caseless == "meshagent.exe", "MeshCentral",
    process.name.caseless == "mikogo-service.exe", "Mikogo",
    process.name.caseless == "nezha-agent.exe", "Nezha",
    process.name.caseless == "ninjarmmagent.exe", "NinjaOne",
    process.name.caseless == "ninjarmmagentpatcher.exe", "NinjaOne",
    process.name.caseless == "ninjarmm-cli.exe", "NinjaOne",
    process.name.caseless == "parsec.exe", "Parsec",
    process.name.caseless == "pservice.exe", "Pulseway",
    process.name.caseless == "quickassist.exe", "QuickAssist",
    process.name.caseless == "r_server.exe", "Radmin",
    process.name.caseless == "radmin.exe", "Radmin",
    process.name.caseless == "radmin3.exe", "Radmin",
    process.name.caseless == "rcengmgru.exe", "Rsupport",
    process.name.caseless == "rcclient.exe", "RPCSuite",
    process.name.caseless == "rcmgrsvc.exe", "Rsupport",
    process.name.caseless == "rcservice.exe", "RPCSuite",
    process.name.caseless == "remotedesktopmanager.exe", "Devolutions",
    process.name.caseless == "remotely_agent.exe", "Remotely",
    process.name.caseless == "remotely_desktop.exe", "Remotely",
    process.name.caseless == "remotepc.exe", "RemotePC",
    process.name.caseless == "remotepcdesktop.exe", "RemotePC",
    process.name.caseless == "remotepcservice.exe", "RemotePC",
    process.name.caseless == "remoteview.exe", "Rsupport",
    process.name.caseless == "rfusclient.exe", "RemoteUtilities",
    process.name.caseless == "rmm.agent.exe", "SuperOps",
    process.name.caseless == "romserver.exe", "RealVNC",
    process.name.caseless == "romviewer.exe", "RealVNC",
    process.name.caseless == "rpcsuite.exe", "RPCSuite",
    process.name.caseless == "rserver3.exe", "Radmin",
    process.name.caseless == "rustdesk.exe", "RustDesk",
    process.name.caseless == "rutserv.exe", "RemoteUtilities",
    process.name.caseless == "rutview.exe", "RemoteUtilities",
    process.name.caseless == "rvagent.exe", "Rsupport",
    process.name.caseless == "rvagtray.exe", "Rsupport",
    process.name.caseless == "saazapsc.exe", "Kaseya",
    process.name.caseless like "screenconnect*.exe", "ScreenConnect",
    process.name.caseless == "session_win.exe", "ZohoAssist",
    process.name.caseless == "simplegatewayservice.exe", "SimpleHelp",
    process.name.caseless == "simplehelpcustomer.exe", "SimpleHelp",
    process.name.caseless == "smpcview.exe", "Splashtop",
    process.name.caseless == "spclink.exe", "Splashtop",
    process.name.caseless == "splashtop-streamer.exe", "Splashtop",
    process.name.caseless == "splashtopsos.exe", "Splashtop",
    process.name.caseless == "spsrv.exe", "Splashtop",
    process.name.caseless == "sragent.exe", "Splashtop",
    process.name.caseless == "srservice.exe", "Splashtop",
    process.name.caseless == "srmanager.exe", "Splashtop",
    process.name.caseless == "srserver.exe", "Splashtop",
    process.name.caseless == "strwinclt.exe", "Splashtop",
    process.name.caseless == "supremo.exe", "Supremo",
    process.name.caseless == "supremoservice.exe", "Supremo",
    process.name.caseless == "syncro.app.runner.exe", "Splashtop",
    process.name.caseless == "syncro.installer.exe", "Splashtop",
    process.name.caseless == "syncro.overmind.service.exe", "Splashtop",
    process.name.caseless == "syncro.service.exe", "Splashtop",
    process.name.caseless == "syncrolive.agent.exe", "Splashtop",
    process.name.caseless == "syncrolive.agent.runner.exe", "Splashtop",
    process.name.caseless == "syncrolive.service.exe", "Splashtop",
    process.name.caseless == "tacticalrmm.exe", "TacticalRMM",
    process.name.caseless == "tailscale.exe", "Tailscale",
    process.name.caseless == "tailscaled.exe", "Tailscale",
    process.name.caseless == "teamviewer.exe", "TeamViewer",
    process.name.caseless == "teamviewer_desktop.exe", "TeamViewer",
    process.name.caseless == "teamviewer_service.exe", "TeamViewer",
    process.name.caseless == "tiagent.exe", "Tiflux",
    process.name.caseless == "ticlientcore.exe", "Tiflux",
    process.name.caseless == "todesk_service.exe", "ToDesk",
    process.name.caseless == "toolsiq.exe", "ToolsIQ",
    process.name.caseless == "tsclient.exe", "Techinline",
    process.name.caseless == "tvn.exe", "TightVNC",
    process.name.caseless == "tvnserver.exe", "TightVNC",
    process.name.caseless == "tvnviewer.exe", "TightVNC",
    process.name.caseless == "twingate.exe", "Twingate",
    process.name.caseless like "ultravnc*.exe", "UltraVNC",
    process.name.caseless like "ultraviewer*.exe", "UltraViewer",
    process.name.caseless == "velociraptor.exe", "Velociraptor",
    process.name.caseless == "vncserver.exe", "RealVNC",
    process.name.caseless == "vncviewer.exe", "RealVNC",
    process.name.caseless == "winvnc.exe", "RealVNC",
    process.name.caseless == "winwvc.exe", "TightVNC",
    process.name.caseless == "za_access.exe", "ZohoAssist",
    process.name.caseless == "za_connect.exe", "ZohoAssist",
    process.name.caseless == "zaservice.exe", "ZohoAssist",
    process.name.caseless == "zmagent.exe", "ZohoAssist",
    process.name.caseless == "zohomeeting.exe", "ZohoAssist",
    process.name.caseless == "zohotray.exe", "ZohoAssist",
    process.name.caseless == "zohours.exe", "ZohoAssist",
    process.name.caseless == "zohoursservice.exe", "ZohoAssist",
    ""
  )
| where Esql.rmm_vendor != "" and Esql.rmm_vendor is not NULL
| stats Esql.vendor_count = count_distinct(Esql.rmm_vendor),
        Esql.vendors_seen = values(Esql.rmm_vendor),
        Esql.processes_executable_values = values(process.executable),
        Esql.first_seen = min(@timestamp),
        Esql.last_seen = max(@timestamp)
  by host.name, host.id
| where Esql.vendor_count >= 2
| sort Esql.vendor_count desc
| keep host.id, host.name, Esql.*
'''

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1219"
name = "Remote Access Tools"
reference = "https://attack.mitre.org/techniques/T1219/"

[[rule.threat.technique.subtechnique]]
id = "T1219.002"
name = "Remote Desktop Software"
reference = "https://attack.mitre.org/techniques/T1219/002/"

[rule.threat.tactic]
id = "TA0011"
name = "Command and Control"
reference = "https://attack.mitre.org/tactics/TA0011/"

Detection rules belong to the projects that publish them and remain under their own licenses. This site indexes and links to them; it claims no rights in them.