← All hunts high TLP:CLEAR Part 1 of 3

EtherRAT and TukTuk Initial Infection and Discovery

An intruder has gained initial access via a trojanized MSI installer, established persistence using a Node.js-based EtherRAT, and is currently performing system discovery or sideloading TukTuk payloads.

Based on research by The DFIR Report 2026-09-24 12 steps · 5 queries T1059.003 T1082 T1105 T1204.002 T1547.001 T1574.002

Brief

Why now

The DFIR Report recently detailed an intrusion where EtherRAT and TukTuk C2 activity preceded a ransomware deployment. Their report, Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware, highlights how an attacker uses trojanized software to gain a foothold. The actor often hides the malware inside an MSI installer masquerading as a legitimate system utility like RAMMap. We built this hunt to find these specific execution chains in telemetry before the final ransomware phase begins.

How the hunt flows

The hunt begins by scoping endpoints for suspicious MSI execution. The first query looks for msiexec.exe spawning command shells or specific scripts like mvnvmuyj.cmd. This step identifies the initial delivery of the malicious payload where the MSI installer executes embedded logic to drop follow-on components.

Next, the hunt moves into a parallel phase to find persistence and deployment markers. One query searches for the creation of portable Node.js runtimes and configuration files in user AppData or Temp folders. Simultaneously, another query identifies rare registry Run keys that point to these profile-path binaries. This correlation helps distinguish legitimate Node.js usage from the EtherRAT installation, as the intruder typically places the runtime in a randomized folder under the user's local profile.

If the early infection markers exist, the hunt investigates post-compromise activity. It searches for automated reconnaissance scripts that enumerate security products or domain settings, often using PowerShell to check for specific antivirus products. Finally, the hunt looks for legitimate binaries, such as Greenshot or SyncTrayzor, loading rare modules from user-writable paths to identify TukTuk sideloading. The adversary uses these trusted processes to host their C2 communication modules.

What the hunt cannot see

This hunt relies on module load visibility to detect sideloading. If an endpoint does not provide hb_module_activity telemetry, the sideloaded TukTuk payload remains hidden from those specific steps. Additionally, adversaries may split discovery commands across multiple script blocks. If your telemetry does not support script block reassembly, simple keyword matches might fail to catch fragmented reconnaissance activity. The hunt also assumes the intruder follows the reported MSI-to-Node.js path; if they use a different initial access vector, the scoping step will show no results.

In this series

