SCKit Endpoint Hijacking and Persistence
An intruder has exploited vulnerable ScreenConnect extensions to deploy the SCKit toolkit, which hijacks legitimate management sessions through aggressive scheduled tasks and registry persistence.
Based on research by Huntress 2026-11-13 12 steps · 5 queries T1053.005 T1059.001 T1190 T1547.001
Brief
Why
Now Recent research by Huntress titled "SCKit Worm Installs Rogue ScreenConnect Clients" (https://www.huntress.com/blog/sckit-worm-rogue-screenconnect) describes a new worm designed to hijack remote management tools. An adversary exploits extensions such as RMM+ to install a rogue toolkit that allows them to take control of the victim's management channel.
The
Hypothesis An intruder exploits vulnerable ScreenConnect extensions to deploy the SCKit toolkit. The adversary hijacks legitimate management sessions through aggressive scheduled tasks and registry persistence to maintain control and facilitate lateral movement across the network.
How the Hunt
Flows The first phase scopes the environment by querying the hb_software_inventory surface. This query identifies every host running ScreenConnect, allowing the hunt to focus its resources on potentially vulnerable systems. By narrowing the scope early, we reduce the volume of data processed in subsequent investigative steps. In the second phase, the hunt searches for early infection leads using hb_process_activity and hb_dns_activity. One query looks for process command lines containing known loaders like Stage0Loader.ps1 or specific SCKit-related strings. Simultaneously, another query checks DNS logs for resolutions to known attacker domains like mo7sen.dev or relaytrap.cs. An automated agent then triages these leads to confirm which hosts show signs of an active infection. The third phase focuses on persistence mechanisms via the hb_scheduled_job and hb_registry_activity surfaces. The hunt specifically searches for the "TrapWatch" scheduled task, which the worm uses to reclaim the ScreenConnect relay slot every 10 seconds. It also inspects registry run keys for entries like "RelayTrapLiteAlert" that launch alerting scripts at user logon. These structural changes are difficult for an adversary to hide without losing control of the hijacked session. In the final phase, an agent synthesizes the evidence from the previous stages to provide a definitive verdict for each host. If the agent confirms a hijack, it provides instructions for host isolation and forensic review. An analyst then confirms the verdict and performs manual remediation, such as examining the ProgramData directory and capturing system memory.
What the Hunt Cannot
See This hunt cannot directly observe the initial exploit payload because it is delivered within an HTTP POST body, which standard hb_http_activity telemetry does not capture. We infer the exploit from the subsequent loader execution and network traffic. Additionally, the hunt is blind to any ScreenConnect instances running on hosts that lack an endpoint agent, as we cannot collect the necessary process, task, or registry data from those systems.
In this series
Steps
-
Scope ScreenConnect hosts
Query · scopingIdentify hosts running ScreenConnect that are potentially vulnerable to the RMM+ extension exploit.
reads hb_software_inventorysqlSELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%screenconnect%'What a hit looks like. A list of hosts running ScreenConnect. Silence means the software inventory is either not collected or the product is absent.
-
Loader process activity
Query · detection candidateFind executions of the Stage0Loader or subsequent stagers through command-line analysis.
reads hb_process_activitysqlSELECT device_hostname, process_name, process_cmd_line, user_name, time FROM hb_process_activity WHERE (LOWER(process_cmd_line) LIKE '%eadf.php%' OR LOWER(process_cmd_line) LIKE '%sckit%' OR instr(',' || '{{loader_indicators}}' || ',', ',' || LOWER(process_name) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)What a hit looks like. PowerShell or CMD lines fetching payloads from the mo7sen.dev domain or running the named loader scripts.
-
DNS activity to stager domains
Query · enrichmentCorroborate process leads by checking for host resolutions to the attacker infrastructure.
reads hb_dns_activitysqlSELECT device_hostname, query_hostname, COUNT(*) AS lookups, MIN(time) AS first_seen FROM hb_dns_activity WHERE instr(',' || '{{c2_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY device_hostname, query_hostnameWhat a hit looks like. Any resolution of the named domains. Silence means the domains have rotated or no communication occurred within the lookback.
-
Early stage triage
Agent triageAssess whether the initial infection leads are substantive enough to warrant deep persistence hunting.
-
Persistence via TrapWatch task
Query · baselineFind the high-frequency TrapWatch task that hijacks the ScreenConnect relay slot every 10 seconds.
reads hb_scheduled_jobsqlSELECT device_hostname, job_name, job_cmd_line, job_user_name, time FROM hb_scheduled_job WHERE (LOWER(job_name) = 'trapwatch' OR LOWER(job_cmd_line) LIKE '%trapwatch.ps1%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)What a hit looks like. A task named TrapWatch running as SYSTEM. Prevalence should be low (rare) across the fleet.
-
Persistence via RelayTrap Run key
Query · enrichmentIdentify the RelayTrapLiteAlert run key used to launch the alerting script at user logon.
reads hb_registry_activitysqlSELECT device_hostname, reg_target, reg_value_data, time FROM hb_registry_activity WHERE (LOWER(reg_target) LIKE '%relaytraplitealert%' OR LOWER(reg_value_data) LIKE '%lite-alert.ps1%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)What a hit looks like. Registry set events pointing to Lite-Alert.ps1 in C:\ProgramData\RelayTrap.
-
Follow-on triage
Agent triageSynthesize the early infection findings with the confirmed persistence to reach a final verdict.
-
Route on verdict
DecisionDirect the response based on the agent's synthesized verdict.
-
Isolate host
Response actionStop the worm's local activity and prevent further session hijacking by isolating the host.
-
Analyst review
Analyst taskReview the forensic evidence and plan for remediation.
-
Close out
Analyst taskDocument results and close the hunt.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| RMM+ Extension Authentication Bypass T1190 |
Not visible | The blank access key is sent in the POST body, which is not captured by hb_http_activity. |
| Scripted Loader and Payload Delivery T1059.001 |
Yes | loader-process-activity, c2-dns-activity |
| High-Frequency Scheduled Task Persistence T1053.005 |
Yes | persistence-task-trapwatch |
| Registry Run Key Persistence T1547.001 |
Yes | persistence-registry-activity |
| Technician Session Cookie Theft T1059.001 |
Out of scope | Belongs to another part of the 'SCKit Worm Installs Rogue ScreenConnect Clients and Session Cookie Relays Across Hundreds of Endpoints' series. |
| Shared Toolbox Lateral Propagation T1059.001 |
Out of scope | Belongs to another part of the 'SCKit Worm Installs Rogue ScreenConnect Clients and Session Cookie Relays Across Hundreds of Endpoints' series. |
Blind spots
- Needs an endpoint agent (osquery/sysmon) on every host with ScreenConnect. A host without an agent provides no process, task, or registry telemetry, making it a blind spot where SCKit can persist and spread undetected. It would answer Are there ScreenConnect clients that we cannot observe?.
- Needs hb_http_activity with POST body content. Standard HTTP telemetry does not capture the POST body; exploitation of the RMM+ extension is inferred from the subsequent loader activity rather than directly observed. It would answer Can we see the blank RMMPlus.AccessKey in the POST request?.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
c2_domains | list[domain] | ns.mo7sen.dev, cdn007-digitaldownloads.com, relaytrap.cs, newnewnew.gotdns.org, sc.payproofkit.com, soxnewwork.homedns.org | C2 and staging domains named in the report. |
loader_indicators | list[string] | Stage0Loader.ps1, sckit-loader.ps1, Run-Lateral-Full.bat, sckit-decoder.ps1, TrapWatch.ps1, Lite-Alert.ps1 | Filenames and strings associated with the SCKit infection chain. |
lookback_days | number | 14 | Days of history to examine. |
scope_hosts | list[host] | — | Hosts identified with ScreenConnect; leave empty to run against the whole estate. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
Source
---
analysis: A single detection rule would fire on the TrapWatch task name, but SCKit
rotates its indicators. This hunt uses a phased approach, correlating the presence
of ScreenConnect with loader behaviour and high-frequency persistence, providing
the context an analyst needs to distinguish a malicious hijack from a technician's
legitimate automation.
blind_spots:
- id: missing-endpoint-telemetry
question: Are there ScreenConnect clients that we cannot observe?
requires: an endpoint agent (osquery/sysmon) on every host with ScreenConnect
risk: A host without an agent provides no process, task, or registry telemetry,
making it a blind spot where SCKit can persist and spread undetected.
- id: http-post-body-blindness
question: Can we see the blank RMMPlus.AccessKey in the POST request?
requires: hb_http_activity with POST body content
risk: Standard HTTP telemetry does not capture the POST body; exploitation of the
RMM+ extension is inferred from the subsequent loader activity rather than directly
observed.
stage: rmm-plus-extension-exploitation
coverage:
- blind_spot: http-post-body-blindness
reason: The blank access key is sent in the POST body, which is not captured by
hb_http_activity.
stage: rmm-plus-extension-exploitation
status: not_visible
- stage: scripted-loader-execution
status: covered
steps:
- loader-process-activity
- c2-dns-activity
- stage: trapwatch-task-persistence
status: covered
steps:
- persistence-task-trapwatch
- stage: registry-run-persistence
status: covered
steps:
- persistence-registry-activity
- reason: Belongs to another part of the 'SCKit Worm Installs Rogue ScreenConnect
Clients and Session Cookie Relays Across Hundreds of Endpoints' series.
stage: session-cookie-harvesting
status: out_of_scope
- reason: Belongs to another part of the 'SCKit Worm Installs Rogue ScreenConnect
Clients and Session Cookie Relays Across Hundreds of Endpoints' series.
stage: lateral-toolbox-propagation
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: SCKit is an aggressive worm specifically designed to hijack remote
management sessions. A successful infection compromises the organization's primary
IT management channel, allowing an attacker to push malicious code across the
entire fleet via the technician's workstation.
methodology: model-assisted
trigger: intel-report
hypothesis: An intruder has exploited vulnerable ScreenConnect extensions to deploy
the SCKit toolkit, which hijacks legitimate management sessions through aggressive
scheduled tasks and registry persistence.
labels:
- hunt
- attack.t1053.005
- attack.t1059.001
- attack.t1190
- attack.t1547.001
- credential access
- execution
- initial access
- lateral movement
- persistence
name: SCKit Endpoint Hijacking and Persistence
parameters:
c2_domains:
default:
- ns.mo7sen.dev
- cdn007-digitaldownloads.com
- relaytrap.cs
- newnewnew.gotdns.org
- sc.payproofkit.com
- soxnewwork.homedns.org
description: C2 and staging domains named in the report.
from:
kind: article
observed: '2026-11-12'
ref: huntress-sckit-worm
type: list[domain]
loader_indicators:
default:
- Stage0Loader.ps1
- sckit-loader.ps1
- Run-Lateral-Full.bat
- sckit-decoder.ps1
- TrapWatch.ps1
- Lite-Alert.ps1
description: Filenames and strings associated with the SCKit infection chain.
from:
kind: article
observed: '2026-11-12'
ref: huntress-sckit-worm
type: list[string]
lookback_days:
default: '14'
description: Days of history to examine.
type: number
scope_hosts:
default: []
description: Hosts identified with ScreenConnect; leave empty to run against 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/sckit-worm-rogue-screenconnect
gates:
- dry-run
- lint
- critic
model: hb_google/gemini-3-flash-preview
rationale: Target hosts where ScreenConnect is installed. If the software inventory
is large, prioritize servers and workstations belonging to IT technicians, as they
are the primary conduits for SCKit's lateral propagation.
references:
- name: "Huntress \u2014 SCKit Worm Installs Rogue ScreenConnect Clients"
url: https://www.huntress.com/blog/sckit-worm-rogue-screenconnect
related:
- hunt: sckit-cookie-theft-lateral-propagation
reason: This hunt focuses on the endpoint hijack; the subsequent lateral propagation
through stolen session cookies is covered in the next hunt in this series.
relation: follows
scenario:
stages:
- name: RMM+ Extension Authentication Bypass
observables:
- POST requests to ScreenConnect servers with blank RMMPlus.AccessKey
- RMM+ versions 1.0.31 and 1.0.32
slug: rmm-plus-extension-exploitation
tactic: initial-access
techniques:
- T1190
- name: Scripted Loader and Payload Delivery
observables:
- Stage0Loader.ps1
- Run-Lateral-Full.bat
- sckit-loader.ps1
- ns.mo7sen.dev/EadF.php?p=1
- '%TEMP%\k<guid>.ps1'
- cdn007-digitaldownloads.com
slug: scripted-loader-execution
tactic: execution
techniques:
- T1059.001
- name: High-Frequency Scheduled Task Persistence
observables:
- 'Task name: TrapWatch'
- 'Command: TrapWatch.ps1'
- 'Frequency: Every 10 seconds'
- Runs as SYSTEM
slug: trapwatch-task-persistence
tactic: persistence
techniques:
- T1053.005
- name: Registry Run Key Persistence
observables:
- 'Run key name: RelayTrapLiteAlert'
- 'Command: Lite-Alert.ps1'
- C:\ProgramData\RelayTrap
slug: registry-run-persistence
tactic: persistence
techniques:
- T1547.001
- name: Technician Session Cookie Theft
observables:
- sqlite3.exe reading browser cookie databases
- Panel-Lateral.ps1
- LabConfig.ps1
- ns.mo7sen.dev/EadF.php?p=5
slug: session-cookie-harvesting
tactic: credential-access
techniques:
- T1059.001
- name: Shared Toolbox Lateral Propagation
observables:
- ToolboxRelayUploader.exe using stolen tokens
- AddToToolbox command on ScreenConnect panels
- sc.payproofkit.com
- 185.99.255.28
- 155.94.150.39
slug: lateral-toolbox-propagation
tactic: lateral-movement
techniques:
- T1059.001
summary: Attackers exploit an authentication flaw in the third-party RMM+ extension
for ScreenConnect to push commands to managed endpoints. The resulting SCKit worm
establishes persistence via high-frequency scheduled tasks and registry keys,
hijacks legitimate client connections, and steals technician session cookies to
propagate laterally through the ScreenConnect shared toolbox.
series:
index: 1
slug: sckit-worm-installs-rogue-screenconnect-clients-and-session-cookie-relays-across-hundreds-of-end
title: SCKit Worm Installs Rogue ScreenConnect Clients and Session Cookie Relays
Across Hundreds of Endpoints
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
---
# SCKit Endpoint Hijacking and Persistence
An adversary exploits vulnerable ScreenConnect extensions to deploy the SCKit toolkit, which hijacks legitimate management sessions through aggressive scheduled tasks and registry persistence. This hunt identifies the ScreenConnect estate and then searches for initial scripted loaders and C2 communication. A first agent evaluates these early infection leads. The hunt then examines high-frequency scheduled tasks and registry entries used to suppress legitimate clients. An agent synthesizes the early leads with the persistence evidence to confirm if a host has been successfully hijacked and is being used for further propagation. Finally, an analyst confirms the findings and isolates the affected endpoints.
## scoping-screenconnect
<!-- Scope ScreenConnect hosts -->
Identify hosts running ScreenConnect that are potentially vulnerable to the RMM+ extension exploit.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts running ScreenConnect. Silence means the software inventory
is either not collected or the product is absent.
reads:
- device_hostname
- package_name
- package_version
- vendor_name
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT device_hostname, package_name, package_version, vendor_name FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%screenconnect%'
```
## parallel-early-leads
<!-- Early infection leads -->
parallel:
- → loader-process-activity
- → c2-dns-activity
join: → early-stage-triage
## loader-process-activity
<!-- Loader process activity -->
Find executions of the Stage0Loader or subsequent stagers through command-line analysis.
```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, loader_indicators=loader_indicators, scope_hosts=scope_hosts)
~~~yaml
expected: PowerShell or CMD lines fetching payloads from the mo7sen.dev domain or
running the named loader scripts.
reads:
- device_hostname
- process_name
- process_cmd_line
- user_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT device_hostname, process_name, process_cmd_line, user_name, time FROM hb_process_activity WHERE (LOWER(process_cmd_line) LIKE '%eadf.php%' OR LOWER(process_cmd_line) LIKE '%sckit%' OR instr(',' || '{{loader_indicators}}' || ',', ',' || LOWER(process_name) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```
## c2-dns-activity
<!-- DNS activity to stager domains -->
Corroborate process leads by checking for host resolutions to the attacker infrastructure.
```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, c2_domains=c2_domains, scope_hosts=scope_hosts)
~~~yaml
expected: Any resolution of the named domains. Silence means the domains have rotated
or no communication occurred within the lookback.
reads:
- device_hostname
- query_hostname
- time
silence: not_evidence_of_absence
source: hb_dns_activity
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT device_hostname, query_hostname, COUNT(*) AS lookups, MIN(time) AS first_seen FROM hb_dns_activity WHERE instr(',' || '{{c2_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY device_hostname, query_hostname
```
## early-stage-triage
<!-- Early stage triage -->
```agent target=hunter
cite: required
context:
- loader-process-activity
- c2-dns-activity
max_iterations: 3
objective: Identify hosts where the combination of loader process activity and C2
DNS resolution indicates an active SCKit infection.
success_criteria: A per-host verdict on early-stage infection, citing command lines
and domains.
tools:
- endpoint
```
## parallel-persistence-leads
<!-- Persistence leads -->
parallel:
- → persistence-task-trapwatch
- → persistence-registry-activity
join: → follow-on-triage
## persistence-task-trapwatch
<!-- Persistence via TrapWatch task -->
Find the high-frequency TrapWatch task that hijacks the ScreenConnect relay slot every 10 seconds.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: A task named TrapWatch running as SYSTEM. Prevalence should be low (rare)
across the fleet.
prevalence:
by: device_hostname
key:
- job_name
rare_below: 3
reads:
- device_hostname
- job_name
- job_cmd_line
- job_user_name
- time
silence: evidence_of_absence
source: hb_scheduled_job
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT device_hostname, job_name, job_cmd_line, job_user_name, time FROM hb_scheduled_job WHERE (LOWER(job_name) = 'trapwatch' OR LOWER(job_cmd_line) LIKE '%trapwatch.ps1%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```
## persistence-registry-activity
<!-- Persistence via RelayTrap Run key -->
Identify the RelayTrapLiteAlert run key used to launch the alerting script at user logon.
```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Registry set events pointing to Lite-Alert.ps1 in C:\ProgramData\RelayTrap.
reads:
- device_hostname
- reg_target
- reg_value_data
- time
silence: not_evidence_of_absence
source: hb_registry_activity
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT device_hostname, reg_target, reg_value_data, time FROM hb_registry_activity WHERE (LOWER(reg_target) LIKE '%relaytraplitealert%' OR LOWER(reg_value_data) LIKE '%lite-alert.ps1%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```
## follow-on-triage
<!-- Follow-on triage -->
```agent target=hunter
cite: required
context:
- early-stage-triage
- persistence-task-trapwatch
- persistence-registry-activity
max_iterations: 3
objective: Incorporate the early infection verdict with the persistence mechanisms
found. Determine if the host is actively hijacked by SCKit.
success_criteria: A final verdict of malicious | suspicious | benign per host, citing
the full infection-to-hijack chain.
tools:
- endpoint
```
## route-on-verdict
<!-- Route on verdict -->
if~: "the follow-on-triage verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: missing-endpoint-telemetry)
else: → close-out
## isolate-host
<!-- Isolate host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host from the network immediately. Do not kill the ScreenConnect processes until memory captures are performed, as SCKit may be residing in the legitimate process context.
```
→ analyst-review
## analyst-review
<!-- Analyst review -->
```manual target=analyst
Examine the ProgramData\RelayTrap directory. Review the Task Scheduler for any tasks created in the last 48 hours. Confirm if the host's ScreenConnect client was actively suppressed.
```
→ close-out
## close-out
<!-- Close out -->
```manual target=analyst
Record the total number of infected and isolated hosts. Update the detection rule candidate 'loader-process-activity' with any new filenames discovered.
```
→ 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.