2CLoader — Loader Delivering Vidar, Remus & XWorm
SecurityHealthService.exeExecutive Summary
2CLoader is a credential-theft delivery mechanism, not an end-goal payload. Its entire feature set exists to get Vidar, Remus, and XWorm onto a real victim machine undetected, then get out of the way. The loader stores its configuration and payload inside a Windows PE resource, decrypts that resource only after an eleven-factor environment score and a hard-fail VM/debugger/sandbox check both pass, then executes the decrypted payload via in-memory manual mapping (LoadPE), CLR hosting of a .NET assembly, or process hollowing into a suspended dllhost.exe. It persists under the literal name SecurityHealthService.exe, reused unchanged across the Run key, the RunOnce key, the Startup folder, a logon-triggered scheduled task, the Windows Load registry value, or a logon script, and it reports home over HTTP POST to aware-cr1[.]com/api/beacon with XOR-encrypted JSON status messages.
The highest-value defensive angle is not the evasion logic itself: racing a sandbox-detection scoring model is a contest defenders lose on a long enough timeline, and 2CLoader's indirect-syscall and anti-analysis layers leave no telemetry in standard Falcon event streams. What does leave telemetry, and does so on every single sample regardless of which anti-analysis branch it takes, is the fixed artifact set reporting has already confirmed: the string SecurityHealthService.exe appearing outside its real %SystemRoot%\System32\ location, and a dllhost.exe process missing the COM surrogate's mandatory /Processid: argument. Both are cheap, low-noise, high-fidelity hunts that do not depend on catching the loader's encryption chain or its syscall evasion.
SecurityHealthService.exe-outside-System32 pattern and the argument-less dllhost.exe pattern first (§8 Q1, Q2, Q4, Q6). These catch 2CLoader regardless of which infostealer or RAT it is staging to deliver that week, and they do not depend on the current, perishable C2 domain or sample hash set.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 1 · Primary | Zscaler ThreatLabz blog (2026-09-30) | Full technical teardown: PE-resource config structure, rolling-XOR/AES-GCM decryption chain, Hell's Gate indirect syscalls, anti-VM/anti-debug scoring, opt_flag/persistence_option tables, inline hook targets, C2 protocol, 20 SHA-256 hashes, C2 URL, payload URL | Yes |
| Tier 2 · Corroborating | Cyber Security News (2026-10-01) | Independently republishes (per "shared with CSN" attribution to Zscaler) the full IOC table, 20 hashes and 2 network indicators, plus the same technical summary | Yes |
| Tier 2 · Corroborating | GBHackers (2026-10-01) | Independently republishes (per "shared with GBhackers" attribution to Zscaler) the technical narrative and the 2 network IOCs; does not reproduce the hash list | Partial |
| Tier 3 · Vendor Advisory | Broadcom / Symantec Protection Bulletin (2026-10-02) | Independent (non-Zscaler-sourced) vendor confirmation that the malware family exists and behaves as described; lists Symantec/Carbon Black detection signature names; publishes no atomic IOCs of its own | Partial |
Decisions and provenance notes
Every technical detail in this pack traces to the Zscaler ThreatLabz primary research post. Cyber Security News and GBHackers both state the report was "shared with" them by Zscaler, meaning they independently fetched and republished Zscaler's own findings rather than performing independent reverse engineering. Strictly speaking, the loader's internal mechanics (config structure, encryption chain, hook targets) and its atomic IOCs have one originating source, not two. This pack ships the 20 SHA-256 hashes and both network indicators at prevent/high-or-critical severity on the practical basis that: (1) two independently-operated outlets each fetched and republished the identical indicator values from Zscaler, reducing transcription-error risk, and (2) Broadcom/Symantec, a fully independent vendor with its own telemetry, confirms the malware family's existence and general behavior (though it publishes no atomic values of its own to cross-check against). This nuance is called out here rather than glossed over; treat the atomic IOCs as single-origin, multiply-confirmed, not as independently discovered by three separate research teams.
All four fetched sources were saved verbatim to 2CLoader-Hunt-sources/ before this pack was built. No fetched source contained instructions directed at the research agent; all four were treated as data.
Hunt Brief & Attack Chain
Attack chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
| 1. Initial delivery (vector unspecified in public reporting) executes the 2CLoader binary | ProcessRollup2 | Generic unusual-new-binary-execution baselining; not campaign-specific, out of scope for this pack's CQL |
| 2. Anti-analysis gate: hard-fail VM check, score-based environment check, anti-debug, user-activity wait | None observable pre-decryption; loader exits silently on failure | Coverage gap — see §15 |
| 3. Payload decrypted in memory from PE resource (rolling XOR → second XOR layer → AES-256-GCM → optional Xpress Huffman) | None (no file write) | Coverage gap — recoverable only via Zscaler's offline decrypt_payload.py against an acquired sample |
| 4. Hell's Gate indirect syscalls resolve Nt* APIs from a freshly-mapped ntdll.dll copy | No raw syscall field in Falcon CQL | Coverage gap — mitigated by Falcon sensor ML/behavioral prevention (M1040), not a hunt query |
| 5. Payload executed via LoadPE (in-process mapping, command line spoofed to svchost.exe), RunPE (suspended dllhost.exe hollowed via NtCreateSection/SEC_IMAGE), or CLR hosting of a .NET assembly | ProcessRollup2, ImageHash | Q5 (svchost spoof), Q6 (dllhost no-arg), Q10 (CLR hosting anomaly) |
| 6. Inline trampoline hooks (opt_flag 0x400) rewrite return values of InternetReadFile/WinHttpReadData, RegQueryValueEx, GetUserName, GetComputerName, GetVolumeInformation, GetEnvironmentVariable | None exposed via Falcon API-hook telemetry | Coverage gap — downstream spoofed identifiers are not independently huntable from endpoint telemetry |
| 7. Persistence established under the name SecurityHealthService.exe (Run, RunOnce, Startup folder, logon-triggered scheduled task, Load value) or UserInitMprLogonScript | AsepValueUpdate, RegGenericValueUpdate, ScheduledTaskRegistered | Q1, Q2, Q3 |
| 8. C2 registration/beacon over HTTP POST to aware-cr1[.]com/api/beacon, XOR-encrypted JSON body | DnsRequest, NetworkConnectIP4 | Q7 (atomic), Q8 (behavioral beaconing) |
| 9. Vidar, Remus, or XWorm payload executes and begins credential theft / remote access | Out of this pack's scope — payload-specific detections live in their own packs | Pivot to Vidar / Remus / XWorm hunt packs if any query above fires |
Hunt hypotheses
| # | Hypothesis | MITRE | Falcon Telemetry | Expected FP | Confidence |
|---|---|---|---|---|---|
| H1 | Persistence appears as a Run/RunOnce/Load registry write or logon-triggered scheduled task literally named SecurityHealthService.exe pointing outside System32 | T1547.001, T1053.005 | AsepValueUpdate, RegGenericValueUpdate, ScheduledTaskRegistered | Near zero | High |
| H2 | LoadPE execution spoofs the process command line to svchost.exe while the on-disk image is not svchost.exe | T1620, T1036 | ProcessRollup2 | Internal tools that rewrite their own display command line for cosmetic reasons | Medium-High |
| H3 | RunPE hollows a suspended dllhost.exe without the mandatory COM-surrogate /Processid: switch | T1055.012 | ProcessRollup2 | Rare legacy COM scripting that invokes dllhost.exe directly | High |
| H4 | CLR-hosting execution loads mscoree.dll/clr.dll into a process that is not a typical .NET host | T1620, T1055 | ImageHash, ProcessRollup2 | Legitimate in-house .NET line-of-business tools, .NET backup/agent software | Medium |
| H5 | Known C2 domain or payload-staging IP appears in DNS or network telemetry | T1071.001 | DnsRequest, NetworkConnectIP4 | None (atomic indicator); perishable as infrastructure rotates | High |
| H6 | Regardless of rotation, the HTTP POST beacon to /api/beacon follows a regular-interval cadence distinguishable from normal traffic | T1071.001, T1132.002 | NetworkConnectIP4 (beaconing pattern) | SaaS sync/telemetry clients with similar polling cadence | Medium |
| H7 | Known 2CLoader sample hashes match process execution telemetry | Indicator match | ProcessRollup2 | None (exact hash); perishable as new builds get new hashes | High |
| H8 | Rarely-used persistence vectors (Load value, UserInitMprLogonScript) show unexpected modification regardless of value name | T1547.001, T1037.001 | AsepValueUpdate, RegGenericValueUpdate | Near zero; a small number of enterprise logon-script deployment tools use UserInitMprLogonScript legitimately | High |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| URL | https://aware-cr1[.]com/api/beacon | High | detect | 2CLoader C2 registration/beacon endpoint | 2027-04-03 |
| Domain | aware-cr1[.]com | High | detect | 2CLoader C2 host | 2027-04-03 |
| URL | http://62.60.226[.]185/t0907.exe | High | detect | 2CLoader in-the-wild payload-staging URL | 2027-04-03 |
| IPv4 | 62.60.226[.]185 | High | detect | 2CLoader payload-staging host | 2027-04-03 |
| SHA-256 | 5edcaa75a28e5cd700bf7643b275fe5d28649aa41a0711f391ec1fca795a4e8a | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 0017821181723261801e24abb9d33c739f382889d46dbf46d320c87ac62e5ca6 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 06185d74edbdc06f99095e96f74aa2e49a1cda2d02a294c11a9ac35a0231075e | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 066d83b98a2081e0bb075c94376aebc9b0fd6499025cab1762d83bbb4d7576c6 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 0a2ef2c360cf6e3e3e5d844ca03fecc31924ba0e8c3ecd8aefa778cae10fb19e | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 0d2abd7d872196abd951f1d7ed6406486499e5d5acc04f28fcd4f45b1851711e | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 0e4d6c385922938ecc1962dbc7e5950b086459b172b70a945414cffe4395aa27 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 0ee6df8a309443c86c0bba8b376f39531513d3451b46bebd4b79bb9d5bf8dcb1 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 1337ed6fe9c6205b569670a40eab42b51ba69c5c1724d61474e8595acd90ecfb | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 1447ed0893b9095f671e2f35a2a0127890040b5459534813b0f83c3e1fffa0bf | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 1b195181a2603b0b2608d49134af8c170225c2e06873c1fe5cd537db9018807f | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 246717653bc2ae2e09036bac56c9d79940c652972a73f4c6aa9b925c28cce095 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 2ad9b5e1c9952e95cfa55a4255e952962b6208ae1ca610caf1c7c2383be7e74b | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 2c786f7009cc5e1fba5471a88b23b34dce6e1578ee9f664ec62bf48227ba384b | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 2d43d592630ad1e012da63ef7279f95dd4a8e94964e12ca2f996051875574fa6 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 30cf47caf9700a74a8ea4a728b8b7c88cb1f8e22261b4ac01575b112c1e224ca | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 3286ff477ccd888479b96d0ffb2bd53962862db7267a4bd1c8d8f8c22fec63d4 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 331fd58d489e9fb888a5e4193d0e36f6ff29063808c59a164d98e26835054972 | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 45d46e7064ba4b4cb578659f73ee354ad26cf2cc1e7f59bd3d15028e1e46a38b | High | detect | 2CLoader sample | 2027-04-03 |
| SHA-256 | 4c16f5ebd5c633b7a793ffa2cd96daddc5a503d82ed4fbe636109d89164ec02b | High | detect | 2CLoader sample | 2027-04-03 |
| String | SecurityHealthService.exe | High | hunt | Reused persistence value/task name across all persistence vectors; the real Windows binary of this name lives only in %SystemRoot%\System32\ | 2027-01-03 |
| String | %TEMP%\aw_[32-hex-ID].lk | Medium | hunt | Single-instance lock-file pattern (opt_flag 0x100) | 2027-01-03 |
| String | Win64.Loader.2CLoader | High | enrich | Zscaler detection/threat name for sandbox and multilayer platform correlation | 2026-11-03 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows process execution | ProcessRollup2 / SyntheticProcessRollup2 | High | Low — broad Falcon sensor coverage |
| Windows registry (autostart persistence) | AsepValueUpdate / RegGenericValueUpdate | High | Low |
| Windows scheduled tasks | ScheduledTaskRegistered | High | Low |
| Module load (CLR hosting of .NET payloads) | ImageHash | Medium | Low-Medium |
| Network / DNS (C2 beacon) | NetworkConnectIP4, DnsRequest | High | Medium — Falcon network telemetry has no HTTP URI-path visibility, so /api/beacon path-level hunting needs proxy or DNS-layer logs, not CQL alone |
| Kernel syscall layer (Hell's Gate indirect syscalls) | No raw syscall field exposed via Falcon CQL | Medium | High — genuine coverage gap; rely on Falcon ML/behavioral prevention (M1040) rather than a hunt query |
| File system (temp lock file, dropped payload) | No generically-verified "any file create" CQL field in this skill's reference set | Low | Medium — use native Sysmon EventID 11 instead (§7) |
ATT&CK Mapping
| Tactic | Technique | Name | Observed Behavior |
|---|---|---|---|
| Defense Evasion | T1027 | Obfuscated Files or Information | PE-resource payload encrypted with rolling XOR, a second XOR layer, then AES-256-GCM; key derived from the SHA-256 of the loader's own .text section |
| Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | Multi-stage runtime decrypt (rolling XOR → XOR layer 2 → AES-GCM → optional Xpress Huffman decompression) before payload execution |
| Defense Evasion | T1497.001 | Virtualization/Sandbox Evasion: System Checks | Hard-fail CPUID hypervisor check (blocklists VMware/VirtualBox/KVM/Xen/Parallels/QEMU TCG, allowlists Hyper-V) plus an 11-factor score model (process count, CPU count, RAM, disk size, uptime, ProcessDebugPort, recent-files count, screen resolution, username/computer-name blocklist, cursor movement); exits before decryption if score < 8 |
| Defense Evasion | T1497.003 | Virtualization/Sandbox Evasion: Time Based Evasion | Anti-debug timing loop (200ms threshold), decryption-time check (3,000,000-iteration loop completing in under 2,000,000 cycles flips the SHA-256 key material), user-activity wait loop (cursor/mouse/Enter, up to 5s) |
| Defense Evasion | T1622 | Debugger Evasion | IsDebuggerPresent and CheckRemoteDebuggerPresent checks; payload decryption skipped if a debugger is detected |
| Defense Evasion | T1106 | Native API | Hell's Gate indirect syscalls for NtProtectVirtualMemory, NtUnmapViewOfSection, NtQueryInformationProcess, NtDelayExecution, NtSetContextThread, NtGetContextThread via a freshly-mapped ntdll.dll copy and syscall-gadget scanning; falls back to GetProcAddress if setup fails |
| Defense Evasion | T1620 | Reflective Code Loading | LoadPE performs in-process manual PE mapping (fixes relocations/imports, updates PEB->ImageBaseAddress, starts a new thread); CLR hosting loads .NET payloads directly from memory via mscoree.dll |
| Defense Evasion | T1055.012 | Process Injection: Process Hollowing | RunPE creates a suspended process (default dllhost.exe), marks a temp file DeletePending, maps the payload via NtCreateSection(SEC_IMAGE), redirects the suspended primary thread to the payload entry point |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | Persistence entries and the scheduled task use the name SecurityHealthService.exe, the real Windows Security Health Service binary name, outside its real System32 location |
| Defense Evasion | T1036 | Masquerading (command-line spoofing) | LoadPE spoofs the displayed process command line to svchost.exe |
| Defense Evasion | T1134.004 | Access Token Manipulation: Parent PID Spoofing | opt_flag 0x80 spoofs the parent process as explorer.exe and enables SeDebugPrivilege for the optional payload process |
| Defense Evasion | T1562 * | Impair Defenses (host-identity spoofing via inline hooks) | Inline trampoline hooks on InternetReadFile/WinHttpReadData, RegQueryValueEx, GetUserName, GetComputerName, GetVolumeInformation, GetEnvironmentVariable rewrite return values (IPv4 octets, hardware/registry identifiers, username, hostname, volume serial, environment variables) with properly-formatted but false data |
| Persistence | T1547.001 | Registry Run Keys / Startup Folder | persistence_option flags write HKCU...Run, HKCU...RunOnce, a Startup-folder copy, and the HKCU...Windows Load value, all under the name SecurityHealthService.exe |
| Persistence | T1053.005 | Scheduled Task | LogonTrigger scheduled task named SecurityHealthService.exe |
| Persistence | T1037.001 | Boot or Logon Initialization Scripts: Logon Script (Windows) | UserInitMprLogonScript value under HKCU\Environment |
| Discovery | T1082 | System Information Discovery | Score-based environment profiling (CPU count, RAM, disk size, uptime, screen resolution) feeds the anti-VM scoring model |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | HTTP POST to aware-cr1[.]com/api/beacon carrying JSON registration/status messages |
| Command and Control | T1132.002 | Data Encoding: Non-Standard Encoding | Outbound JSON payload XOR-encrypted with a static 32-byte key before transmission |
* T1562 is the closest ATT&CK umbrella for inline-hook host-identity spoofing; no sub-technique cleanly covers "rewrite API return values with plausible false data," so this row is flagged as an analyst judgment call rather than a reporting-confirmed procedure mapping.
Native Audit-Log Hunts
These checks cover the parts of the attack chain that Falcon CQL cannot see directly (no raw syscall field, no generic file-create field verified against this skill's Falcon reference set). They require Sysmon or native Windows auditing in addition to the Falcon sensor.
1. Lock-file artifact (Sysmon EventID 11 — FileCreate)
Field: TargetFilename
Pattern: C:\Users\*\AppData\Local\Temp\aw_[0-9a-f]{32}\.lk
Notes: opt_flag 0x100 creates this file with FILE_FLAG_DELETE_ON_CLOSE as a
single-instance mutex. The file is normally gone by the time an analyst
looks, so alert on CREATE, not on current presence.
2. .NET CLR module load into a non-.NET host (Sysmon EventID 7 — ImageLoad)
Field: ImageLoaded Pattern: ...\mscoree.dll OR ...\clr.dll OR ...\clrjit.dll Exclude: parent/host process already known to be a .NET application Cross-reference against CQL Q10 (§8) which performs the same hunt on Falcon's ImageHash event for hosts where Sysmon is not deployed.
3. Scheduled task creation (Windows Security EventID 4698 / 4702)
Field: TaskName Pattern: SecurityHealthService.exe (or SecurityHealthService) Notes: complements Falcon's ScheduledTaskRegistered event (CQL Q2); use this where Advanced Audit Policy is enabled but the Falcon sensor is not yet deployed or is in a degraded state.
4. dllhost.exe process creation without /Processid: (Windows Security EventID 4688)
Field: NewProcessName, CommandLine Pattern: NewProcessName ends \dllhost.exe AND CommandLine does not contain "/Processid:" Prerequisite: "Include command line in process creation events" GPO must be enabled (Computer Configuration > Administrative Templates > System > Audit Process Creation), or CommandLine will be blank in the event.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a Run or RunOnce registry value literally named SecurityHealthService.exe pointing somewhere other than the real System32 binary. FP: near zero — the exact value name colliding with an unrelated legitimate application is rare, and the real Windows binary is explicitly excluded.
// HUNT: Run/RunOnce persistence masquerading as SecurityHealthService.exe
// MITRE: T1547.001
// CONF: high
// FP: low
// COST: low
// REQUIRES: AsepValueUpdate or RegGenericValueUpdate telemetry (registry monitoring enabled)
// FALSE POSITIVES: third-party software coincidentally reusing the exact value name (not observed)
#event_simpleName=/AsepValueUpdate|RegGenericValueUpdate/
| RegObjectName = /\\Microsoft\\Windows\\CurrentVersion\\(Run|RunOnce)$/i
| RegValueName = /^SecurityHealthService\.exe$/i
| RegStringValue != /\\Windows\\System32\\SecurityHealthService\.exe$/i
| table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue])
Looks for: a scheduled task named SecurityHealthService.exe whose target executable is not the real System32 binary. FP: near zero.
// HUNT: Scheduled task persistence masquerading as SecurityHealthService.exe
// MITRE: T1053.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: ScheduledTaskRegistered telemetry
// FALSE POSITIVES: none identified
#event_simpleName=ScheduledTaskRegistered
| TaskName = /^SecurityHealthService\.exe$/i
| TaskExecutable != /\\Windows\\System32\\SecurityHealthService\.exe$/i
| table([@timestamp, ComputerName, UserName, TaskName, TaskExecutable, TaskAuthor])
Looks for: modification of the HKCU Load value or the HKCU\Environment UserInitMprLogonScript value, both exceptionally rare persistence vectors regardless of the value written. FP: near zero; a small number of enterprise logon-script deployment tools legitimately use UserInitMprLogonScript.
// HUNT: Load value / logon-script persistence (rare registry locations)
// MITRE: T1547.001, T1037.001
// CONF: high
// FP: low
// COST: low
// REQUIRES: AsepValueUpdate or RegGenericValueUpdate telemetry
// FALSE POSITIVES: enterprise logon-script deployment tooling using UserInitMprLogonScript legitimately
#event_simpleName=/AsepValueUpdate|RegGenericValueUpdate/
| (RegObjectName = /\\Microsoft\\Windows NT\\CurrentVersion\\Windows$/i and RegValueName = /^Load$/i) or (RegObjectName = /\\Environment$/i and RegValueName = /^UserInitMprLogonScript$/i)
| table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue])
Looks for: any process named SecurityHealthService.exe actually executing from a path other than the real System32 binary, regardless of which persistence vector launched it. FP: near zero.
// HUNT: Process execution masquerading as SecurityHealthService.exe
// MITRE: T1036.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 telemetry
// FALSE POSITIVES: none identified
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName = /^SecurityHealthService\.exe$/i
| ImageFileName != /\\Windows\\System32\\SecurityHealthService\.exe$/i
| table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData])
Looks for: a process whose displayed command line begins with svchost.exe while its on-disk image file name is not svchost.exe — the LoadPE path's command-line spoof. FP: medium — some legitimate relaunch/updater tools rewrite their own displayed command line.
// HUNT: LoadPE command-line masquerade as svchost.exe
// MITRE: T1620, T1036
// CONF: medium
// FP: medium
// COST: low
// REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 telemetry
// FALSE POSITIVES: internal update/relaunch tooling that intentionally rewrites its own displayed command line
// TUNING: exclude known internal packaging/update tools by SHA256HashData or ParentBaseFileName after a baseline run; validate CommandLine casing/quoting variants before promoting to Prevent
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| CommandLine = /^svchost\.exe\b/i
| FileName != /^svchost\.exe$/i
| table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData])
Looks for: dllhost.exe launched without the /Processid:{GUID} switch that every legitimate DCOM-launched COM surrogate carries. FP: medium pending environment baseline — flagged medium out of caution even though no legitimate no-arg invocation pattern is documented.
// HUNT: dllhost.exe process hollowing (RunPE default target)
// MITRE: T1055.012
// CONF: high
// FP: medium
// COST: low
// REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 telemetry with command-line capture
// FALSE POSITIVES: rare legacy COM scripting or management tooling that invokes dllhost.exe directly without the DCOM launcher
// TUNING: run over a 30-day baseline per host group before alerting; allowlist any confirmed legitimate no-arg dllhost.exe source by ParentBaseFileName before promoting to Prevent
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName = /^dllhost\.exe$/i
| CommandLine != /\/Processid:/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine, SHA256HashData])
Looks for: DNS resolution of the known 2CLoader C2 domain or a direct connection to the known payload-staging IP. FP: near zero (atomic indicator); perishable as infrastructure rotates — re-run against current threat intel before relying on this long-term.
// HUNT: 2CLoader C2 domain / payload-staging IP
// MITRE: T1071.001
// CONF: high
// FP: low
// COST: low
// REQUIRES: DnsRequest and/or NetworkConnectIP4 telemetry
// FALSE POSITIVES: none identified (atomic indicator)
#event_simpleName=/DnsRequest|NetworkConnectIP4/
| (DomainName = /^aware-cr1\.com$/i) or (RemoteAddressIP4 = "62.60.226.185")
| table([@timestamp, ComputerName, UserName, DomainName, RemoteAddressIP4, RemotePort, ContextBaseFileName])
Looks for: host/destination pairs connecting on a regular 5-minute cadence for over an hour with a low per-bucket connection count, a shape consistent with 2CLoader's periodic HTTP POST status beacon, regardless of which IP it is currently using. FP: medium — legitimate SaaS sync/telemetry clients poll on similar cadences; tune with the ContextBaseFileName projection.
// HUNT: Periodic beaconing consistent with 2CLoader's HTTP POST status reporting
// MITRE: T1071.001, T1132.002
// CONF: medium
// FP: medium
// COST: medium
// REQUIRES: NetworkConnectIP4 telemetry
// FALSE POSITIVES: legitimate cloud-sync, telemetry, or EDR-agent callback traffic with similar polling cadence
// TUNING: exclude known-benign ContextBaseFileName values (sync clients, update agents, the EDR sensor itself) after baselining; raise BucketsActive / lower AvgConnsPerBucket thresholds to fit environment norms
// LOOKBACK: 7d -- set the window with the console time picker
#event_simpleName=NetworkConnectIP4
| !cidr(RemoteAddressIP4, subnet="10.0.0.0/8")
| !cidr(RemoteAddressIP4, subnet="172.16.0.0/12")
| !cidr(RemoteAddressIP4, subnet="192.168.0.0/16")
| Bucket5m := @timestamp - (@timestamp % 300000)
| groupBy([ComputerName, RemoteAddressIP4, ContextBaseFileName, Bucket5m], function=count(as=ConnsInBucket), limit=20000)
| groupBy([ComputerName, RemoteAddressIP4, ContextBaseFileName], function=[count(as=BucketsActive), avg(ConnsInBucket, as=AvgConnsPerBucket)], limit=5000)
| BucketsActive > 12
| AvgConnsPerBucket < 5
| sort(BucketsActive, order=desc)
| table([ComputerName, RemoteAddressIP4, ContextBaseFileName, BucketsActive, AvgConnsPerBucket])
Looks for: exact SHA-256 match against the 20 known 2CLoader samples published by Zscaler ThreatLabz. FP: near zero (exact hash); perishable as new builds get new hashes — re-run against updated hash feeds, not a one-time check.
// HUNT: Known 2CLoader sample hash sweep
// MITRE: Indicator Match (supports all TTPs in this pack)
// CONF: high
// FP: low
// COST: low
// REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 telemetry
// FALSE POSITIVES: none identified (exact hash match)
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| in(field=SHA256HashData, values=["5edcaa75a28e5cd700bf7643b275fe5d28649aa41a0711f391ec1fca795a4e8a","0017821181723261801e24abb9d33c739f382889d46dbf46d320c87ac62e5ca6","06185d74edbdc06f99095e96f74aa2e49a1cda2d02a294c11a9ac35a0231075e","066d83b98a2081e0bb075c94376aebc9b0fd6499025cab1762d83bbb4d7576c6","0a2ef2c360cf6e3e3e5d844ca03fecc31924ba0e8c3ecd8aefa778cae10fb19e","0d2abd7d872196abd951f1d7ed6406486499e5d5acc04f28fcd4f45b1851711e","0e4d6c385922938ecc1962dbc7e5950b086459b172b70a945414cffe4395aa27","0ee6df8a309443c86c0bba8b376f39531513d3451b46bebd4b79bb9d5bf8dcb1","1337ed6fe9c6205b569670a40eab42b51ba69c5c1724d61474e8595acd90ecfb","1447ed0893b9095f671e2f35a2a0127890040b5459534813b0f83c3e1fffa0bf","1b195181a2603b0b2608d49134af8c170225c2e06873c1fe5cd537db9018807f","246717653bc2ae2e09036bac56c9d79940c652972a73f4c6aa9b925c28cce095","2ad9b5e1c9952e95cfa55a4255e952962b6208ae1ca610caf1c7c2383be7e74b","2c786f7009cc5e1fba5471a88b23b34dce6e1578ee9f664ec62bf48227ba384b","2d43d592630ad1e012da63ef7279f95dd4a8e94964e12ca2f996051875574fa6","30cf47caf9700a74a8ea4a728b8b7c88cb1f8e22261b4ac01575b112c1e224ca","3286ff477ccd888479b96d0ffb2bd53962862db7267a4bd1c8d8f8c22fec63d4","331fd58d489e9fb888a5e4193d0e36f6ff29063808c59a164d98e26835054972","45d46e7064ba4b4cb578659f73ee354ad26cf2cc1e7f59bd3d15028e1e46a38b","4c16f5ebd5c633b7a793ffa2cd96daddc5a503d82ed4fbe636109d89164ec02b"])
| table([@timestamp, ComputerName, UserName, FileName, ImageFileName, SHA256HashData, ParentBaseFileName])
Looks for: mscoree.dll, clr.dll, clrjit.dll, mscorlib.ni.dll, or mscoreei.dll loaded into a process that is not a recognized .NET host, consistent with 2CLoader's CLR-hosting execution path (fl 0x2). FP: medium — legitimate in-house .NET line-of-business tools and .NET-based agents will also trip this.
// HUNT: CLR hosting of a .NET payload by a non-.NET process
// MITRE: T1620, T1055
// CONF: medium
// FP: medium
// COST: medium
// REQUIRES: ImageHash telemetry correlated with ProcessRollup2 on aid + TargetProcessId
// FALSE POSITIVES: legitimate in-house .NET applications, .NET-based backup/agent/management software
// TUNING: extend the FileName exclusion list with your environment's known legitimate .NET hosts after a baseline run; validate before promoting beyond Investigate-only
#event_simpleName=ImageHash
| rename(field=[[FileName, Dll_Loaded], [FilePath, Dll_Path]])
| selfJoinFilter(field=[aid, TargetProcessId], where=[
{#event_simpleName = /ProcessRollup2/},
{FileName != /(powershell|pwsh|dotnet|w3wp|devenv|MSBuild)\.exe/i},
{#event_simpleName = ImageHash}
])
| in(field=Dll_Loaded, values=["mscoree.dll", "clr.dll", "clrjit.dll", "mscorlib.ni.dll", "mscoreei.dll"], ignoreCase=true)
| groupBy([aid, ComputerName, TargetProcessId], function=collect([FileName, CommandLine, Dll_Loaded, Dll_Path]))
CrowdStrike Custom IOA Recommendations
| IOA Name | Pattern | Exclusions | Deployment Path |
|---|---|---|---|
| SecurityHealthService Masquerade | Process, registry autostart value, or scheduled task named SecurityHealthService.exe where the target path is not %SystemRoot%\System32\SecurityHealthService.exe (built from Q1, Q2, Q4) | None identified; the real binary path is explicitly excluded by design | Deploy direct to Detect; promote to Prevent after a 14-day burn-in with zero legitimate hits (see §11) |
| dllhost.exe Without COM Surrogate Argument | dllhost.exe process creation lacking the /Processid: switch (built from Q6) | Any confirmed legitimate internal tooling invoking dllhost.exe directly — allowlist by ParentBaseFileName or SHA256HashData after baseline | Start in Detect for a 30-day baseline per host group; most environments can promote to Prevent faster than the masquerade IOA since the legitimate no-arg case is undocumented |
| 2CLoader C2 Beacon | DNS/network match for aware-cr1.com or 62.60.226.185 (built from Q7) | None — atomic indicator | Deploy to Detect. Both network indicators are single-origin (all public reporting traces to one Zscaler disclosure, see §2), which does not meet this pack's two-independent-source bar for a blocking posture. Promote to Prevent at the network layer (firewall/DNS sinkhole) once a second independent vendor publishes the same values, or once a local hit is confirmed as true-positive in your own telemetry. Expect to retire this IOA as infrastructure rotates: re-check against current intel before the 2027-04-03 expiry |
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,5edcaa75a28e5cd700bf7643b275fe5d28649aa41a0711f391ec1fca795a4e8a,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,0017821181723261801e24abb9d33c739f382889d46dbf46d320c87ac62e5ca6,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,06185d74edbdc06f99095e96f74aa2e49a1cda2d02a294c11a9ac35a0231075e,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,066d83b98a2081e0bb075c94376aebc9b0fd6499025cab1762d83bbb4d7576c6,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,0a2ef2c360cf6e3e3e5d844ca03fecc31924ba0e8c3ecd8aefa778cae10fb19e,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,0d2abd7d872196abd951f1d7ed6406486499e5d5acc04f28fcd4f45b1851711e,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,0e4d6c385922938ecc1962dbc7e5950b086459b172b70a945414cffe4395aa27,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,0ee6df8a309443c86c0bba8b376f39531513d3451b46bebd4b79bb9d5bf8dcb1,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,1337ed6fe9c6205b569670a40eab42b51ba69c5c1724d61474e8595acd90ecfb,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,1447ed0893b9095f671e2f35a2a0127890040b5459534813b0f83c3e1fffa0bf,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,1b195181a2603b0b2608d49134af8c170225c2e06873c1fe5cd537db9018807f,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,246717653bc2ae2e09036bac56c9d79940c652972a73f4c6aa9b925c28cce095,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,2ad9b5e1c9952e95cfa55a4255e952962b6208ae1ca610caf1c7c2383be7e74b,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,2c786f7009cc5e1fba5471a88b23b34dce6e1578ee9f664ec62bf48227ba384b,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,2d43d592630ad1e012da63ef7279f95dd4a8e94964e12ca2f996051875574fa6,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,30cf47caf9700a74a8ea4a728b8b7c88cb1f8e22261b4ac01575b112c1e224ca,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,3286ff477ccd888479b96d0ffb2bd53962862db7267a4bd1c8d8f8c22fec63d4,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,331fd58d489e9fb888a5e4193d0e36f6ff29063808c59a164d98e26835054972,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,45d46e7064ba4b4cb578659f73ee354ad26cf2cc1e7f59bd3d15028e1e46a38b,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader sha256,4c16f5ebd5c633b7a793ffa2cd96daddc5a503d82ed4fbe636109d89164ec02b,detect,high,2027-04-03,2CLoader loader sample (single-origin intel: detect-only until independently corroborated),campaign:2CLoader domain,aware-cr1.com,detect,high,2027-04-03,2CLoader C2 callout domain (single-origin intel: detect-only until independently corroborated),campaign:2CLoader ipv4,62.60.226.185,detect,high,2027-04-03,2CLoader payload-staging IP t0907.exe (single-origin intel: detect-only until independently corroborated),campaign:2CLoader
[Persistence masquerade] Name/value/task = SecurityHealthService.exe Target path NOT %SystemRoot%\System32\SecurityHealthService.exe Locations: HKCU...CurrentVersion\Run, HKCU...CurrentVersion\RunOnce, Startup folder, logon-triggered Scheduled Task, HKCU...CurrentVersion\Windows (Load) [Rare persistence] HKCU\Environment\UserInitMprLogonScript modified (any value) [Command-line masquerade] CommandLine starts with "svchost.exe" AND on-disk FileName != svchost.exe [Process hollowing] FileName = dllhost.exe AND CommandLine does NOT contain "/Processid:" [Lock-file artifact] %TEMP%\aw_[32 hex chars].lk created with FILE_FLAG_DELETE_ON_CLOSE [CLR hosting anomaly] mscoree.dll / clr.dll / clrjit.dll loaded into a non-.NET host process
Loader: 2CLoader Zscaler detect: Win64.Loader.2CLoader Delivers: Vidar (infostealer), Remus (infostealer), XWorm (RAT) Technique names: Hell's Gate (indirect syscalls) Symantec/CB sigs (independent vendor, see Broadcom bulletin): SONAR.SuspBeh!gen66, SONAR.TCP!gen1, PUA.Gen.2, Trojan Horse, Trojan.Dacic!ATN, Trojan.Gen.MBT, Trojan.Sabsik!ATN, WS.Malware.1, Heur.AdvML.A!300/400/500, Heur.AdvML.B!100/200, Heur.AdvML.C
(Get-MpPreference).AttackSurfaceReductionRules_Ids (Get-MpPreference).AttackSurfaceReductionRules_Actions Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard | Select-Object SecurityServicesRunning, VirtualizationBasedSecurityStatus (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name RunAsPPL -EA SilentlyContinue).RunAsPPL Get-AppLockerPolicy -Effective | Select-Object -ExpandProperty RuleCollections auditpol /get /subcategory:"Process Creation"
Detection Validation Gates
| Gate | Check | Status |
|---|---|---|
| Telemetry ready | Confirm ProcessRollup2/SyntheticProcessRollup2, AsepValueUpdate/RegGenericValueUpdate, ScheduledTaskRegistered, DnsRequest, NetworkConnectIP4, and ImageHash are flowing for in-scope hosts | Required before deployment |
| Benign baseline | Run Q1, Q2, Q3, Q4, Q6 over a 30-day historical window on a representative fleet subset before enabling any alerting; expect zero hits | Run before promotion |
| Positive test | In an isolated lab VM: write a Run-key value named SecurityHealthService.exe pointing outside System32 (confirms Q1, Q4); launch dllhost.exe manually with no /Processid: argument (confirms Q6) | Run before promotion |
| Promotion criteria | 14 consecutive days with zero legitimate (non-test) hits on Q1, Q2, Q4, and Q6 before moving the matching Custom IOA from Detect to Prevent | Gate for IOA promotion |
Hardening — Tiered
- Enable the LSASS-credential-theft ASR rule in Block mode (GUID
9E6C4E1F-7D60-472F-BA1A-A39EF669E4B2) — MITRE M1040 (Behavior Prevention on Endpoint). Does not stop 2CLoader itself but blunts the downstream Vidar/Remus credential-theft impact if the loader lands. CIS Microsoft 365 Apps/Windows Benchmark, section 18.9.47, sub-rule 5.1.2 (L1, Block). - Enable full command-line process-creation auditing (Event 4688 with command line + Sysmon EventID 1) — MITRE M1047 (Audit). Required for Q5/Q6 hunts and the native EventID 4688 hunt in §7 to return usable data. Microsoft Security Baseline: Computer Configuration > Administrative Templates > System > Audit Process Creation > Include command line in process creation events = Enabled.
- Set the Falcon prevention policy to full Block (ML + sensor-based detections, not Detect-only) — MITRE M1040. This is the only control in this pack that directly contests 2CLoader's Hell's Gate indirect syscalls and in-memory execution, since neither is independently huntable via CQL (see §15 gaps).
- AppLocker/WDAC path rule denying execution from %TEMP% and %APPDATA%\Local\Temp for unsigned binaries — MITRE M1038 (Execution Prevention). Reduces the viability of the drop-and-run pattern 2CLoader and its payloads use from temp paths. Microsoft Security Baseline AppLocker guidance; DISA STIG WN11-00-000030 (Application Control) covers the equivalent intent for government environments. Deploy in Audit mode first, confirm no legitimate workflow trips, then flip to Enforce.
- Restrict registry write permissions on sensitive autostart keys (Run, RunOnce, the Windows NT\CurrentVersion\Windows Load value, HKCU\Environment) for standard users via GPO — MITRE M1024 (Restrict Registry Permissions). ⚠ best-practice, no single CIS benchmark line item covers this exact ACL change; it follows CIS Benchmark intent for restricting user-writable autostart locations (CIS Microsoft Windows Benchmark §18.x autostart hardening family) without a one-to-one control number.
- Deploy Credential Guard fleet-wide (VBS-isolated LSASS) — MITRE M1025, M1043 (Privileged Process Integrity, Credential Access Protection). Blunts Vidar/Remus's ultimate objective even when 2CLoader itself succeeds in landing. CIS Microsoft Windows Benchmark, section 18.9.45, sub-rule 5.1 (L1, Enabled with UEFI lock). Pilot first: breaks some legacy SSO products and older third-party AV that hooks LSASS.
- Egress filtering / DNS-layer blocking for newly-registered and unclassified domains — MITRE M1037 (Filter Network Traffic). Reduces C2 callout success for rotated infrastructure not yet IOC-listed, complementing the atomic domain/IP block in §10. ⚠ best-practice, no single CIS/STIG line item; follows NIST SP 800-53 SC-7 (Boundary Protection) intent.
Deployable Playbooks
Playbook 1 — Enable LSASS Credential-Theft ASR Rule
Prerequisites: Windows 10 1709+/Server 2019+, Microsoft Defender Antivirus active (passive or primary), local admin or GPO push access.
Reboot required: No.
Set-MpPreference -AttackSurfaceReductionRules_Ids '9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2' `
-AttackSurfaceReductionRules_Actions Enabled
# Verify
(Get-MpPreference).AttackSurfaceReductionRules_Ids
(Get-MpPreference).AttackSurfaceReductionRules_Actions
# Watch Defender Event ID 1121 (blocked) / 1122 (audited) for this rule GUID
Rollback:
Set-MpPreference -AttackSurfaceReductionRules_Ids '9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2' `
-AttackSurfaceReductionRules_Actions AuditMode
# or -AttackSurfaceReductionRules_Actions Disabled to fully revert
Playbook 2 — Enable Command-Line Process Auditing & PowerShell ScriptBlock Logging
Prerequisites: Local or domain GPO access; Windows 10/Server 2016+.
Reboot required: No — takes effect on next process creation / PowerShell session.
# Command-line auditing (Event 4688 with CommandLine populated) auditpol /set /subcategory:"Process Creation" /success:enable New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' ` -Name 'ProcessCreationIncludeCmdLine_Enabled' -Value 1 -PropertyType DWORD -Force | Out-Null # PowerShell ScriptBlock logging New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' ` -Name 'EnableScriptBlockLogging' -Value 1 -PropertyType DWORD -Force | Out-Null # Verify (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' ` -Name ProcessCreationIncludeCmdLine_Enabled).ProcessCreationIncludeCmdLine_Enabled auditpol /get /subcategory:"Process Creation"
Rollback:
auditpol /set /subcategory:"Process Creation" /success:disable Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' ` -Name 'ProcessCreationIncludeCmdLine_Enabled' -EA SilentlyContinue Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' ` -Name 'EnableScriptBlockLogging' -EA SilentlyContinue
Playbook 3 — AppLocker Deny-Execution Path Rule for Temp Directories
Prerequisites: AppLocker policy infrastructure (GPO), Application Identity service (AppIDSvc) available to start, Windows 10/11 Enterprise or Server.
Reboot required: No, but the Application Identity service must be running (not a reboot, a service start).
# Start and set Application Identity service to auto Set-Service -Name AppIDSvc -StartupType Automatic Start-Service -Name AppIDSvc # Example path-rule deny (apply via GPO AppLocker console for fleet deployment; # this PowerShell form is for single-host testing/validation) $rule = New-AppLockerPolicy -RuleType Path -User Everyone -Action Deny ` -PathCondition "%OSDRIVE%\Users\*\AppData\Local\Temp\*.exe","%OSDRIVE%\Windows\Temp\*.exe" Set-AppLockerPolicy -PolicyObject $rule -Merge # Verify (Audit mode first) Get-AppLockerPolicy -Effective | Select-Object -ExpandProperty RuleCollections
Rollback:
# Remove the merged rule collection or set the Enforcement mode back to "Not configured" / AuditOnly Set-AppLockerPolicy -PolicyObject (New-AppLockerPolicy -RuleType Path -User Everyone -Action Deny ` -PathCondition "%OSDRIVE%\Users\*\AppData\Local\Temp\*.exe","%OSDRIVE%\Windows\Temp\*.exe") -Merge -EA SilentlyContinue # then remove via the AppLocker GPO console, or: Set-Service -Name AppIDSvc -StartupType Manual
Playbook 4 — Enable Credential Guard
Prerequisites: Windows 10/11 Enterprise or Server 2016+, UEFI, Secure Boot, TPM 2.0, VBS-capable CPU. Pilot before fleet rollout — known to break some legacy SSO products and older third-party AV that hooks LSASS.
Reboot required: Yes.
$dg = 'HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard' New-ItemProperty -Path $dg -Name 'EnableVirtualizationBasedSecurity' -Value 1 -PropertyType DWORD -Force | Out-Null New-ItemProperty -Path $dg -Name 'RequirePlatformSecurityFeatures' -Value 3 -PropertyType DWORD -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name 'LsaCfgFlags' -Value 1 -PropertyType DWORD -Force | Out-Null Write-Output "Credential Guard configured. REBOOT REQUIRED." # Verify (after reboot) Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard | Select-Object SecurityServicesRunning, VirtualizationBasedSecurityStatus # SecurityServicesRunning should include 1; VirtualizationBasedSecurityStatus should be 2
Rollback:
$dg = 'HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard' Set-ItemProperty -Path $dg -Name 'EnableVirtualizationBasedSecurity' -Value 0 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name 'LsaCfgFlags' -Value 0 # Reboot required to take effect
Containment Runbook
| Phase | Actions | Owner | Evidence to Capture |
|---|---|---|---|
| 1. Isolate | Network-contain the affected host via Falcon RTR; block aware-cr1.com and 62.60.226.185 at DNS/firewall org-wide; suspend/disable the affected user's domain credentials pending a presumed Vidar/Remus credential-theft outcome | IR Lead / SOC | Isolation timestamp, blocked-indicator confirmation, account-suspension ticket |
| 2. Eradicate | Terminate the identified 2CLoader process and any RunPE-hollowed dllhost.exe tree; remove all persistence entries (Run/RunOnce/Startup/Load/Scheduled Task/UserInitMprLogonScript named SecurityHealthService.exe outside System32); delete the dropped payload and any %TEMP%\aw_*.lk lock file; run a full scan with current signatures (Win64.Loader.2CLoader) | IR / Endpoint Team | Process tree snapshot, removed registry/task values (before deletion), scan report |
| 3. Recover | Reset all credentials cached or visible on the host, including browser-stored credentials Vidar/Remus could have harvested; rotate any service-account credentials used interactively on the box; re-image if integrity cannot be confirmed; re-enable network access only after a clean scan; monitor the host for 14 days with the Custom IOAs from §9 and promote them to Prevent per the §11 criteria | IR Lead / Identity Team | Credential-reset log, re-image confirmation or clean-scan report, 14-day monitoring log |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1547.001 / T1037.001 | Run/RunOnce/Load/logon-script persistence | Q1, Q3 | SecurityHealthService Masquerade | Good |
| T1053.005 | Scheduled task persistence | Q2 | SecurityHealthService Masquerade | Good |
| T1036.005 | Process execution masquerading as SecurityHealthService.exe | Q4 | SecurityHealthService Masquerade | Good |
| T1620 / T1036 | LoadPE command-line spoof to svchost.exe | Q5 | — | Partial — FP medium, needs tuning before promotion |
| T1055.012 | RunPE process hollowing into dllhost.exe | Q6 | dllhost.exe Without COM Surrogate Argument | Good |
| T1071.001 / T1132.002 | Atomic C2 domain/IP match | Q7 | 2CLoader C2 Beacon | Good — perishable, re-validate against live intel |
| T1071.001 | Behavioral beaconing cadence | Q8 | — | Partial — generic pattern, needs environment tuning |
| Indicator Match | Known sample hash sweep | Q9 | (hash feed) | Good — perishable, re-validate against updated hash feed |
| T1620 / T1055 | CLR hosting anomaly (.NET payload) | Q10 | — | Partial |
| T1106 | Hell's Gate indirect syscalls | None | — | Gap — no raw syscall field in Falcon CQL; rely on sensor ML/behavioral prevention (M1040) |
| T1497.001 / T1497.003 / T1622 | Anti-VM / anti-debug / timing-based evasion | None | — | Gap — pre-decryption, no observable endpoint telemetry; rely on Falcon sandbox/ML detonation |
| T1027 / T1140 | PE-resource encryption/decryption chain | None | — | Gap — in-memory only, no file write; recoverable only via Zscaler's offline decrypt tooling against an acquired sample |
| T1134.004 | Parent PID spoofing to explorer.exe | None (not independently isolated) | — | Partial — would require an explorer.exe-parented anomaly correlation not built into this pack's current query set; flagged as a future enhancement |
All four validation gates from §11 (telemetry ready, benign baseline, positive test, promotion criteria) apply before any Good-rated detection above is promoted from Detect to Prevent.
Hunt Summary Ticket
TITLE: Hunt for 2CLoader (loader delivering Vidar / Remus / XWorm)
SEVERITY: High
SCOPE: Windows endpoints with Falcon sensor; registry, scheduled-task,
process, and network telemetry required (see Sec 5)
HYPOTHESIS: 2CLoader persists under the name SecurityHealthService.exe
across five registry/task vectors and executes via LoadPE
(svchost.exe command-line spoof), RunPE (dllhost.exe hollowing
without /Processid:), or CLR hosting, then beacons to
aware-cr1[.]com/api/beacon before delivering Vidar, Remus, or
XWorm.
QUERIES: 10 CQL hunt queries (Q1-Q10, Sec 8); 3 Custom IOA
recommendations (Sec 9); 4 native audit-log hunts (Sec 7)
DO FIRST: Q1, Q2, Q4, Q6 -- highest fidelity, lowest FP, independent of
current perishable C2 infrastructure or sample hashes
FINDINGS: [fill in after execution]
GAPS: Hell's Gate indirect syscalls, anti-VM/anti-debug/timing
evasion, and the PE-resource decryption chain leave no
Falcon CQL-visible telemetry (Sec 15) -- covered only by
sensor-level ML/behavioral prevention, not a hunt query
ACTIONS: See Sec 12-14 (tiered hardening, deployable playbooks,
3-phase containment runbook)
OWNER: [assign SOC/IR owner]
VERSION: v0.1 -- 2026-10-03
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| Tier 1 · Primary | Zscaler ThreatLabz — "2CLoader: A New Malware Loader Delivering Vidar and Remus" | Full technical teardown, configuration structure, encryption chain, evasion logic, persistence options, API hooks, C2 protocol, all atomic IOCs | 2026-10-03 |
| Tier 2 · Corroborating | Cyber Security News — "New 2CLoader Malware Evades Security Tools to Deploy Vidar and Remus Stealers" | Independent republication confirming the full IOC table and technical summary | 2026-10-03 |
| Tier 2 · Corroborating | GBHackers — "New 2CLoader Malware Uses Anti-VM and API Hooking to Deliver Vidar and Remus Stealers" | Independent republication confirming the technical narrative and network IOCs | 2026-10-03 |
| Tier 3 · Vendor Advisory | Broadcom / Symantec Protection Bulletin — "Vidar and Remus infostealers distributed with help of new 2CLoader" | Independent (non-Zscaler-sourced) vendor confirmation of the malware family's existence and behavior; Symantec/Carbon Black detection signature names | 2026-10-03 |
Source snapshots saved verbatim at build time: 2CLoader-Hunt-sources/01-zscaler-threatlabz.txt, 02-cybersecuritynews.txt, 03-broadcom-symantec-bulletin.txt, 04-gbhackers.txt.