Steps

  1. MSI execution spawning shell scripts

    Query · scoping

    Identify potential initial access by finding msiexec.exe spawning cmd.exe or specific malicious script files named in the report.

    reads hb_process_activitysql
    SELECT device_hostname, process_name, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE LOWER(parent_process_name) LIKE '%msiexec.exe' AND (instr(',' || '{{msi_scripts}}' || ',', ',' || LOWER(process_name) || ',') > 0 OR instr(LOWER(process_cmd_line), 'mvnvmuyj') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. A hit shows msiexec launching a shell script from a temporary directory; silence suggests the specific MSI delivery vector was not used.

  2. Node.js runtime file creation

    Query · enrichment

    Detect the creation of the portable Node.js runtime and associated configuration files, pivoting on hosts from the initial MSI execution.

    reads hb_file_activitysql
    SELECT device_hostname, file_path, file_name, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (instr(',' || '{{node_binaries}}' || ',', ',' || LOWER(file_name) || ',') > 0 OR instr(',' || '{{node_configs}}' || ',', ',' || LOWER(file_name) || ',') > 0) AND (LOWER(file_path) LIKE '%\appdata\%' OR LOWER(file_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Creation of node.exe or .cfg files in user profiles. These files often appear in AppData subfolders with randomized names.

  3. Rare Node.js Run-key persistence

    Query · baseline

    Identify the EtherRAT persistence mechanism which points a Run key at a profile-path Node.js binary, using prevalence to filter out normal fleet activity.

    reads hb_registry_activitysql
    SELECT reg_value_data, COUNT(DISTINCT device_hostname) AS hosts, MIN(time) AS first_seen FROM hb_registry_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(reg_target) LIKE '%\currentversion\run%' AND instr(LOWER(reg_value_data), 'node.exe') > 0 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY reg_value_data HAVING hosts <= 5 ORDER BY hosts ASC

    What a hit looks like. A rare Run key executing node.exe from an AppData path, seen on very few hosts across the estate.

  4. Weigh early infection evidence

    Agent triage

    Combine the MSI scoping results with file drops and registry persistence to confirm the host is infected with EtherRAT.

  5. Automated discovery and script execution

    Query · triage

    Identify PowerShell-based discovery of AV products, domain membership, and system settings using both named scripts and behavioral keywords.

    reads hb_script_activitysql
    SELECT device_hostname, script_name, script_content, time FROM hb_script_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (instr(',' || '{{discovery_scripts}}' || ',', ',' || LOWER(script_name) || ',') > 0 OR instr(LOWER(script_content), 'antivirusproduct') > 0 OR instr(LOWER(script_content), 'installeduiculture') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Script blocks performing enumeration of security products or AD domain configuration, often running shortly after persistence is established.

  6. Legitimate binaries loading rare modules

    Query · detection candidate

    Detect potential DLL sideloading for TukTuk deployment by identifying legitimate binaries loading modules from user-writable paths.

    reads hb_module_activitysql
    SELECT device_hostname, process_name, module_name, module_path, time FROM hb_module_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{sideload_binaries}}' || ',', ',' || LOWER(process_name) || ',') > 0 AND (LOWER(module_path) LIKE '%\appdata\%' OR LOWER(module_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. A legitimate process like Greenshot.exe loading a DLL from a user path that is unique across the fleet.

  7. Complete intrusion chain analysis

    Agent triage

    Correlate the early infection results with the follow-on discovery and sideloading markers to provide a definitive verdict.

  8. Route based on intrusion verdict

    Decision

    Route the host to containment or analyst review based on the final agent verdict.

  9. Isolate compromised host

    Response action

    Stop the intruder from progressing to lateral movement or data exfiltration.

  10. Analyst remediation and collection

    Analyst task

    Perform manual review of the clusters and collect malicious binaries for further analysis.

  11. Hunt close-out

    Analyst task

    Finalize the hunt and record tuning notes.

Coverage

Scenario coverage

StageCoveredHow, or why not
Trojanized MSI installer
T1204.002
Yes scoping-msi-execution
EtherRAT execution via Node.js
T1059.003 · T1105
Yes node-runtime-drops
Persistence via Registry Run key
T1547.001
Yes registry-persistence-rare
Internal reconnaissance and discovery
T1082 · T1518.001 · T1087.002 · T1018
Yes discovery-activity
TukTuk deployment via DLL sideloading
T1574.002
Yes sideload-detection
Blockchain and SaaS C2
T1102.001 · T1572
Out of scope Belongs to another part of the 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware' series.
Credential Access via LSASS dumping
T1003.001 · T1558.003
Out of scope Belongs to another part of the 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware' series.
Lateral movement via RMM and NetExec
T1219 · T1021.001 · T1021.002
Out of scope Belongs to another part of the 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware' series.
Data exfiltration via Rclone
T1567.002
Out of scope Belongs to another part of the 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware' series.
Ransomware deployment via GPO
T1486 · T1489 · T1053.005 · T1484.001
Out of scope Belongs to another part of the 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware' series.

Blind spots

  • Needs hb_module_activity coverage on all hosts. A host without an agent contributes no module load telemetry, allowing sideloading to go unobserved. It would answer whether the sideloaded DLL is present on hosts without endpoint agent coverage.
  • Needs hb_script_activity with block reassembly. Adversaries may split strings across script blocks, preventing simple keyword matches in a single script row. It would answer whether discovery commands were split across multiple blocks.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
discovery_scriptslist[path]discovery.ps1, recon.ps1Names of scripts used for automated reconnaissance.
lookback_daysnumber14Days of history to examine.
msi_scriptslist[path]mvnvmuyj.cmdScript filenames spawned from msiexec observed in the campaign.
node_binarieslist[path]node.exe, node-v18.20.5-win-x64.zipFilenames associated with the malicious Node.js runtime deployment.
node_configslist[path]a7pnj975bl.cfgConfiguration filenames for the EtherRAT payload.
scope_hostslist[host]—Optional list of hosts to narrow the hunt, typically populated from the results of the initial scoping step.
sideload_binarieslist[path]greenshot.exe, synctrayzor.exe, docfx.exe, cake.exeLegitimate binaries commonly abused for DLL sideloading in this campaign.

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 detection rule would only catch a specific indicator like the AppResolver
  registry key. This hunt correlates MSI execution with rare module loads and automated
  discovery scripts across multiple surfaces, providing the context required to confirm
  a sophisticated intrusion.
blind_spots:
- id: module-load-visibility
  question: whether the sideloaded DLL is present on hosts without endpoint agent
    coverage
  requires: hb_module_activity coverage on all hosts
  risk: A host without an agent contributes no module load telemetry, allowing sideloading
    to go unobserved.
  stage: secondary-payload-sideloading
- id: script-block-fragmentation
  question: whether discovery commands were split across multiple blocks
  requires: hb_script_activity with block reassembly
  risk: Adversaries may split strings across script blocks, preventing simple keyword
    matches in a single script row.
  stage: internal-reconnaissance-and-discovery
coverage:
- stage: initial-access-trojanized-msi
  status: covered
  steps:
  - scoping-msi-execution
- stage: etherrat-execution-node-js
  status: covered
  steps:
  - node-runtime-drops
- stage: persistence-registry-run-key
  status: covered
  steps:
  - registry-persistence-rare
- stage: internal-reconnaissance-and-discovery
  status: covered
  steps:
  - discovery-activity
- stage: secondary-payload-sideloading
  status: covered
  steps:
  - sideload-detection
- reason: 'Belongs to another part of the ''Flash Alert: EtherRat and TukTuk C2 End
    in The Gentleman Ransomware'' series.'
  stage: blockchain-and-saas-c2
  status: out_of_scope
- reason: 'Belongs to another part of the ''Flash Alert: EtherRat and TukTuk C2 End
    in The Gentleman Ransomware'' series.'
  stage: credential-access-lsass-dumping
  status: out_of_scope
- reason: 'Belongs to another part of the ''Flash Alert: EtherRat and TukTuk C2 End
    in The Gentleman Ransomware'' series.'
  stage: lateral-movement-rmm-and-netexec
  status: out_of_scope
- reason: 'Belongs to another part of the ''Flash Alert: EtherRat and TukTuk C2 End
    in The Gentleman Ransomware'' series.'
  stage: data-exfiltration-rclone
  status: out_of_scope
- reason: 'Belongs to another part of the ''Flash Alert: EtherRat and TukTuk C2 End
    in The Gentleman Ransomware'' series.'
  stage: impact-gpo-ransomware
  status: out_of_scope
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: This hunt identifies the early infection chain of a ransomware actor.
    By stopping EtherRAT and TukTuk before they escalate to credential theft and lateral
    movement, the business avoids the high cost of a domain-wide ransomware event.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An intruder has gained initial access via a trojanized MSI installer,
  established persistence using a Node.js-based EtherRAT, and is currently performing
  system discovery or sideloading TukTuk payloads.
labels:
- hunt
- attack.t1204.002
- attack.t1059.003
- attack.t1105
- attack.t1547.001
- attack.t1082
- attack.t1574.002
name: EtherRAT and TukTuk Initial Infection and Discovery
parameters:
  discovery_scripts:
    default:
    - discovery.ps1
    - recon.ps1
    description: Names of scripts used for automated reconnaissance.
    from:
      kind: article
      observed: '2026-05-11'
      ref: dfir-report-etherrat
    type: list[path]
  lookback_days:
    default: '14'
    description: Days of history to examine.
    type: number
  msi_scripts:
    default:
    - mvnvmuyj.cmd
    description: Script filenames spawned from msiexec observed in the campaign.
    from:
      kind: article
      observed: '2026-05-11'
      ref: dfir-report-etherrat
    type: list[path]
  node_binaries:
    default:
    - node.exe
    - node-v18.20.5-win-x64.zip
    description: Filenames associated with the malicious Node.js runtime deployment.
    from:
      kind: article
      observed: '2026-05-11'
      ref: dfir-report-etherrat
    type: list[path]
  node_configs:
    default:
    - a7pnj975bl.cfg
    description: Configuration filenames for the EtherRAT payload.
    from:
      kind: article
      observed: '2026-05-11'
      ref: dfir-report-etherrat
    type: list[path]
  scope_hosts:
    default: []
    description: Optional list of hosts to narrow the hunt, typically populated from
      the results of the initial scoping step.
    type: list[host]
  sideload_binaries:
    default:
    - greenshot.exe
    - synctrayzor.exe
    - docfx.exe
    - cake.exe
    description: Legitimate binaries commonly abused for DLL sideloading in this campaign.
    from:
      kind: article
      observed: '2026-05-11'
      ref: dfir-report-etherrat
    type: list[path]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://thedfirreport.com/2026/05/11/flash-alert-etherrat-and-tuktuk-c2-end-in-the-gentleman-ransomware/
    gates:
    - dry-run
    - lint
    model: hb_google/gemini-3-flash-preview
rationale: Focus on endpoints where MSI installers are common, such as administrator
  workstations or servers where RAMMap is legitimately used. If Node.js is discovered
  in a user profile on any host, widen the search to the entire fleet by clearing
  the scope_hosts parameter.
references:
- name: "The DFIR Report \u2014 Flash Alert: EtherRat and TukTuk C2 End in The Gentleman\
    \ Ransomware"
  url: https://thedfirreport.com/2026/05/11/flash-alert-etherrat-and-tuktuk-c2-end-in-the-gentleman-ransomware/
related:
- hunt: blockchain-and-saas-c2
  reason: This hunt identifies local execution; follow-on C2 traffic via Ethereum
    and SaaS platforms is handled in a subsequent hunt.
  relation: follows
scenario:
  stages:
  - name: Trojanized MSI installer
    observables:
    - msiexec.exe /V
    - MVnVmUYj.cmd
    - RAMMap utility masquerade
    slug: initial-access-trojanized-msi
    tactic: initial-access
    techniques:
    - T1204.002
  - name: EtherRAT execution via Node.js
    observables:
    - curl -sLo "C:\Users\REDACTED\AppData\Local\Temp\9gY0LJMyXW.zip" "https://nodejs.org/dist/v18.20.5/node-v18.20.5-win-x64.zip"
    - node-v18.20.5-win-x64.zip
    - node.exe
    - A7Pnj975bl.cfg
    slug: etherrat-execution-node-js
    tactic: execution
    techniques:
    - T1059.003
    - T1105
  - name: Persistence via Registry Run key
    observables:
    - reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v AppResolver /d
      "conhost --headless "C:\Users\REDACTED\AppData\Local\P2RsupmqXnmx\gksVMg\node.exe"
      "C:\Users\REDACTED\AppData\Local\P2RsupmqXnmx\A7Pnj975bl.cfg"" /f
    - AppResolver
    slug: persistence-registry-run-key
    tactic: persistence
    techniques:
    - T1547.001
  - name: Internal reconnaissance and discovery
    observables:
    - powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "[System.Globalization.CultureInfo]::InstalledUICulture.Name"
    - powershell -Command "try { (Get-CimInstance -Namespace root/SecurityCenter2
      -ClassName AntivirusProduct -EA Stop).displayName -join ', ' } catch { 'none'
      }"
    - net group "Domain Admins" /domain
    - nltest /domain_trusts /all_trusts
    - netscan.exe
    slug: internal-reconnaissance-and-discovery
    tactic: discovery
    techniques:
    - T1082
    - T1518.001
    - T1087.002
    - T1018
  - name: TukTuk deployment via DLL sideloading
    observables:
    - Greenshot.exe
    - SyncTrayzor.exe
    - docfx.exe
    - Cake.exe
    slug: secondary-payload-sideloading
    tactic: defense-evasion
    techniques:
    - T1574.002
  - name: Blockchain and SaaS C2
    observables:
    - 1rpc.io
    - goldsky.arweave.net
    - trycloudflare.com
    - supabase.co
    - 1rpc.io
    - goldsky.arweave.net
    slug: blockchain-and-saas-c2
    tactic: command-and-control
    techniques:
    - T1102.001
    - T1572
  - name: Credential Access via LSASS dumping
    observables:
    - 'rundll32.exe C:\windows\System32\comsvcs.dll, #+0000^24'
    - Kerberoasting
    - NTDS dumping
    slug: credential-access-lsass-dumping
    tactic: credential-access
    techniques:
    - T1003.001
    - T1558.003
  - name: Lateral movement via RMM and NetExec
    observables:
    - GoToResolveProcessChecker.exe
    - nxc smb REDACTED_IP -u REDACTED_USER -p REDACTED_PASSWORD --ntds
    - nxc
    - winrm
    slug: lateral-movement-rmm-and-netexec
    tactic: lateral-movement
    techniques:
    - T1219
    - T1021.001
    - T1021.002
  - name: Data exfiltration via Rclone
    observables:
    - rclone
    - Wasabi cloud storage
    slug: data-exfiltration-rclone
    tactic: exfiltration
    techniques:
    - T1567.002
  - name: Ransomware deployment via GPO
    observables:
    - The Gentlemen ransomware
    - Microsoft Defender disabled
    - GPO execution via SYSVOL/NETLOGON
    - vssadmin.exe delete shadows
    slug: impact-gpo-ransomware
    tactic: impact
    techniques:
    - T1486
    - T1489
    - T1053.005
    - T1484.001
  summary: A threat actor used a trojanized MSI installer to deploy EtherRAT, leveraging
    Ethereum blockchain and TryCloudflare for resilient C2 before deploying the TukTuk
    framework via DLL sideloading. The intrusion progressed through extensive AD discovery
    and lateral movement using NetExec and GoTo Resolve, concluding with data exfiltration
    via Rclone and domain-wide deployment of The Gentleman ransomware via GPO and
    scheduled tasks.
series:
  index: 1
  slug: flash-alert-etherrat-and-tuktuk-c2-end-in-the-gentleman-ransomware
  title: 'Flash Alert: EtherRat and TukTuk C2 End in The Gentleman Ransomware'
  total: 3
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
---


# EtherRAT and TukTuk Initial Infection and Discovery

This hunt identifies the earliest stages of an EtherRAT intrusion, starting from the execution of a malicious MSI masquerading as RAMMap. It follows the chain from the deployment of a portable Node.js runtime and registry-based persistence to follow-on reconnaissance using PowerShell and DLL sideloading in legitimate binaries like Greenshot. By correlating these distinct behavioral markers across process, file, registry, and module surfaces, the hunt identifies the breach before the actor moves to credential theft or domain-wide encryption.

## scoping-msi-execution
<!-- MSI execution spawning shell scripts -->
Identify potential initial access by finding msiexec.exe spawning cmd.exe or specific malicious script files named in the report.

```sqlite target=endpoint role=scoping params=(lookback_days=lookback_days, msi_scripts=msi_scripts)
~~~yaml
expected: A hit shows msiexec launching a shell script from a temporary directory;
  silence suggests the specific MSI delivery vector was not used.
reads:
- device_hostname
- process_name
- process_cmd_line
- parent_process_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-24'
~~~
SELECT device_hostname, process_name, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE LOWER(parent_process_name) LIKE '%msiexec.exe' AND (instr(',' || '{{msi_scripts}}' || ',', ',' || LOWER(process_name) || ',') > 0 OR instr(LOWER(process_cmd_line), 'mvnvmuyj') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## early-stage-parallel
<!-- Examine infection markers -->
parallel:
- → node-runtime-drops
- → registry-persistence-rare
join: → agent-early-triage

## node-runtime-drops
<!-- Node.js runtime file creation -->
Detect the creation of the portable Node.js runtime and associated configuration files, pivoting on hosts from the initial MSI execution.

```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts, node_binaries=node_binaries, node_configs=node_configs)
~~~yaml
expected: Creation of node.exe or .cfg files in user profiles. These files often appear
  in AppData subfolders with randomized names.
