NetSupport Manager — Abused Remote-Access Tool
client32.exe + client32.ini running from %ProgramData%/%AppData% instead of Program Files. Defensive hunt & harden pack — no malicious code.Executive Summary
NetSupport Manager is a legitimate commercial remote-administration product that attackers routinely repurpose as a RAT ("NetSupport RAT"). Because the binary is signed and commercial, it sails past naïve allow-lists — which is exactly why multiple activity clusters (Scarlet Goldfinch, SocGholish-adjacent operators, and various malvertising crews) deliver it. Delivery is via fake browser-update lures, ClickFix paste-and-run, malvertising/SEO, and phishing emails carrying LNK or PDF files, often through a first-stage loader that drops the NetSupport client into a user-writable directory.
The single most reliable detection is a path anomaly: under normal use, NetSupport runs from \Program Files\; when abused it executes from %ProgramData% or %AppData%. The client (client32.exe) reads its config (client32.ini) for a "gateway"/control address, persists via Run keys or scheduled tasks, and beacons over HTTP/HTTPS to blend with normal traffic. Hands-on operators then use it for follow-on activity — credential theft, lateral movement, and ransomware staging.
client32.exe running outside Program Files — is the decisive signal. If NetSupport is not a sanctioned tool in your environment, any execution is suspicious. If it is sanctioned, allow-list its managed install path and alert on every other location. Treat a hit as a live hands-on RAT.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Red Canary — NetSupport Manager (Threat Detection Report) | Install-path detection (ProgramData anomaly), binary metadata, naming conventions; delivery clusters | yes |
| 1 · Vendor research | Picus — How NetSupport RAT Abuses a Legit Admin Tool | client32.exe/client32.ini, persistence (Run/task), HTTP/HTTPS C2, gateway config | yes |
| 2 · Vendor | Darktrace / SOC Prime — NetSupport ClickFix delivery | Fake-update & ClickFix delivery; persistent remote control | yes |
| 2 · Vendor | Google/Mandiant — Fake software update abuses NetSupport | Drive-by → loader → NetSupport; redirect chains | partial |
Decisions: payload-anchored detection (the path anomaly is delivery-agnostic, so it covers every cluster that drops NetSupport); cross-references the Scarlet Goldfinch and SocGholish packs for the upstream lures; behavior over atomic IOCs since C2/gateway addresses rotate.
Hunt Brief & Attack Chain
Working hypothesis: A loader (from a fake update / ClickFix / malvertising / LNK) drops the NetSupport client into %ProgramData%/%AppData%, writes a client32.ini with a control gateway, persists, and beacons — giving an operator hands-on access.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Delivery | Fake update / ClickFix / malvertising / LNK-PDF phishing | ProcessRollup2; proxy | N1 (see sibling packs) |
| 2 · Drop | NetSupport binaries written to %ProgramData%/%AppData% | file write | Q2; N2 |
| 3 · Execute | client32.exe runs outside Program Files; reads client32.ini | ProcessRollup2 | Q1 |
| 4 · Persist | Run key / scheduled task / Startup → the client | registry / task events | Q3; N3 |
| 5 · C2 | HTTP/HTTPS beacon to the gateway/control server | NetworkConnectIP4 | Q5; N4 |
| 6 · Hands-on | Operator recon / lateral / staging | ProcessRollup2 | Q6 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows user endpoints | Process lineage + image path (ProcessRollup2) | Critical | Low — standard sensor |
| RAT install paths | File writes to %ProgramData%/%AppData%; binary metadata | High | Low — reliable |
| Persistence | Run keys / scheduled tasks / Startup | High | Low — covered |
| C2 egress | NetworkConnectIP4; proxy | Medium | Medium — HTTP/HTTPS blends in |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Behavior | client32.exe running from %ProgramData%/%AppData%/Temp | high | detect | RAT install-path anomaly — flagship |
| File | client32.ini / client32u.ini (gateway/control address) | high | hunt | NetSupport config with C2 gateway |
| File | pcicapi.dll · nskbfltr.inf · HTCTL32.DLL · PCICHEK.DLL | medium | hunt | NetSupport component DLLs (in user path) |
| Persistence | Run key / task → %ProgramData%/%AppData% client32.exe | medium | hunt | RAT auto-start |
| Behavior | client32.exe outbound HTTP/HTTPS to a non-corporate host | medium | hunt | NetSupport C2 beacon |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1189 / T1566 — Drive-by / phishing | Fake update, ClickFix, malvertising, LNK/PDF | N1 (sibling packs) |
| Command & Control | T1219 — Remote Access Software | NetSupport client32.exe used for remote control | Q1, Q5 |
| Persistence | T1547.001 / T1053.005 — Run key / Startup / task | Auto-start of the client | Q3; N3 |
| Defense Evasion | T1036.005 — Masquerading (legit signed tool) | Signed RMM run from a user-writable path | Q1, Q4 |
| Discovery / Lateral (hands-on) | T1087 / T1021 — recon & lateral movement | Operator activity via the RAT | Q6 |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Delivery (loader) | Proxy / EID 4688 | Fake-update ZIP / ClickFix paste-and-run / LNK execution preceding the NetSupport drop | Sweep host; see Scarlet Goldfinch / SocGholish packs |
| N2 · NetSupport binary inventory | Software/binary inventory | client32.exe / NetSupport component DLLs present outside \Program Files\ | Investigate; uninstall if unsanctioned |
| N3 · Persistence | Registry Run keys / Task Scheduler | Auto-start entries pointing at NetSupport in %ProgramData%/%AppData% | Remove; isolate host |
| N4 · Gateway C2 | Proxy / firewall | Beacon to the gateway/control address in client32.ini (often non-corporate HTTP/HTTPS) | Block; identify the source host |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Env edit: if NetSupport is a sanctioned tool, allow-list its managed \Program Files\ install path in Q1.Looks for: NetSupport client binaries executing from %ProgramData%/%AppData%/Temp. Accomplishes: the decisive RAT signal — delivery-agnostic. FP: sanctioned NetSupport in its managed path (allow-list).
// HUNT: NetSupport RAT install-path anomaly // MITRE: T1219, T1036.005 | CONF: high FP: low COST: low // TUNING: if NetSupport is sanctioned, allow-list its managed \Program Files\ path #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(client32|client32u|pcicfgui|runscript32)\.exe$/i | ImageFileName=/\\(ProgramData|Users\\[^\\]+\\AppData|Temp)\\/i | table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData], limit=200)
Looks for: NetSupport files (client32.ini, pcicapi.dll, HTCTL32.DLL, etc.) written to %ProgramData%/%AppData%. Accomplishes: catches the drop before execution.
// HUNT: NetSupport component files dropped to a user-writable path // MITRE: T1219 | CONF: high FP: low-med COST: low // FP NOTES: legit NetSupport installs to Program Files, not ProgramData/AppData #event_simpleName=/PeFileWritten|NewExecutableWritten/ | TargetFileName=/\\(client32u?\.ini|pcicapi\.dll|HTCTL32\.DLL|PCICHEK\.DLL|nskbfltr\.inf|client32\.exe)$/i | TargetFileName=/\\(ProgramData|AppData|Temp)\\/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName], limit=200)
Looks for: auto-start entries referencing a NetSupport binary in a user-writable path. Accomplishes: catches RAT persistence. FP: sanctioned managed-path NetSupport (allow-list).
// HUNT: NetSupport RAT persistence // MITRE: T1547.001, T1053.005 | CONF: med-high FP: low-med COST: low // TUNING: correlate to Q1/Q2; allow-list sanctioned managed-path NetSupport #event_simpleName=/AsepValueUpdate|ScheduledTaskRegistered/ | (RegStringValue=/\\(ProgramData|AppData)\\.+client32|client32\.exe/i or CommandLine=/client32\.exe/i) | table([@timestamp, ComputerName, UserName, RegObjectName, RegStringValue, CommandLine], limit=200)
Looks for: the NetSupport original-filename metadata (client32) on a process whose on-disk name differs (renamed to evade). Accomplishes: catches masquerading. FP: depends on PE-metadata telemetry availability.
// HUNT: NetSupport binary renamed (original-filename vs on-disk name mismatch) // MITRE: T1036.005 | CONF: medium FP: medium COST: low // REQUIRES: PE original-filename / internal-name telemetry (field availability varies) // TUNING: confirm OriginalFilename is actually populated in your tenant first -- where the field is empty this returns nothing and the clean result is meaningless. If you license NetSupport, allow-list the sanctioned deployment path and signer; site-branded rollouts rename client32.exe legitimately. #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | OriginalFilename=/client32/i | FileName!=/^client32(u)?\.exe$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, OriginalFilename, SHA256HashData], limit=200)
Looks for: client32.exe (from a user-writable path) making outbound connections. Accomplishes: surfaces gateway C2. FP: sanctioned NetSupport — correlate with Q1.
// HUNT: NetSupport gateway C2 beacon // MITRE: T1219, T1071.001 | CONF: medium FP: medium COST: medium // TUNING: correlate to Q1; exclude sanctioned NetSupport gateways #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^client32(u)?\.exe$/i | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: shells / recon / admin tooling parented by client32.exe. Accomplishes: catches operator hands-on-keyboard activity through the RAT. FP: low for an unsanctioned-path client.
// HUNT: Hands-on activity through NetSupport RAT // MITRE: T1219, T1059 | CONF: high FP: low COST: low #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^client32(u)?\.exe$/i | FileName=/^(cmd|powershell|pwsh|net|net1|nltest|whoami|systeminfo|reg|wmic|rundll32|mshta)\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| NetSupport — client32 outside Program Files | Image *\client32.exe from *\ProgramData\*/*\AppData\*/*\Temp\* | Sanctioned NetSupport in its managed path | Endpoint Security → Custom IOA → Process Creation, Detect+Block |
| NetSupport — hands-on shell from client32 | Parent *\client32.exe; Child cmd/powershell/net/nltest.exe | Sanctioned remote-admin sessions (rare) | Custom IOA → Process Creation |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for detection and inventory. NetSupport is signed legitimate software — never block by hash; key on the path anomaly + persistence + gateway.
client32.exe # NetSupport client (the RAT process) client32u.exe # NetSupport client (UI variant) client32.ini # config — contains the GatewayAddress / control server (C2) HTCTL32.DLL # NetSupport control DLL PCICHEK.DLL # NetSupport component PCICL32.DLL # NetSupport client DLL pcicapi.dll # NetSupport API DLL nskbfltr.inf # keyboard filter driver inf # Sweep for ANY of these outside \Program Files\ (esp. %ProgramData% / %AppData%)
client32.exe running from %ProgramData%/%AppData%/Temp (not Program Files) — flagship NetSupport component DLLs / client32.ini dropped to a user-writable path Run key / scheduled task / Startup pointing at a user-path client32.exe client32.exe outbound HTTP/HTTPS to a non-corporate gateway (client32.ini GatewayAddress) client32.exe spawning cmd/powershell/net/nltest (operator hands-on) NetSupport PE metadata (OriginalFilename client32) on a renamed binary (masquerade)
# Pull the C2 from any recovered client32.ini:
# [GatewayConfig] -> GatewayAddress=<host:port> (the control/C2 server)
# SecondaryGateway / Port entries
# PowerShell triage on a suspect host:
Get-ChildItem -Path C:\ProgramData,$env:APPDATA -Recurse -Filter client32.ini -ErrorAction SilentlyContinue |
ForEach-Object { Write-Host $_.FullName; Select-String -Path $_.FullName -Pattern 'Gateway|Address|Port' }
# WDAC/AppLocker: deny NetSupport (client32.exe + component DLLs) anywhere except a # single sanctioned \Program Files\ path (or deny entirely if NetSupport is not used). # Block outbound to unknown HTTP/HTTPS gateways; enforce egress proxy. # Upstream lures (see sibling packs): change .js handler; block mshta; ASR; web filtering. # RMM governance: maintain an allow-list of sanctioned remote-admin tools; alert on all others.
Hardening — Tiered & Deployable
The whole abuse hinges on running a signed RMM from the wrong place — deny unsanctioned RMM and the rest follows.
- WDAC/AppLocker: allow NetSupport only from a single sanctioned path (or deny entirely) — M1038. Directly blocks Q1. If NetSupport isn't used, block
client32.exe+ component DLLs outright. - RMM governance: allow-list sanctioned remote-admin tools; alert on all others — M1042.
- Block the upstream lures — M1042. Change the
.jshandler, blockmshta, enable script ASR (see Scarlet Goldfinch / SocGholish packs). - Egress proxy; block unknown HTTP/HTTPS gateways — M1037. Disrupts NetSupport C2.
- Inventory + alert on NetSupport component DLLs /
client32.iniin user paths — M1042. Feeds Q2/N2. - Monitor Run keys / scheduled tasks pointing at user-writable binaries — M1018. Feeds Q3/N3.
- Web filtering; managed browser-update channels only — M1021. Cuts fake-update delivery.
- Application allowlisting enterprise-wide — M1038. Unsigned loaders & misplaced signed tools both denied.
- Least privilege; restrict who can install/run remote-admin tooling — M1026.
- User training on fake-update / "support tool" lures — M1017.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host; preserve client32.ini (extract the gateway/C2) and the binaries | SOC L2 | Containment timestamp; Q1 event; client32.ini |
| Triage | Pull the delivery → drop → execute tree; identify the gateway; check for hands-on activity (Q6) and lateral movement | SOC L2 | Process tree; gateway address |
| Eradicate | Remove the client + persistence; block the gateway; reset creds used on the host | IR | Removal log; C2 block; cred reset |
| Recover | Rebuild if the operator had hands-on time; verify no lateral foothold; restore from clean state | IR + IT | Rebuild ticket; lateral review |
| Harden | Deny unsanctioned NetSupport via WDAC/AppLocker; promote Q1/Q6 IOAs; block upstream lures | Detection Eng | Control status; IOA enabled |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1219 / T1036.005 | client32.exe install-path anomaly | Q1 | IOA-1 | Good |
| T1219 | NetSupport component drop | Q2 | — | Good |
| T1547.001 / T1053.005 | RAT persistence | Q3 | — | Good |
| T1036.005 | Renamed / masquerading binary | Q4 | — | Partial needs PE-metadata telemetry |
| T1219 / T1071.001 | Gateway C2 beacon | Q5 | — | Partial correlate to Q1 |
| T1219 / T1059 | Hands-on through the RAT | Q6 | IOA-2 | Good |
| T1189 (delivery) | Fake-update / ClickFix lure | — | — | GAP see sibling packs / proxy (N1) |
Validation gates: (1) confirm process + file telemetry fleet-wide; (2) determine whether NetSupport is sanctioned and capture its managed path (allow-list for Q1/Q3); (3) lab-test a benign binary run from %ProgramData% (Q1 logic) and a benign auto-start from a user path (Q3); (4) promote Q1/Q6 to Custom IOA Detect+Block; keep Q2–Q5 correlated.
Hunt Summary Ticket
TITLE: Hunt — NetSupport Manager RAT abuse
SEVERITY: High (hands-on RAT; ransomware/lateral precursor)
SCOPE: Windows user endpoints; sanctioned-RMM environments need allow-list
HYPOTHESIS: Loader (fake update / ClickFix / malvertising / LNK) drops NetSupport to
%ProgramData%/%AppData% -> client32.exe runs outside Program Files ->
persists -> gateway C2 -> operator hands-on.
QUERIES RUN: Q1 client32 outside Program Files (IOA) | Q2 component drop | Q3 persistence |
Q4 renamed binary | Q5 gateway C2 | Q6 hands-on via client32 (IOA)
+ Native N1-N4 (delivery, inventory, persistence, gateway C2)
DO FIRST: Q1 (path anomaly), Q6 (hands-on) — isolate on any hit
FINDINGS: <pending analyst execution>
GAPS: Delivery lure (see sibling packs); renamed-binary needs PE-metadata
ACTIONS: Deny unsanctioned NetSupport via WDAC/AppLocker; block gateway egress; promote Q1/Q6
OWNER: HuntPack
VERSION: v0.3 - 2026-06-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Red Canary — NetSupport Manager (Threat Detection Report) | Install-path anomaly, metadata, delivery clusters |
| 1 | Picus — How NetSupport RAT Abuses a Legit Admin Tool | client32 components, persistence, gateway C2 |
| 2 | SOC Prime — NetSupport ClickFix delivery · Darktrace — NetSupport RAT | ClickFix delivery; legit-tool abuse |
| 2 | Google/Mandiant — Fake update abuses NetSupport | Drive-by → loader → NetSupport |
HuntPack v0.3 · NetSupport Manager RAT abuse · Generated 2026-06-12 · Defensive use only. NetSupport is legitimate signed software — never block by hash; the install-path anomaly + persistence + gateway are the durable signals. If NetSupport is sanctioned, allow-list its managed path before promoting Q1.