Rogue MDM and RMM Deployment
An attacker uses social engineering to enroll a device into an unauthorized MDM tenant, providing a persistent and privileged path to deploy a rogue RMM tool for remote access.
Based on research by Huntress 2026-10-29 12 steps · 5 queries T1112 T1204.002 T1219 T1566
Brief
Why This Hunt Matters
Legitimate administration tools often provide the path of least resistance for attackers. Recent research by Huntress in their article, Managed for Malice: How Attackers Turn MDM into Remote Access (https://www.huntress.com/blog/attackers-turn-mdm-into-remote-access), describes a campaign where adversaries use social engineering to enroll devices into unauthorized Mobile Device Management (MDM) tenants. Once enrolled, the attacker has a privileged, trusted channel to deploy further tools like ScreenConnect. This hunt identifies the footprints left during enrollment and the subsequent deployment of rogue Remote Monitoring and Management (RMM) software.
Scoping the MDM Environment
The first phase identifies every host currently running MDM software associated with this campaign. The query checks the software inventory for Hexnode or Rippling agents. In many enterprise environments, these platforms are either standardized or entirely absent. Any appearance of these tools on a host where IT did not explicitly deploy them serves as the primary pivot point for the rest of the investigation.
Identifying Early Signals
The hunt simultaneously looks for the social engineering lures and the registry changes that follow enrollment. One query monitors DNS activity for known lookalike domains used to host the fake installers. Another query stacks MDM-related registry keys across the fleet. We look for keys that appear on only a few hosts, indicating an enrollment that deviates from the corporate baseline. Finding a host that both resolved a lure domain and created rare MDM registry keys provides high-confidence evidence of an unauthorized enrollment.
Correlating Execution and C2
The final phase searches for the actual delivery files and the resulting network traffic. We search file activity for specific installer names like edocusign_installer.msi. We also inspect network connections for outbound traffic to known ScreenConnect relays or activity on port 8041. When a host shows the complete sequence—phishing resolution, MDM enrollment, and RMM relay connections—the analyst can confirm a successful intrusion.
Blind Spots and Limitations
This hunt relies on endpoint telemetry. It cannot see activity on BYOD or unmanaged devices that lack the corporate security agent. Furthermore, while we can see the presence of the MDM agent, we cannot see the specific commands an attacker issues within the MDM tenant console without direct access to the provider’s audit logs. This makes rapid triage of the endpoint state essential.
Running the Hunt
This hunt is available as a hunt.md playbook. You can import it into Huntbase or any compatible runtime. The playbook guides an analyst through the scoping, triage, and verdict phases, including an automated isolation step if the complete attack chain is identified on a host.
Steps
-
Identify hosts with target MDM software
Query · scopingScope the investigation to hosts running Hexnode or Rippling software, which are the platforms observed in this campaign.
reads hb_software_inventorysqlSELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%rippling%' OR LOWER(package_name) LIKE '%hexnode%' OR LOWER(vendor_name) LIKE '%rippling%' OR LOWER(vendor_name) LIKE '%hexnode%'What a hit looks like. A list of hostnames with MDM software. Silence means these platforms are not present in the estate.
-
DNS queries for phishing lure domains
Query · triageMatch host activity against the lookalike Teams and DocuSign domains used to deliver the MDM installers.
reads hb_dns_activitysqlSELECT device_hostname, process_name, query_hostname, time FROM hb_dns_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{phishing_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Any resolution of these domains by a scoped host. Silence may mean the attacker used different domains or the logs have expired.
-
Stack-count rare MDM enrollment keys
Query · baselineFind rare MDM enrollment keys that stand out from the normal management baseline of the fleet.
reads hb_registry_activitysqlSELECT reg_key_path, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_registry_activity WHERE (LOWER(reg_key_path) LIKE '%rippling%' OR LOWER(reg_key_path) LIKE '%hexnode%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY reg_key_path HAVING host_count <= 3What a hit looks like. Rippling or Hexnode keys appearing on only a few hosts, which is suspicious in an estate that does not use them for primary management.
-
Assess early exposure and enrollment
Agent triageAnalyze whether the inventory, DNS lookups, and rare registry keys suggest an unauthorized MDM enrollment.
-
Identify lure files by keyword
Query · enrichmentFind host evidence of the specific installer files named in the research using the lure_keywords list.
reads hb_file_activitysqlSELECT device_hostname, file_name, file_path, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{lure_keywords}}' || ',', ',' || LOWER(file_name) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. File create or open events for the phishing lure installers. Any row is a high-confidence match for the delivery stage.
-
Detect ScreenConnect relay traffic
Query · detection candidateIdentify outbound connections to the reported ScreenConnect relays or the common relay port 8041.
reads hb_network_connectionsqlSELECT device_hostname, process_name, dst_endpoint_hostname, dst_endpoint_port, time FROM hb_network_connection WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (dst_endpoint_port = 8041 OR instr(',' || '{{rmm_relays}}' || ',', ',' || LOWER(dst_endpoint_hostname) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Outbound traffic identifying the RMM command-and-control stage. Silence means the relays have rotated or the tool is dormant.
-
Weigh the complete attack chain
Agent triageDecide whether the combined evidence from early enrollment and follow-on RMM activity indicates a confirmed intrusion.
-
Route on final verdict
DecisionDirect the hunt based on the agent's confidence in the maliciousness of the chain.
-
Isolate endpoint
Response actionSever the attacker's RMM and MDM connection by isolating the compromised host.
-
Analyst verification and review
Analyst taskReview the agent's findings and confirm whether the MDM enrollment was truly unauthorized.
-
Close out hunt
Analyst taskRecord the results and update the baseline for future hunts.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| Phishing via Business-Themed Lures T1566 |
Yes | dns-phishing-lookups, lure-file-hits |
| Malicious MDM Agent Installation T1204.002 |
Yes | identify-mdm-software, lure-file-hits |
| MDM Enrollment and Persistence T1112 |
Yes | mdm-registry-stack |
| ScreenConnect Deployment via MDM T1219 |
Yes | rmm-relay-connections |
Blind spots
- Needs endpoint agent coverage for all devices. A device without our endpoint agent will not report registry, file, or network activity, leaving the enrollment invisible until it touches the network fabric. It would answer whether the MDM agent was installed on an unmanaged or BYOD device.
- Needs API access to the MDM provider's audit logs. We can see the presence of the agent but cannot see the attacker's console activity (e.g., commands issued) without native provider logs. It would answer which specific MDM tenant and attacker account were used to manage the device.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine. |
lure_keywords | list[string] | edocusign_installer.msi, enroll14.php | Specific file or resource names associated with the lures. |
phishing_domains | list[domain] | webdocusign.viewportal.es, teams-microsoftcom5d41402abc4b2a76b9719d911017c592.kiratham.com | Lure domains identified in the research. |
rmm_relays | list[domain] | relay.bobdthjau.com, relay.pronconetydesire.online | Attacker-controlled ScreenConnect relays. |
scope_hosts | list[host] | — | Hostnames to focus the follow-on investigation; leave empty to hunt the whole estate. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
| Network telemetry | network | network |
Source
---
analysis: This is a hunt because detection rules for legitimate software like Rippling
or ScreenConnect often trigger excessive noise. This hunt correlates the social
engineering lure (DNS), the enrollment (rare registry keys), and the C2 activity
(relay traffic) into a single phased attack chain triage.
blind_spots:
- id: no-agent-on-endpoint
question: whether the MDM agent was installed on an unmanaged or BYOD device
requires: endpoint agent coverage for all devices
risk: A device without our endpoint agent will not report registry, file, or network
activity, leaving the enrollment invisible until it touches the network fabric.
stage: mdm-agent-installation
- id: mdm-tenant-logs
question: which specific MDM tenant and attacker account were used to manage the
device
requires: API access to the MDM provider's audit logs
risk: We can see the presence of the agent but cannot see the attacker's console
activity (e.g., commands issued) without native provider logs.
coverage:
- stage: phishing-initial-access
status: covered
steps:
- dns-phishing-lookups
- lure-file-hits
- stage: mdm-agent-installation
status: covered
steps:
- identify-mdm-software
- lure-file-hits
- stage: mdm-enrollment-persistence
status: covered
steps:
- mdm-registry-stack
- stage: rogue-rmm-deployment
status: covered
steps:
- rmm-relay-connections
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: promote-to-detection
justification: Legitimate MDM platforms provide a trusted, privileged path for software
deployment that bypasses most endpoint security alerts. A negative result confirming
no unauthorized enrollments is a high-value security assurance.
methodology: model-assisted
trigger: intel-report
hypothesis: An attacker uses social engineering to enroll a device into an unauthorized
MDM tenant, providing a persistent and privileged path to deploy a rogue RMM tool
for remote access.
labels:
- hunt
- attack.t1566
- attack.t1204.002
- attack.t1112
- attack.t1219
- command and control
- execution
- initial access
- persistence
name: Rogue MDM and RMM Deployment
parameters:
lookback_days:
default: '14'
description: Days of history to examine.
type: number
lure_keywords:
default:
- edocusign_installer.msi
- enroll14.php
description: Specific file or resource names associated with the lures.
from:
kind: article
observed: '2026-10-28'
ref: huntress-mdm-malice
type: list[string]
phishing_domains:
default:
- webdocusign.viewportal.es
- teams-microsoftcom5d41402abc4b2a76b9719d911017c592.kiratham.com
description: Lure domains identified in the research.
from:
kind: article
observed: '2026-10-28'
ref: huntress-mdm-malice
type: list[domain]
rmm_relays:
default:
- relay.bobdthjau.com
- relay.pronconetydesire.online
description: Attacker-controlled ScreenConnect relays.
from:
kind: article
observed: '2026-10-28'
ref: huntress-mdm-malice
type: list[domain]
scope_hosts:
default: []
description: Hostnames to focus the follow-on investigation; leave empty to hunt
the whole estate.
type: list[host]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://www.huntress.com/blog/attackers-turn-mdm-into-remote-access
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: Start by identifying all hosts with Rippling or Hexnode agents. In many
environments, these will be absent, making any hit suspicious. Focus on endpoints
where users might be lured by business proposals or meeting invites.
references:
- name: "Huntress \u2014 Attackers Turn MDM into Remote Access"
url: https://www.huntress.com/blog/attackers-turn-mdm-into-remote-access
related:
- hunt: unauthorized-rmm-detection
reason: A broader hunt for RMM tools that does not focus on the MDM delivery vector.
relation: sibling
scenario:
stages:
- name: Phishing via Business-Themed Lures
observables:
- webdocusign.viewportal.es
- teams-microsoftcom5d41402abc4b2a76b9719d911017c592.kiratham.com
- index.php
- enroll14.php
slug: phishing-initial-access
tactic: initial-access
techniques:
- T1566
- name: Malicious MDM Agent Installation
observables:
- eD0cuSign_Installer.msi
- C:\Windows\System32\config\systemprofile\AppData\Local\mdm\{GUID}.msi
- C:\Rippling\daemon.exe
- Hexnode Gateway
slug: mdm-agent-installation
tactic: execution
techniques:
- T1204.002
- name: MDM Enrollment and Persistence
observables:
- Rippling enrollment registry key
slug: mdm-enrollment-persistence
tactic: persistence
techniques:
- T1112
- name: ScreenConnect Deployment via MDM
observables:
- ScreenConnect
- relay.bobdthjau.com
- relay.pronconetydesire.online
- port 8041
slug: rogue-rmm-deployment
tactic: command-and-control
techniques:
- T1219
summary: Attackers leverage business-themed phishing lures to trick users into installing
or enrolling in rogue MDM platforms like Hexnode and Rippling. Once enrolled,
the attackers use the MDM's administrative privileges to deploy ScreenConnect
RMM agents, providing persistent remote access to the compromised endpoints.
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
network:
category: network
name: Network telemetry
telemetry:
- network
tlp: clear
type: investigation
---
# Rogue MDM and RMM Deployment
This hunt examines the abuse of legitimate Mobile Device Management (MDM) platforms like Hexnode and Rippling. Attackers use business-themed phishing lures, such as fake DocuSign installers or Teams meeting invitations, to facilitate enrollment. Once enrolled, the MDM platform is used to deploy ScreenConnect agents that connect to attacker-controlled relays. The hunt follows a phased flow: first identifying MDM software presence and suspicious enrollment registry keys, then searching for the phishing lure execution and outbound RMM network traffic on non-standard ports. This correlation across identity, registry, and network telemetry distinguishes malicious use of these tools from legitimate administration.
## identify-mdm-software
<!-- Identify hosts with target MDM software -->
Scope the investigation to hosts running Hexnode or Rippling software, which are the platforms observed in this campaign.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames with MDM software. Silence means these platforms are
not present in the estate.
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-29'
~~~
SELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%rippling%' OR LOWER(package_name) LIKE '%hexnode%' OR LOWER(vendor_name) LIKE '%rippling%' OR LOWER(vendor_name) LIKE '%hexnode%'
```
## early-stage-parallel
<!-- Parallel hunt for early-stage signals -->
parallel:
- → dns-phishing-lookups
- → mdm-registry-stack
join: → read-early-signals
## dns-phishing-lookups
<!-- DNS queries for phishing lure domains -->
Match host activity against the lookalike Teams and DocuSign domains used to deliver the MDM installers.
```sqlite target=endpoint role=triage params=(lookback_days=lookback_days, scope_hosts=scope_hosts, phishing_domains=phishing_domains)
~~~yaml
expected: Any resolution of these domains by a scoped host. Silence may mean the attacker
used different domains or the logs have expired.
reads:
- device_hostname
- process_name
- query_hostname
- time
silence: not_evidence_of_absence
source: hb_dns_activity
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT device_hostname, process_name, query_hostname, time FROM hb_dns_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{phishing_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days')
```
## mdm-registry-stack
<!-- Stack-count rare MDM enrollment keys -->
Find rare MDM enrollment keys that stand out from the normal management baseline of the fleet.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Rippling or Hexnode keys appearing on only a few hosts, which is suspicious
in an estate that does not use them for primary management.
prevalence:
by: device_hostname
key:
- reg_key_path
rare_below: 3
reads:
- reg_key_path
- device_hostname
- time
silence: not_evidence_of_absence
source: hb_registry_activity
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT reg_key_path, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_registry_activity WHERE (LOWER(reg_key_path) LIKE '%rippling%' OR LOWER(reg_key_path) LIKE '%hexnode%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY reg_key_path HAVING host_count <= 3
```
## read-early-signals
<!-- Assess early exposure and enrollment -->
```agent target=hunter
cite: required
context:
- identify-mdm-software
- dns-phishing-lookups
- mdm-registry-stack
max_iterations: 3
objective: Identify hosts that resolved phishing domains and subsequently showed rare
MDM-related registry modifications.
success_criteria: A per-host verdict of suspicious if the DNS and registry signals
align.
tools:
- endpoint
- network
```
## follow-on-parallel
<!-- Parallel hunt for execution and persistence -->
parallel:
- → lure-file-hits
- → rmm-relay-connections
join: → final-attack-chain-triage
## lure-file-hits
<!-- Identify lure files by keyword -->
Find host evidence of the specific installer files named in the research using the lure_keywords list.
```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts, lure_keywords=lure_keywords)
~~~yaml
expected: File create or open events for the phishing lure installers. Any row is
a high-confidence match for the delivery stage.
reads:
- device_hostname
- file_name
- file_path
- time
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT device_hostname, file_name, file_path, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{lure_keywords}}' || ',', ',' || LOWER(file_name) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days')
```
## rmm-relay-connections
<!-- Detect ScreenConnect relay traffic -->
Identify outbound connections to the reported ScreenConnect relays or the common relay port 8041.
```sqlite target=network role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts, rmm_relays=rmm_relays)
~~~yaml
expected: Outbound traffic identifying the RMM command-and-control stage. Silence
means the relays have rotated or the tool is dormant.
reads:
- device_hostname
- process_name
- dst_endpoint_hostname
- dst_endpoint_port
- time
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-10-29'
~~~
SELECT device_hostname, process_name, dst_endpoint_hostname, dst_endpoint_port, time FROM hb_network_connection WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (dst_endpoint_port = 8041 OR instr(',' || '{{rmm_relays}}' || ',', ',' || LOWER(dst_endpoint_hostname) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## final-attack-chain-triage
<!-- Weigh the complete attack chain -->
```agent target=hunter
cite: required
context:
- read-early-signals
- lure-file-hits
- rmm-relay-connections
max_iterations: 5
objective: Determine if any host shows the complete sequence from phishing lure execution
to rogue MDM enrollment and RMM C2 communication.
success_criteria: A final verdict of malicious | suspicious | benign per host.
tools:
- endpoint
- network
```
## route-on-verdict
<!-- Route on final verdict -->
if~: "the final-attack-chain-triage verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-verification
unavailable: → analyst-verification (blind_spot: no-agent-on-endpoint)
else: → analyst-verification
## isolate-host
<!-- Isolate endpoint -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host immediately. After isolation, remove the unauthorized MDM management profile and uninstall any rogue ScreenConnect agents.
```
→ analyst-verification
## analyst-verification
<!-- Analyst verification and review -->
```manual target=analyst
Verify the cited rows from the final triage. Check internal IT documentation to see if Rippling or Hexnode was recently adopted or used by a specific department. If not authorized, proceed with incident response.
```
→ close-out
## close-out
<!-- Close out hunt -->
```manual target=analyst
Log the examined hosts. If any were found to be legitimately running these MDM tools, update the authorized software inventory to prevent future false positives.
```
→ 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.