reads:
- device_hostname
- file_path
- file_name
- time
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-09-24'
~~~
SELECT device_hostname, file_path, file_name, time FROM hb_file_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (instr(',' || '{{node_binaries}}' || ',', ',' || LOWER(file_name) || ',') > 0 OR instr(',' || '{{node_configs}}' || ',', ',' || LOWER(file_name) || ',') > 0) AND (LOWER(file_path) LIKE '%\appdata\%' OR LOWER(file_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## registry-persistence-rare
<!-- Rare Node.js Run-key persistence -->
Identify the EtherRAT persistence mechanism which points a Run key at a profile-path Node.js binary, using prevalence to filter out normal fleet activity.

```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 rare Run key executing node.exe from an AppData path, seen on very few
  hosts across the estate.
prevalence:
  by: device_hostname
  key:
  - reg_value_data
  rare_below: 5
reads:
- device_hostname
- reg_target
- reg_value_data
- time
silence: not_evidence_of_absence
source: hb_registry_activity
verified: dry-run
verified_at: '2026-09-24'
~~~
SELECT reg_value_data, COUNT(DISTINCT device_hostname) AS hosts, MIN(time) AS first_seen FROM hb_registry_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(reg_target) LIKE '%\currentversion\run%' AND instr(LOWER(reg_value_data), 'node.exe') > 0 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY reg_value_data HAVING hosts <= 5 ORDER BY hosts ASC
```

## agent-early-triage
<!-- Weigh early infection evidence -->
```agent target=hunter
cite: required
context:
- scoping-msi-execution
- node-runtime-drops
- registry-persistence-rare
max_iterations: 3
objective: Determine if the host shows a complete chain of MSI execution, Node.js
  deployment, and registry persistence.
success_criteria: A verdict of malicious | suspicious | benign citing specific process
  paths and registry data.
tools:
- endpoint
```

## follow-on-parallel
<!-- Examine post-infection behavior -->
parallel:
- → discovery-activity
- → sideload-detection
join: → agent-intrusion-analysis

## discovery-activity
<!-- Automated discovery and script execution -->
Identify PowerShell-based discovery of AV products, domain membership, and system settings using both named scripts and behavioral keywords.

```sqlite target=endpoint role=triage params=(lookback_days=lookback_days, scope_hosts=scope_hosts, discovery_scripts=discovery_scripts)
~~~yaml
expected: Script blocks performing enumeration of security products or AD domain configuration,
  often running shortly after persistence is established.
reads:
- device_hostname
- script_name
- script_content
- time
silence: not_evidence_of_absence
source: hb_script_activity
verified: dry-run
verified_at: '2026-09-24'
~~~
SELECT device_hostname, script_name, script_content, time FROM hb_script_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (instr(',' || '{{discovery_scripts}}' || ',', ',' || LOWER(script_name) || ',') > 0 OR instr(LOWER(script_content), 'antivirusproduct') > 0 OR instr(LOWER(script_content), 'installeduiculture') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## sideload-detection
<!-- Legitimate binaries loading rare modules -->
Detect potential DLL sideloading for TukTuk deployment by identifying legitimate binaries loading modules from user-writable paths.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts, sideload_binaries=sideload_binaries)
~~~yaml
expected: A legitimate process like Greenshot.exe loading a DLL from a user path that
  is unique across the fleet.
reads:
- device_hostname
- process_name
- module_name
- module_path
- time
silence: not_evidence_of_absence
source: hb_module_activity
verified: dry-run
verified_at: '2026-09-24'
~~~
SELECT device_hostname, process_name, module_name, module_path, time FROM hb_module_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND instr(',' || '{{sideload_binaries}}' || ',', ',' || LOWER(process_name) || ',') > 0 AND (LOWER(module_path) LIKE '%\appdata\%' OR LOWER(module_path) LIKE '%\temp\%') AND time >= datetime('now', '-{{lookback_days}} days')
```

## agent-intrusion-analysis
<!-- Complete intrusion chain analysis -->
```agent target=hunter
cite: required
context:
- agent-early-triage
- discovery-activity
- sideload-detection
max_iterations: 5
objective: Determine if the host is compromised based on the full chain of observed
  EtherRAT and TukTuk indicators, including persistence and discovery behavior.
success_criteria: A final verdict citing the transition from persistence to reconnaissance
  or sideloading per host.
tools:
- endpoint
```

## decision-route
<!-- Route based on intrusion verdict -->
if~: "the intrusion analysis verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → containment-action
indeterminate: → analyst-remediation
unavailable: → analyst-remediation (blind_spot: module-load-visibility)
else: → close-out-task

## containment-action
<!-- Isolate compromised host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host from the network and collect memory for TukTuk and EtherRAT forensics.
```
→ analyst-remediation

## analyst-remediation
<!-- Analyst remediation and collection -->
```manual target=analyst
Review the binaries identified in the sideloading step. Search for the portable Node.js runtime and its configuration blobs in AppData subdirectories. Confirm if any GPO-based ransomware deployment was initiated.
```
→ close-out-task

## close-out-task
<!-- Hunt close-out -->
```manual target=analyst
Document findings, update indicators for rotated filenames, and promote the registry Run key query to a standing detection rule.
```
→ 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.