← All hunts high TLP:CLEAR

N-central RMM Exploitation and Downstream Abuse

An attacker has exploited the Able2Shell vulnerability chain on an N-central RMM appliance to gain root access and is now using the appliance's native script-deployment features to execute code across managed downstream endpoints.

Based on research by Huntress 2026-11-10 12 steps · 5 queries T1059 T1068 T1136.001 T1190

Brief

Why This Hunt Matters

Huntress recently disclosed a series of critical vulnerabilities in the N-central RMM platform, collectively known as Able2Shell (https://www.huntress.com/blog/n-able-disables-cloud-services-following-disclosure-of-able2shell-exploit-chains). These flaws allow an unauthenticated attacker to gain root access on the management appliance. Because N-central is a centralized hub for managing client environments, a compromise of the appliance is a force multiplier for an adversary. It grants them the ability to execute code, deploy malware, or harvest credentials across every managed system in the estate. This hunt addresses the risk of an attacker weaponizing the RMM's own capabilities against the managed fleet.

Scoping the Environment

We begin by identifying every N-central appliance within the environment. This scoping phase uses software inventory records to find hosts running packages associated with N-central or N-able. Identifying these systems marks the potential attack surface and narrows the focus for the subsequent behavioral checks. If the environment does not manage an N-central appliance, the hunt ends here.

Examining Appliance Exploitation

Once the query identifies the appliances, the hunt examines them for signs of active exploitation. This phase checks for unpatched CVEs named in the Able2Shell disclosure and monitors for suspicious process behavior. An analyst specifically looks for root-level shells or command interpreters spawned by the N-central service processes. These parent-child relationships serve as high-confidence indicators of remote code execution, as the management service should not typically spawn an interactive shell as root.

Detecting Persistence and Downstream Abuse

The hunt then pivots to detect persistence on the appliance and abuse of the managed agents. The first query in this phase looks for unauthorized account creations on the appliance, which indicates an attacker is using the disclosed bypass vulnerabilities to maintain access. Simultaneously, the hunt baselines script execution logs from all agents managed by the RMM. By stacking script names and identifying those that appear on a very small number of hosts, the hunt highlights spraying behavior where an attacker deploys a payload to a subset of the fleet rather than the entire organization.

Triage and Impact Assessment

The final phase triages these results to build a full picture of the impact. An analyst aggregates the appliance-level process anomalies with the rare script data from the endpoints. This correlation allows the responder to determine if a breach on the management hub has already transitioned into lateral movement or estate-wide execution. The analyst then provides a verdict on whether the appliance is compromised, suspicious, or clean.

What This Hunt Cannot See

This hunt has two notable blind spots. It does not monitor HTTP telemetry from the N-central appliance, meaning it cannot identify the specific URI paths or web requests used during the initial exploitation. Additionally, if endpoints do not have full script block logging enabled, the hunt identifies that a script was executed by the RMM agent but cannot reveal the internal logic or obfuscated content of that script. Analysts must manually review rare scripts to determine their intent.

Steps

  1. Identify N-central RMM appliances

    Query · scoping

    Scope the hunt to systems running the N-central software by checking the installed package inventory.

    reads hb_software_inventorysql
    SELECT device_hostname, device_uid, package_name, package_version, install_path FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%n-central%' OR LOWER(package_name) LIKE '%n-able%'

    What a hit looks like. A list of hosts acting as management appliances. Silence indicates N-central is not managed within this inventory scope.

  2. Check for unpatched Able2Shell CVEs

    Query · enrichment

    Confirm if the appliances in scope are flagged for the specific vulnerabilities being hunted.

    reads hb_vulnerability_findingsql
    SELECT device_uid, cve_uid, severity, title, status FROM hb_vulnerability_finding WHERE instr(',' || '{{vulnerable_cves}}' || ',', ',' || cve_uid || ',') > 0

    What a hit looks like. Rows indicating that one or more appliances are vulnerable to the exploited CVEs.

  3. Suspicious root shells from RMM services

    Query · detection candidate

    Detect privilege escalation by finding shells or interpreters spawned by the N-central service process as root.

    reads hb_process_activitysql
    SELECT device_hostname, process_name, process_cmd_line, user_name, parent_process_name, time FROM hb_process_activity WHERE (LOWER(user_name) = 'root' OR integrity_level = 'System') AND (instr(',' || '{{ncentral_service_names}}' || ',', ',' || LOWER(parent_process_name) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. A shell or system command run by the N-central service under root or System privileges. This is a primary indicator of successful RCE.

  4. Triage appliance breach

    Agent triage

    Assess whether the appliance has been compromised based on the vulnerability state and the process behavioral evidence.

  5. Unauthorized account creation on appliance

    Query · triage

    Detect new accounts created on the appliance, which may indicate persistence using the bypass vulnerabilities (CVE-2026-86206).

    reads hb_account_changesql
    SELECT device_hostname, user_name, activity_name, actor_user_name, time FROM hb_account_change WHERE activity_id = 1 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. New accounts created on the N-central appliance after the vulnerability disclosure window. Silence proves no account-level persistence occurred during the window.

  6. Rare script deployment baseline

    Query · baseline

    Stack-count script execution from the N-central agent to identify rare 'spraying' behavior that deviates from standard maintenance tasks.

    reads hb_script_activitysql
    SELECT script_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen, MAX(time) AS last_seen FROM hb_script_activity WHERE (LOWER(process_name) LIKE '%ncentral%' OR LOWER(process_name) LIKE '%n-able%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY script_name HAVING host_count <= 5 ORDER BY host_count ASC

    What a hit looks like. Scripts that appear on only a few hosts. Routine maintenance scripts will appear fleet-wide; malicious 'spraying' of a specific payload may stand out as a rare value.

  7. Assess estate-wide impact

    Agent triage

    Aggregate the appliance-level findings with the follow-on persistence and script activity to determine the extent of the compromise.

  8. Route on verdict

    Decision

    Direct the response based on whether a compromise was confirmed.

  9. Isolate compromised appliance

    Response action

    Stop further downstream abuse by isolating the central management point.

  10. Analyze sprayed scripts

    Analyst task

    Manually review the scripts identified as rare to understand the attacker's final objectives.

  11. Close out hunt

    Analyst task

    Document findings and update the detection baseline.

Coverage

Scenario coverage

StageCoveredHow, or why not
N-central Web Exploitation
T1190
Yes vulnerability-context, appliance-triage
Appliance Privilege Escalation
T1068
Yes appliance-shell-activity, appliance-triage
Unauthorized Admin Account Creation
T1136.001
Yes unauthorized-accounts, impact-triage
Downstream Script Spraying
T1059
Yes script-prevalence, impact-triage

Blind spots

  • Needs hb_script_activity with full script block logging. An attacker can deploy obfuscated scripts that execute in memory; without script block logging, the analyst cannot confirm the payload's intent. It would answer what the sprayed scripts actually did.
  • Needs hb_http_activity from the N-central appliance web server. Without web logs, we only see the aftermath (the root shell); if the exploit is successful but the attacker uses internal RMM commands instead of a shell, the initial access remains invisible. It would answer the specific URI path used for the exploit.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
lookback_daysnumber14Days of history to examine.
ncentral_service_nameslist[string]ncentral, tomcat, n-ableProcess names associated with the N-central appliance services.
scope_hostslist[host]—Hostnames of the N-central appliances identified in the scoping step; leave empty to hunt across the entire estate.
vulnerable_cveslist[string]CVE-2026-86218, CVE-2026-18556, CVE-2026-18577, CVE-2026-86206, CVE-2026-86207CVEs named in the Able2Shell disclosure.

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 simple detection rule might fire on a root shell from Tomcat, but it would
  miss the context of the unpatched CVE and the downstream spraying. This hunt connects
  the appliance exploitation, account persistence, and the prevalence of scripts across
  the fleet into a single investigator-led workflow.
blind_spots:
- id: no-script-logging
  question: what the sprayed scripts actually did
  requires: hb_script_activity with full script block logging
  risk: An attacker can deploy obfuscated scripts that execute in memory; without
    script block logging, the analyst cannot confirm the payload's intent.
  stage: downstream-rmm-abuse
- id: appliance-web-telemetry
  question: the specific URI path used for the exploit
  requires: hb_http_activity from the N-central appliance web server
  risk: Without web logs, we only see the aftermath (the root shell); if the exploit
    is successful but the attacker uses internal RMM commands instead of a shell,
    the initial access remains invisible.
  stage: exploit-n-central-rce
coverage:
- stage: exploit-n-central-rce
  status: covered
  steps:
  - vulnerability-context
  - appliance-triage
- stage: privilege-escalation-to-root
  status: covered
  steps:
  - appliance-shell-activity
  - appliance-triage
- stage: unauthorized-account-creation
  status: covered
  steps:
  - unauthorized-accounts
  - impact-triage
- stage: downstream-rmm-abuse
  status: covered
  steps:
  - script-prevalence
  - impact-triage
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: The compromise of an RMM appliance is a 'force multiplier' for an
    attacker, granting them administrative control over all managed endpoints. This
    hunt is required to ensure that a breach of the appliance has not already progressed
    to estate-wide execution.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An attacker has exploited the Able2Shell vulnerability chain on an N-central
  RMM appliance to gain root access and is now using the appliance's native script-deployment
  features to execute code across managed downstream endpoints.
labels:
- hunt
- attack.t1190
- attack.t1068
- attack.t1136.001
- attack.t1059
- execution
- initial access
- persistence
- privilege escalation
name: N-central RMM Exploitation and Downstream Abuse
parameters:
  lookback_days:
    default: '14'
    description: Days of history to examine.
    from:
      kind: manual
      observed: '2026-11-09'
      ref: standard-lookback
    type: number
  ncentral_service_names:
    default:
    - ncentral
    - tomcat
    - n-able
    description: Process names associated with the N-central appliance services.
    from:
      kind: manual
      observed: '2026-11-09'
      ref: n-able-docs
    type: list[string]
  scope_hosts:
    default: []
    description: Hostnames of the N-central appliances identified in the scoping step;
      leave empty to hunt across the entire estate.
    from:
      kind: manual
      observed: '2026-11-09'
      ref: analyst-defined
    type: list[host]
  vulnerable_cves:
    default:
    - CVE-2026-86218
    - CVE-2026-18556
    - CVE-2026-18577
    - CVE-2026-86206
    - CVE-2026-86207
    description: CVEs named in the Able2Shell disclosure.
    from:
      kind: article
      observed: '2026-11-09'
      ref: huntress-n-able-disclosure
    type: list[string]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.huntress.com/blog/n-able-disables-cloud-services-following-disclosure-of-able2shell-exploit-chains
    gates:
    - dry-run
    - lint
    - critic
    model: hb_google/gemini-3-flash-preview
rationale: Begin by identifying appliances using the software inventory. Use the hostnames
  from that step to populate the scope_hosts parameter in the behavioral queries.
  Focus the lookback on November 8 onward.
references:
- name: "Huntress \u2014 N-able Disables Cloud Services Following Disclosure of Able2Shell\
    \ Exploit Chains"
  url: https://www.huntress.com/blog/n-able-disables-cloud-services-following-disclosure-of-able2shell-exploit-chains
related:
- hunt: general-rmm-abuse-baseline
  reason: This hunt is specifically for the N-central Able2Shell exploits; a broader
    hunt would baseline all RMM tools across the environment.
  relation: out-of-scope-alternative
scenario:
  stages:
  - name: N-central Web Exploitation
    observables:
    - CVE-2026-86218
    - Able2Shell exploit chains
    - N-central Appliance 2026.4.0.31
    - CVE-2026-18556 unauthenticated access
    - HTTP requests to N-central web management interface
    slug: exploit-n-central-rce
    tactic: initial-access
    techniques:
    - T1190
  - name: Appliance Privilege Escalation
    observables:
    - Escalation to root shell on N-central appliance
    - Unauthorized execution of commands as root
    slug: privilege-escalation-to-root
    tactic: privilege-escalation
    techniques:
    - T1068
  - name: Unauthorized Admin Account Creation
    observables:
    - CVE-2026-86206
    - CVE-2026-86207
    - New administrative accounts created in N-central console
    - Unauthorized RMM console access
    slug: unauthorized-account-creation
    tactic: persistence
    techniques:
    - T1136.001
  - name: Downstream Script Spraying
    observables:
    - Anomalous remote access sessions
    - Spraying downstream environments with scripts
    - Unauthorized scripts deployed to managed agents
    - Unusual RMM tool execution
    slug: downstream-rmm-abuse
    tactic: execution
    techniques:
    - T1059
  summary: N-able N-central RMM appliances are vulnerable to multiple exploit chains
    (Able2Shell) and critical CVEs allowing pre-authentication remote code execution
    and privilege escalation to root. Attackers can leverage these flaws to gain administrative
    control over the RMM console and subsequently 'spray' managed downstream environments
    with malicious scripts and tools.
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
---


# N-central RMM Exploitation and Downstream Abuse

This hunt targets the disclosure of critical vulnerabilities in the N-central RMM platform (CVE-2026-86218). It follows a phased approach: first identifying the appliances and checking for evidence of initial exploitation or privilege escalation, then pivoting to examine the broader estate for anomalous script execution (spraying) and unauthorized account creation. This correlation is necessary because N-central breaches typically lead to mass impact across the managed environment.

## identify-n-central-appliances
<!-- Identify N-central RMM appliances -->
Scope the hunt to systems running the N-central software by checking the installed package inventory.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts acting as management appliances. Silence indicates N-central
  is not managed within this inventory scope.
reads:
- device_hostname
- device_uid
- package_name
- package_version
- install_path
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-11-10'
~~~
SELECT device_hostname, device_uid, package_name, package_version, install_path FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%n-central%' OR LOWER(package_name) LIKE '%n-able%'
```

## early-exploitation-parallel
<!-- Examine appliance for exploitation -->
parallel:
- → vulnerability-context
- → appliance-shell-activity
join: → appliance-triage

## vulnerability-context
<!-- Check for unpatched Able2Shell CVEs -->
Confirm if the appliances in scope are flagged for the specific vulnerabilities being hunted.

```sqlite target=endpoint role=enrichment params=(vulnerable_cves=vulnerable_cves)
~~~yaml
expected: Rows indicating that one or more appliances are vulnerable to the exploited
  CVEs.
reads:
- device_uid
- cve_uid
- severity
- title
- status
silence: not_evidence_of_absence
source: hb_vulnerability_finding
verified: dry-run
verified_at: '2026-11-10'
~~~
SELECT device_uid, cve_uid, severity, title, status FROM hb_vulnerability_finding WHERE instr(',' || '{{vulnerable_cves}}' || ',', ',' || cve_uid || ',') > 0
```

## appliance-shell-activity
<!-- Suspicious root shells from RMM services -->
Detect privilege escalation by finding shells or interpreters spawned by the N-central service process as root.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, ncentral_service_names=ncentral_service_names, scope_hosts=scope_hosts)
~~~yaml
expected: A shell or system command run by the N-central service under root or System
  privileges. This is a primary indicator of successful RCE.
reads:
- device_hostname
- process_name
- process_cmd_line
- user_name
- parent_process_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-11-10'
~~~
SELECT device_hostname, process_name, process_cmd_line, user_name, parent_process_name, time FROM hb_process_activity WHERE (LOWER(user_name) = 'root' OR integrity_level = 'System') AND (instr(',' || '{{ncentral_service_names}}' || ',', ',' || LOWER(parent_process_name) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## appliance-triage
<!-- Triage appliance breach -->
```agent target=hunter
cite: required
context:
- identify-n-central-appliances
- vulnerability-context
- appliance-shell-activity
max_iterations: 3
objective: Confirm if an intruder has exploited a vulnerability on the N-central appliance
  to gain high-privilege access.
success_criteria: A per-host verdict of malicious | suspicious | benign, citing process
  or vulnerability rows.
tools:
- endpoint
```

## follow-on-investigation
<!-- Hunt for follow-on abuse -->
parallel:
- → unauthorized-accounts
- → script-prevalence
join: → impact-triage

## unauthorized-accounts
<!-- Unauthorized account creation on appliance -->
Detect new accounts created on the appliance, which may indicate persistence using the bypass vulnerabilities (CVE-2026-86206).

```sqlite target=endpoint role=triage params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: New accounts created on the N-central appliance after the vulnerability
  disclosure window. Silence proves no account-level persistence occurred during the
  window.
reads:
- device_hostname
- user_name
- activity_name
- actor_user_name
- time
silence: evidence_of_absence
source: hb_account_change
verified: dry-run
verified_at: '2026-11-10'
~~~
SELECT device_hostname, user_name, activity_name, actor_user_name, time FROM hb_account_change WHERE activity_id = 1 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## script-prevalence
<!-- Rare script deployment baseline -->
Stack-count script execution from the N-central agent to identify rare 'spraying' behavior that deviates from standard maintenance tasks.

```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: Scripts that appear on only a few hosts. Routine maintenance scripts will
  appear fleet-wide; malicious 'spraying' of a specific payload may stand out as a
  rare value.
prevalence:
  by: device_hostname
  key:
  - script_name
  rare_below: 5
reads:
- script_name
- device_hostname
- time
- process_name
silence: not_evidence_of_absence
source: hb_script_activity
verified: dry-run
verified_at: '2026-11-10'
~~~
SELECT script_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen, MAX(time) AS last_seen FROM hb_script_activity WHERE (LOWER(process_name) LIKE '%ncentral%' OR LOWER(process_name) LIKE '%n-able%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY script_name HAVING host_count <= 5 ORDER BY host_count ASC
```

## impact-triage
<!-- Assess estate-wide impact -->
```agent target=hunter
cite: required
context:
- appliance-triage
- unauthorized-accounts
- script-prevalence
max_iterations: 5
objective: Determine if the N-central exploit was successfully used to persist on
  the appliance or to execute unauthorized code on downstream agents.
success_criteria: A verdict citing the specific appliances compromised and any downstream
  scripts confirmed as malicious.
tools:
- endpoint
```

## route-on-verdict
<!-- Route on verdict -->
if~: "The impact-triage verdict is malicious for at least one host, indicating confirmed exploit aftermath or downstream spraying." (confidence: high, judge=hunter)
then: → isolate-appliance
indeterminate: → analyst-remediation-task
unavailable: → analyst-remediation-task (blind_spot: no-script-logging)
else: → close-out-task

## isolate-appliance
<!-- Isolate compromised appliance -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the identified N-central appliance. Revoke all credentials associated with the RMM console immediately.
```
→ analyst-remediation-task

## analyst-remediation-task
<!-- Analyze sprayed scripts -->
```manual target=analyst
Review the content of scripts identified in the script-prevalence step. Look for encoded payloads, network connections to unknown IPs, or commands that harvest credentials. Apply N-able hotfixes to the appliance before restoring service.
```
→ close-out-task

## close-out-task
<!-- Close out hunt -->
```manual target=analyst
Record all examined hosts. If no compromise was found, verify that N-central appliances are on the latest patched version (2026.3.1.14 or later).
```
→ 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, critic, then reviewed by a person.

Locked pack

Sign up to unlock

Pack contents are available to Huntbase users.