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