← All hunts high TLP:CLEAR Part 1 of 2

Masqueraded MSP360 RMM Installer and Persistence

An attacker is distributing a legitimate but masqueraded MSP360 RMM installer via phishing lures to establish persistent, service-based administrative access on endpoints.

Based on research by Microsoft 2026-10-15 12 steps · 4 queries T1059.001 T1106 T1190 T1543.003 T1547.001 T1566

Brief

Why Now

Microsoft recently detailed a campaign where attackers abuse Remote Monitoring and Management (RMM) tools to establish persistent access. Specifically, the Microsoft Security Blog report 'Phishing Abuses RMM Tools for Persistent Access' (https://www.microsoft.com/en-us/security/blog/2026/09/29/phishing-abuses-rmm-tools-persistent-access/) describes how signed MSP360 installers are being masqueraded as legitimate software like Zoom or PDF updates. This technique is particularly effective because it uses signed, legitimate binaries to bypass reputation-based security controls.

How the Hunt Flows

The hunt begins by scoping the existing RMM footprint across the estate. We identify where MSP360 or other RMM agents already exist to provide a baseline for legitimate administrative activity. This helps differentiate between an IT-managed deployment and a rogue installation. The lead query focuses on the execution of the MSP360 RMM installer (v2.5.0.67) from user-writable directories. We look for process launches from paths like Downloads, Temp, or Desktop. The query specifically looks for filenames that contain version strings or hashes known to be associated with this campaign. A gating step involves an automated agent reviewing the filenames and paths. If an installer is named after a meeting invite or a document update but matches the RMM binary's characteristics, the hunt continues. This prevents the workflow from fanning out for every legitimate IT update. The hunt then corroborates the lead with evidence of successful persistence. We query for the creation of Windows services such as RMM.Agent or RMM.Agent.Launcher. Simultaneously, we perform a stack-count of the installer binary across the fleet. If the binary is rare and resulted in a service installation on a workstation, the suspicion level increases. A final triage step correlates the phishing lure, the persistent service creation, and the binary rarity. If all conditions are met, the hunt recommends immediate isolation of the endpoint and forensic collection of the installer.

What the Hunt Cannot See

This hunt relies on process and service telemetry. If a host lacks endpoint sensors or does not log service installation events (Event ID 4697/7045), the execution and subsequent persistence may go unobserved. We cannot see activities on hosts without these logs.

Steps

  1. Identify RMM software footprint

    Query · scoping

    Find hosts where MSP360 or RMM agent software is already installed to focus the investigation.

    reads hb_software_inventorysql
    SELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%msp360%' OR LOWER(package_name) LIKE '%rmm agent%' OR LOWER(vendor_name) LIKE '%msp360%'

    What a hit looks like. A list of hosts currently running or with MSP360 installed. This provides context for where legitimate RMM activity is expected.

  2. Masqueraded RMM installer execution

    Query · detection candidate

    Find RMM installer execution from user-writable paths using filenames designed to masquerade as common software or documents.

    reads hb_process_activitysql
    SELECT device_hostname, process_name, process_path, process_cmd_line, process_hash_sha256, user_name, time FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) LIKE '%_rmm_v2.5.0.67_%' OR instr(',' || '{{rmm_hashes}}' || ',', ',' || LOWER(process_hash_sha256) || ',') > 0) AND (LOWER(process_path) LIKE '%\users\%' OR LOWER(process_path) LIKE '%\downloads\%' OR LOWER(process_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. A process launch matching the RMM version or hash from a user directory. Silence suggests no such masqueraded installers were executed in the window.

  3. Evaluate lead suspicion

    Agent triage

    The agent reviews the lead query results to determine if the process filenames and paths suggest a phishing lure versus a legitimate admin action.

  4. Gate on suspicion

    Decision

    Route to expensive corroboration queries only if the initial lead is judged suspicious.

  5. RMM service persistence

    Query · enrichment

    Find evidence of successful RMM service installation following the lead execution.

    reads hb_service_activitysql
    SELECT device_hostname, service_name, service_cmd_line, actor_user_name, time FROM hb_service_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(service_name) LIKE 'rmm.agent%' OR LOWER(service_cmd_line) LIKE '%rmm agent%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Creation of RMM.Agent or RMM.Agent.Launcher services. Silence suggests elevation or installation failed.

  6. Installer rarity stack-count

    Query · baseline

    Determine if the suspicious binary name or hash is rare across the fleet, which distinguishes targeted lures from wide software updates.

    reads hb_process_activitysql
    SELECT LOWER(process_name) AS name, COUNT(DISTINCT device_hostname) AS hosts, MIN(time) AS first_seen FROM hb_process_activity WHERE (LOWER(process_name) LIKE '%_rmm_v2.5.0.67_%' OR instr(',' || '{{rmm_hashes}}' || ',', ',' || LOWER(process_hash_sha256) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY LOWER(process_name) HAVING hosts <= {{rare_threshold}}

    What a hit looks like. A stack-count showing the binary is unique or extremely rare. Silence on rarity suggests a broader, potentially legitimate deployment.

  7. Triage foothold and rarity

    Agent triage

    A second agent weights the lead lure, the resulting service persistence, and the rarity of the event to reach a final verdict.

  8. Route on final verdict

    Decision

    Determine whether to contain the host or finalize the hunt.

  9. Isolate endpoint

    Response action

    Contain the threat before follow-on payloads like ScreenConnect are deployed.

  10. Forensic review

    Analyst task

    Verify findings and check for redundant ScreenConnect deployment.

  11. Close out hunt

    Analyst task

    Finalize documentation and log findings.

Coverage

Scenario coverage

StageCoveredHow, or why not
Phishing via Masqueraded RMM Installer
T1566 · T1190
Yes masqueraded-installer-lead
Installer Execution and UAC Elevation
T1059.001 · T1106
Yes masqueraded-installer-lead, service-persistence
RMM Agent Persistence and Configuration
T1543.003 · T1547.001
Yes service-persistence
PowerShell Deployment of Secondary RMM
T1059.001 · T1105
Out of scope Belongs to another part of the 'Phishing Abuses RMM Tools for Persistent Access' series.
Deployment of Information Collection Tools
T1555 · T1005
Out of scope Belongs to another part of the 'Phishing Abuses RMM Tools for Persistent Access' series.

Blind spots

  • Needs hb_process_activity with process command line. A host without endpoint telemetry contributes no process rows, allowing execution from a user profile to go unobserved. It would answer Which masqueraded binaries were executed by the user?. Remediation: Deploy endpoint sensors to all workstations and ensure process creation auditing is enabled.
  • Needs hb_service_activity with service installation events. The hunt cannot confirm a successful foothold without service installation logs, leading to missed compromises. It would answer Was the persistence service successfully installed on the host?. Remediation: Enable and centralize Security log collection for service installation events (Event ID 4697/7045).

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
lookback_daysnumber14Days of history to examine.
rare_thresholdnumber5Maximum number of hosts a binary can appear on to be considered rare.
rmm_hasheslist[hash]108ef7e628d7a20bd6241a5b57149e27a6061f467123eb64061975559f8f73dc, f34330d4c6e0aa978dc3af40360c14b31ad51127Known hashes for the MSP360 RMM installer version 2.5.0.67.
scope_hostslist[host]—Optional host list to narrow the hunt; leave empty to scan the full estate.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A single rule might alert on any MSP360 installation. This hunt uses a gated
  flow to evaluate phishing-specific filenames and paths, corroborates them with persistent
  service creation, and uses stack-counting to differentiate a targeted attack from
  legitimate IT updates.
blind_spots:
- id: no-process-events
  owner: Endpoint Security
  question: Which masqueraded binaries were executed by the user?
  remediation: Deploy endpoint sensors to all workstations and ensure process creation
    auditing is enabled.
  requires: hb_process_activity with process command line
  risk: A host without endpoint telemetry contributes no process rows, allowing execution
    from a user profile to go unobserved.
  stage: initial-access-phishing-lures
- id: no-service-telemetry
  owner: Infrastructure Ops
  question: Was the persistence service successfully installed on the host?
  remediation: Enable and centralize Security log collection for service installation
    events (Event ID 4697/7045).
  requires: hb_service_activity with service installation events
  risk: The hunt cannot confirm a successful foothold without service installation
    logs, leading to missed compromises.
  stage: persistence-rmm-foothold
coverage:
- stage: initial-access-phishing-lures
  status: covered
  steps:
  - masqueraded-installer-lead
- stage: execution-installer-elevation
  status: covered
  steps:
  - masqueraded-installer-lead
  - service-persistence
- stage: persistence-rmm-foothold
  status: covered
  steps:
  - service-persistence
- reason: Belongs to another part of the 'Phishing Abuses RMM Tools for Persistent
    Access' series.
  stage: c2-redundant-rmm-deployment
  status: out_of_scope
- reason: Belongs to another part of the 'Phishing Abuses RMM Tools for Persistent
    Access' series.
  stage: post-compromise-tooling
  status: out_of_scope
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: keep-as-periodic-hunt
  justification: The abuse of signed administrative software like MSP360 bypasses
    traditional reputation-based security controls. A negative result provides assurance
    that masqueraded installers have not established persistence via service-based
    footholds.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An attacker is distributing a legitimate but masqueraded MSP360 RMM installer
  via phishing lures to establish persistent, service-based administrative access
  on endpoints.
labels:
- hunt
- attack.t1566
- attack.t1059.001
- attack.t1543.003
- attack.t1547.001
- attack.t1106
- attack.t1190
- collection
- command and control
- execution
- initial access
- persistence
name: Masqueraded MSP360 RMM Installer and Persistence
parameters:
  lookback_days:
    default: '14'
    description: Days of history to examine.
    type: number
  rare_threshold:
    default: '5'
    description: Maximum number of hosts a binary can appear on to be considered rare.
    type: number
  rmm_hashes:
    default:
    - 108ef7e628d7a20bd6241a5b57149e27a6061f467123eb64061975559f8f73dc
    - f34330d4c6e0aa978dc3af40360c14b31ad51127
    description: Known hashes for the MSP360 RMM installer version 2.5.0.67.
    from:
      kind: article
      observed: '2026-09-29'
      ref: msrc-blog-2026-09-29
    type: list[hash]
  scope_hosts:
    default: []
    description: Optional host list to narrow the hunt; leave empty to scan the full
      estate.
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.microsoft.com/en-us/security/blog/2026/09/29/phishing-abuses-rmm-tools-persistent-access/
    gates:
    - dry-run
    - lint
    model: hb_google/gemini-3-flash-preview
rationale: Focus on endpoints where users are likely to encounter phishing lures.
  Legitimate IT deployments of MSP360 usually occur on servers; a user-profile execution
  on a workstation is a high-fidelity trigger for this campaign.
references:
- name: "Microsoft Security Blog \u2014 Phishing Abuses RMM Tools for Persistent Access"
  url: https://www.microsoft.com/en-us/security/blog/2026/09/29/phishing-abuses-rmm-tools-persistent-access/
related:
- hunt: redundant-rmm-screenconnect-deployment
  reason: This hunt focuses on the initial MSP360 foothold; the follow-on ScreenConnect
    deployment and post-compromise tooling are covered in a separate hunt.
  relation: out-of-scope-alternative
scenario:
  stages:
  - name: Phishing via Masqueraded RMM Installer
    observables:
    - VIP_ECARD_INVITATION_rmm_v2.5.0.67_oid.exe
    - ZoomSetup_Installation_v2.5.0.67_oid.exe
    - PDF Reader & Editor the Adobe Acrobatte_rmm_v2.5.0.67_oid.exe
    - RSVP_INVITATION_E_CARD_rmm_v2.5.0.67_oid.exe
    - SSA.GOV_STATEMENT_rmm_v2.5.0.67_oid.exe
    - 108ef7e628d7a20bd6241a5b57149e27a6061f467123eb64061975559f8f73dc
    - f34330d4c6e0aa978dc3af40360c14b31ad51127
    - gitlab.com
    - dropbox.com
    slug: initial-access-phishing-lures
    tactic: initial-access
    techniques:
    - T1566
    - T1190
  - name: Installer Execution and UAC Elevation
    observables:
    - System.dll
    - nsExec.dll
    - UAC.dll
    - eventcreate.exe
    - dotnet --list-runtimes
    - MSP360 RMM Agent installer
    - Begin installation
    - End installation. MSP360 de Success.
    slug: execution-installer-elevation
    tactic: execution
    techniques:
    - T1059.001
    - T1106
  - name: RMM Agent Persistence and Configuration
    observables:
    - RMM.Agent.exe
    - RMM.Agent.Launcher.exe
    - C:\Program Files\RMM Agent\
    - UDP port 48678
    slug: persistence-rmm-foothold
    tactic: persistence
    techniques:
    - T1543.003
    - T1547.001
  - name: PowerShell Deployment of Secondary RMM
    observables:
    - Invoke-WebRequest
    - ClientSetup.msi
    - msiexec.exe /qn
    - ScreenConnect.ClientService.exe
    - ScreenConnect.WindowsClient.exe
    slug: c2-redundant-rmm-deployment
    tactic: command-and-control
    techniques:
    - T1059.001
    - T1105
  - name: Deployment of Information Collection Tools
    observables:
    - C:\Users\%user%\Documents\ScreenConnect\Temp\
    - WebBrowserPassView.exe
    - WindowsSecurity_PIN.exe
    - DefenderControl.exe
    - WebBrowserBookmarksView.exe
    - WindVerify.exe
    - Passwords.EXE
    slug: post-compromise-tooling
    tactic: collection
    techniques:
    - T1555
    - T1005
  summary: Threat actors use phishing lures themed as meeting invites and software
    updates to deliver masqueraded MSP360 RMM installers. Once established, the RMM
    agent executes PowerShell to deploy a redundant ScreenConnect client, which serves
    as a platform for transferring and executing various credential theft and information
    collection utilities.
series:
  index: 1
  slug: phishing-abuses-rmm-tools-for-persistent-access
  title: Phishing Abuses RMM Tools for Persistent Access
  total: 2
severity: high
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
tlp: clear
type: investigation
---


# Masqueraded MSP360 RMM Installer and Persistence

This hunt identifies the abuse of legitimate Remote Monitoring and Management (RMM) software, specifically MSP360 (v2.5.0.67), used to establish an initial foothold. The adversary distributes the signed installer through social-engineering lures themed around Zoom, PDF updates, or meeting invitations. Once executed from a user profile, the installer elevates and installs persistent Windows services. We open by scoping existing RMM footprints, then use a gated lead query to identify suspicious execution patterns. If the lead is judged suspicious, the hunt fanned out to investigate service persistence and the rarity of the installer across the estate to distinguish a targeted attack from legitimate IT activity.

## identify-rmm-scope
<!-- Identify RMM software footprint -->
Find hosts where MSP360 or RMM agent software is already installed to focus the investigation.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts currently running or with MSP360 installed. This provides
  context for where legitimate RMM activity is expected.
reads:
- device_hostname
- package_name
- package_version
- vendor_name
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%msp360%' OR LOWER(package_name) LIKE '%rmm agent%' OR LOWER(vendor_name) LIKE '%msp360%'
```

## masqueraded-installer-lead
<!-- Masqueraded RMM installer execution -->
Find RMM installer execution from user-writable paths using filenames designed to masquerade as common software or documents.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, rmm_hashes=rmm_hashes, scope_hosts=scope_hosts)
~~~yaml
expected: A process launch matching the RMM version or hash from a user directory.
  Silence suggests no such masqueraded installers were executed in the window.
reads:
- device_hostname
- process_name
- process_path
- process_cmd_line
- process_hash_sha256
- user_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, process_name, process_path, process_cmd_line, process_hash_sha256, user_name, time FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) LIKE '%_rmm_v2.5.0.67_%' OR instr(',' || '{{rmm_hashes}}' || ',', ',' || LOWER(process_hash_sha256) || ',') > 0) AND (LOWER(process_path) LIKE '%\users\%' OR LOWER(process_path) LIKE '%\downloads\%' OR LOWER(process_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## gate-read
<!-- Evaluate lead suspicion -->
```agent target=hunter
cite: required
context:
- masqueraded-installer-lead
max_iterations: 3
objective: Review the process executions in masqueraded-installer-lead. Determine
  if the filenames (e.g. including 'Zoom', 'PDF', 'ECARD', 'INVITATION') combined
  with the RMM version string 'v2.5.0.67' indicate a social-engineering lure.
success_criteria: A verdict of suspicious for any host showing masqueraded RMM execution
  from a user profile.
tools:
- endpoint
```

## gate-decision
<!-- Gate on suspicion -->
if~: "the gate-read verdict is suspicious for at least one host" (confidence: high, judge=hunter)
then: → parallel-fanout
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: no-process-events)
else: → close-out

## parallel-fanout
<!-- Corroborate persistence and rarity -->
parallel:
- → service-persistence
- → installer-rarity
join: → final-triage

## service-persistence
<!-- RMM service persistence -->
Find evidence of successful RMM service installation following the lead execution.

```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Creation of RMM.Agent or RMM.Agent.Launcher services. Silence suggests elevation
  or installation failed.
reads:
- device_hostname
- service_name
- service_cmd_line
- actor_user_name
- time
silence: not_evidence_of_absence
source: hb_service_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, service_name, service_cmd_line, actor_user_name, time FROM hb_service_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(service_name) LIKE 'rmm.agent%' OR LOWER(service_cmd_line) LIKE '%rmm agent%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## installer-rarity
<!-- Installer rarity stack-count -->
Determine if the suspicious binary name or hash is rare across the fleet, which distinguishes targeted lures from wide software updates.

```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, rmm_hashes=rmm_hashes, rare_threshold=rare_threshold)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: A stack-count showing the binary is unique or extremely rare. Silence on
  rarity suggests a broader, potentially legitimate deployment.
prevalence:
  by: device_hostname
  key:
  - name
  rare_below: 5
reads:
- process_name
- device_hostname
- process_hash_sha256
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT LOWER(process_name) AS name, COUNT(DISTINCT device_hostname) AS hosts, MIN(time) AS first_seen FROM hb_process_activity WHERE (LOWER(process_name) LIKE '%_rmm_v2.5.0.67_%' OR instr(',' || '{{rmm_hashes}}' || ',', ',' || LOWER(process_hash_sha256) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY LOWER(process_name) HAVING hosts <= {{rare_threshold}}
```

## final-triage
<!-- Triage foothold and rarity -->
```agent target=hunter
cite: required
context:
- gate-read
- service-persistence
- installer-rarity
max_iterations: 5
objective: Determine if any host has been successfully compromised via a masqueraded
  MSP360 installer. Correlate the suspicious execution identified in gate-read with
  the service creation and installer rarity.
success_criteria: A verdict of malicious for hosts showing the phishing lure followed
  by service persistence and binary rarity.
tools:
- endpoint
```

## route-on-verdict
<!-- Route on final verdict -->
if~: "the final-triage verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → contain-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: no-service-telemetry)
else: → close-out

## contain-host
<!-- Isolate endpoint -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the endpoint. Stop and delete the RMM.Agent and RMM.Agent.Launcher services. Collect the installer binary from the user's profile for forensic analysis.
```
→ analyst-review

## analyst-review
<!-- Forensic review -->
```manual target=analyst
Review the lead and service rows. Specifically check if RMM.Agent.exe spawned PowerShell to download ClientSetup.msi, which indicates the second remote access channel has been deployed.
```
→ close-out

## close-out
<!-- Close out hunt -->
```manual target=analyst
Record the examined hosts and findings. Document any legitimate MSP360 use cases to update the excluded scope for future periodic runs.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.