Exodus Wallet Installer RAT
Executive Summary
A trojanized Exodus cryptocurrency wallet installer delivers a genuine, working copy of Exodus Wallet 24.33.4 with three files modified so the wallet window never displays. Behind that silent wallet sits a JavaScript-based reflective PE loader that AES-256-CBC-decrypts a roughly 10 MB, six-module RAT entirely in memory: remote command execution, file management, browser credential and cookie theft, a SOCKS proxy, hidden VNC, and a Lua scripting engine. The attacker's objective is full interactive access and a pivot point, not just wallet contents: the module set (hidden VNC plus SOCKS plus a browser stealer) is a hands-on-keyboard toolkit wearing a crypto-wallet disguise.
Delivery uses two confirmed vectors, a .pdf.js double-extension file opened via Windows Script Host, and a JavaScript file staged inside a ZIP presented as a software update, plus one documented-but-unobserved search-ms: WebDAV redirect capability. Both confirmed chains show a real decoy PDF opening from a legitimate CDN while msiexec silently installs the ~210 MB MSI to %APPDATA%\ExdBackupTool\, a path no legitimate Exodus install ever uses. Persistence is two scheduled tasks registered through the Task Scheduler COM API (no schtasks.exe command line to catch): ExdBackupTool relaunches the wallet hourly, and INetHealth repeatedly blanks the user's proxy settings to keep command-and-control traffic direct. C2 itself is a dead-drop pattern against Azure Table Storage, blending into infrastructure that sits on nobody's blocklist.
The highest-value defensive angle is not the atomic indicators, which the operator's own tooling proves rotate every rebuild, but the structural behaviors that survive a rebuild: a per-user Electron wallet launched through explorer.exe from %APPDATA% instead of %LOCALAPPDATA%\exodus, an hourly svchost.exe-parented relaunch, and a scheduled task quietly re-clearing proxy configuration. Those four shapes are what this pack hunts hardest.
Defender priority: any host that shows the %APPDATA%\ExdBackupTool\Exodus.exe path, the ExodusHelper mutex, or the hourly svchost.exe-launched relaunch pattern should be treated as a full interactive compromise, not a malware infection. Hidden VNC and a SOCKS module mean an operator may have had hands-on-keyboard access; the browser module means saved credentials and session cookies must be treated as stolen, so revoke active sessions and rotate credentials rather than only resetting passwords.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 1 | Huntress, "The Crypto Wallet That Never Opened" | Primary vendor writeup with full technical teardown: delivery chains, MSI internals, obfuscation method, AES key/IV, six RAT modules, C2 dead-drop mechanics, all atomic IOCs, and mitigation guidance. | Yes, full detail |
| Tier 2 | GBHackers, "Trojanized Exodus Wallet Installer Deploys RAT" | Independent corroboration of the MSI SHA-256, the decrypted RAT SHA-256, the install path, and both scheduled task names. | Partial, corroboration only |
| Tier 2 | Cyberpress, "Malicious Exodus Installer Steals Browser Credentials" | Third independent corroboration of the MSI filename, MSI SHA-256, install path, and the search-ms: WebDAV delivery capability. | Partial, corroboration only |
Decisions and exclusions
- No prompt-injection attempts were found in any fetched source. All three pages returned straightforward technical reporting with no embedded instructions directed at an automated reader.
- Huntress explicitly lists 45 domains (pattern
api./cdn./static./app./auth.prefixed on small-business domains) that were configured in the binary but never contacted during detonation, and cautions that the domain owners "may themselves be victims." None of those 45 domains are shipped as indicators in this pack; they are documented in the source snapshot only, as unconfirmed capability rather than confirmed infrastructure. - Huntress explicitly instructs readers not to treat
api.blockchain.info,api.moonpay.com,api.rampnetwork.com,api.segment.io, andwww.googleapis.comas indicators, since those are genuine Exodus API endpoints sitting in the same region of the decrypted file. Excluded from this pack on the same basis. - A social-media summary post (DFIR Radar on X) surfaced in search results but was not fetched or cited; its content is a paraphrase of the same Huntress writeup and adds no independently verifiable detail, so it is excluded rather than treated as a fourth source.
- Several additional syndication sites (Substack, cybersecuritynews.com, cryptika.com, hendryadrian.com, cyberpress's sister OffSeq radar page) appeared in search results and were not fetched; they were not needed once three independent fetches corroborated the atomic indicators used at prevent/critical severity.
- The
dll4_browser.dllSHA-256 required correction against the raw source HTML: an early text-extraction pass dropped two characters from the hash. The value shipped in this pack (7e74f6e2eb7a17a8d25bb322a14c392c9d92c6ab29fc66b50221da134a1bdba8) was re-verified directly against the raw<code>span in the Huntress page and is a full, valid 64-character SHA-256.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1 (high): A user opens a
.pdf.jsdouble-extension file or a JavaScript file staged out of a ZIP, and Windows Script Host executes it as a child ofchrome.exeorexplorer.exe. Falcon telemetry:ProcessRollup2. - H2 (high): The dropper silently installs an unsigned, oversized MSI via
msiexec /i ... /quiet /norestartfrom%TEMP%, using a two-letter-plus-four-digit filename convention. Falcon telemetry:ProcessRollup2. - H3 (high): The trojanized wallet runs from
%APPDATA%\ExdBackupTool\Exodus.exe, launched throughexplorer.exeso the process tree looks like a manual double-click, instead of the legitimate%LOCALAPPDATA%\exoduspath. Falcon telemetry:ProcessRollup2. - H4 (high): Persistence is registered as two scheduled tasks,
ExdBackupToolandINetHealth, created via the Task Scheduler COM API rather thanschtasks.exe. Falcon telemetry:ScheduledTaskRegistered. - H5 (high): Every hour, at roughly the same minute,
svchost.exerelaunchesExodus.exeout of the trojanized path as the Task Scheduler fires. Falcon telemetry:ProcessRollup2. - H6 (medium): The
INetHealthpayload runs as a hidden-window PowerShell command (conhost.exe --headlessparentingpowershell.exe -e <base64>) that clearsProxyEnable,ProxyServer, andAutoConfigURL. Falcon telemetry:ProcessRollup2plusRegGenericValueUpdate. - H7 (medium): The koffi FFI module the reflective loader depends on extracts a native
.tmp.nodemodule into%TEMP%at runtime. Falcon telemetry:PeFileWritten. - H8 (high): The RAT beacons to an Azure Table Storage dead drop (
lgapistorage123.table.core.windows.net, secondarilywinapi.table.core.windows.net) from the trojanized wallet process rather than a browser. Falcon telemetry:DnsRequest.
Attack chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
1. Lure execution: .pdf.js double extension or ZIP-staged .js | ProcessRollup2 (wscript.exe/cscript.exe) | Q1, Q2 |
2. Decoy PDF fetched from Storyblok / law.georgetown.edu while MSI downloads to %TEMP% | ProcessRollup2, NetworkConnectIP4 | Q3 (installer execution); decoy-CDN traffic itself is not a hunt signal, both hosts are legitimate |
3. Silent MSI install: msiexec /i "%TEMP%\<name>.msi" /quiet /norestart | ProcessRollup2 | Q3 |
4. Install lands in %APPDATA%\ExdBackupTool\, wrong path for genuine Exodus | ProcessRollup2, FileOpenInfo | Q4 |
5. LaunchExodus MSI custom action starts the wallet through explorer.exe | ProcessRollup2 | Q4 |
6. exodus_patch.js overrides BrowserWindow.show/focus/center, wallet never displays | No direct Falcon event, in-process JS behavior | Gap, covered indirectly by Q4/Q5 process-tree signal |
7. keystorage.js reflective PE loader extracts koffi .tmp.node, decrypts and maps the RAT in memory | PeFileWritten | Q9 |
8. Named mutex ExodusHelper created as a single-instance guard | No Falcon mutex-creation event exists | Gap, documented in Coverage Map |
| 9. Six RAT modules load in memory: cmd, fileman, browser, socks, vnc, script | No direct in-memory-module event | Gap, hunt the resulting network/registry/process behavior instead |
| 10. C2 dead drop against Azure Table Storage | DnsRequest | Q10 |
11. Persistence: ExdBackupTool task relaunches wallet hourly via svchost.exe | ScheduledTaskRegistered, ProcessRollup2 | Q5, Q6 |
12. Persistence: INetHealth task clears proxy settings on a schedule | ScheduledTaskRegistered, ProcessRollup2, RegGenericValueUpdate | Q5, Q7, Q8 |
13. Host recon: systeminfo run from inside the wallet process | ProcessRollup2 | Q12 |
| 14. Browser credential, cookie, and autofill theft; cookie wiper forces re-login | No direct Falcon event for DPAPI access; hunt via dll4_browser hash and downstream account-abuse telemetry | Gap, IOC-based only (Section 10) |
15. Known-bad infrastructure contact: us05[.]org / 35.212.159.20 | DnsRequest, NetworkConnectIP4 | Q11 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| sha256 | c513a7346484ee69a2931c4a89956ee50aa63e4366ef989315e669d8f10d7485 | high | detect | Trojanized MSI (jn0101.msi label), 210,767,872 bytes, unsigned, 0/76 on VirusTotal. Corroborated by 3 sources. | 2027-03-15 |
| sha256 | 8c3b41ea5a85778145a6e5772bfee2eb0f8b027d0af199fb71a76dfb8bb29e5a | high | detect | Decrypted modular RAT payload, memory-resident, never touches disk, not on VirusTotal. Corroborated by 2 sources. | 2027-03-15 |
| sha256 | fdd376562aac4be64fb635546a61e1912ff2c353360db73d2c553dcbb5a44f54 | high | detect | dll4_fileman.dll, remote file manager module. Single-source (Huntress). | 2027-03-15 |
| sha256 | 2f47cfbb13f7a8a2d30d287f4ddd974fabea6762ad9781d438eb53da41b4582d | high | detect | dll4_socks.dll, SOCKS proxy module. Single-source (Huntress). | 2027-03-15 |
| sha256 | 84437d4239d2a3d90c4faad0a3c0630b2f61a40f7bbd12109bef74d7613b8756 | high | detect | dll4_cmd.dll, remote shell module. Single-source (Huntress). | 2027-03-15 |
| sha256 | 5274e93e35586a341d14b50cdf8413d59c51fd94f32bdc70bfdfb77198367603 | high | detect | dll4_script.dll, Lua execution engine module. Single-source (Huntress). | 2027-03-15 |
| sha256 | 7e74f6e2eb7a17a8d25bb322a14c392c9d92c6ab29fc66b50221da134a1bdba8 | high | detect | dll4_browser.dll, Chrome/Edge/Firefox credential, cookie, and autofill theft plus cookie wiper. Single-source (Huntress); re-verified against raw source. | 2027-03-15 |
| sha256 | 5fe753945da0eaac2c2ef3845cba603dea6c3e8529fa581d7e0192f8af60391a | high | detect | dll4_vnc.dll, hidden VNC on an invisible desktop. Single-source (Huntress). | 2027-03-15 |
| domain | us05.org | medium | detect | 302-redirects to a search-ms: WebDAV URI; offline at Huntress's last check, so treat as perishable. | 2026-10-15 |
| ipv4 | 35.212.159.20 | medium | detect | Hosts jn0101.msi and resolves us05.org. Same infrastructure lifespan caveat as the domain. | 2026-10-15 |
| domain | lgapistorage123.table.core.windows.net | high | hunt | Azure Table Storage C2 dead drop, primary. Shared cloud infrastructure, hunt rather than blanket-block. | 2026-12-15 |
| domain | winapi.table.core.windows.net | medium | hunt | Azure Table Storage C2 dead drop, secondary or staging. Only one table-creation request observed. | 2026-12-15 |
| filename | jn0101.msi | medium | pivot | Trojanized installer filename. Huntress explicitly notes this is a per-build label, not a stable indicator. | 2026-10-15 |
| filename | jg0384.msi | medium | pivot | Trojanized installer filename, second campaign variant. Same per-build-label caveat. | 2026-10-15 |
| filename | ExdBackupTool | high | hunt | Install directory name and scheduled task name. Behavioral, not perishable. | 2027-03-15 |
| filename | INetHealth | high | hunt | Second scheduled task name, clears proxy settings. Behavioral, not perishable. | 2027-03-15 |
| filename | ExodusHelper | high | hunt | Named mutex, single-instance guard for the in-memory RAT. No direct Falcon telemetry for mutex creation; hunt via the process-tree proxy in Q4/Q6. | 2027-03-15 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints, process execution | ProcessRollup2 / SyntheticProcessRollup2 | Critical | Low, core Falcon sensor telemetry |
| Windows endpoints, DNS resolution | DnsRequest | High | Low, standard sensor telemetry |
| Windows endpoints, task scheduling | ScheduledTaskRegistered | High | Medium, COM-API-registered tasks bypass command-line-based detections; confirm this event fires for COM registrations in your tenant |
| Windows endpoints, registry | RegGenericValueUpdate / AsepValueUpdate | Medium | Medium, proxy-key writes can be noisy; needs the TUNING exclusion in Q8 |
| Windows endpoints, file writes | PeFileWritten / NewExecutableWritten | Medium | Medium, in-memory RAT modules themselves never touch disk; only the koffi native module does |
| Windows endpoints, network connections | NetworkConnectIP4 | Medium | Low, standard telemetry, but infrastructure IOCs are short-lived |
| Windows endpoints, named-object creation (mutex) | No corresponding Falcon event | High | Gap, cannot hunt ExodusHelper creation directly; use process-tree and relaunch-cadence proxies |
| Browser credential stores (Chrome/Edge/Firefox) | No direct Falcon telemetry for DPAPI/credential-store access | High | Gap, covered only by the dll4_browser hash and downstream account-abuse hunting, not by behavior |
ATT&CK Mapping
| Tactic | Technique | Name | Observed Behavior |
|---|---|---|---|
| Initial Access / Execution | T1204.002 | User Execution: Malicious File | User opens a .pdf.js file or a JS file staged out of a ZIP, believing it to be a document or update. |
| Defense Evasion | T1036.007 | Masquerading: Double File Extension | .pdf.js filename exploits Windows' default hidden-extensions setting. |
| Execution | T1059.007 | Command and Scripting Interpreter: JavaScript | Windows Script Host executes the dropper JS directly. |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | Genuine Exodus binary and UI files re-packaged and installed under a decoy directory name. |
| Execution | T1218.007 | System Binary Proxy Execution: Msiexec | Payload installed via msiexec /i ... /quiet /norestart. |
| Defense Evasion | T1027 | Obfuscated Files or Information | String-splitting and hexadecimal-arithmetic obfuscation across exodus_patch.js, index.js, and keystorage.js. |
| Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | Hardcoded AES-256-CBC key and IV decrypt the embedded RAT at runtime. |
| Defense Evasion | T1620 | Reflective Code Loading | JavaScript-driven manual PE loader (VirtualAlloc, WriteProcessMemory, CreateThread via koffi FFI) maps and runs the RAT entirely in memory. |
| Defense Evasion | T1564.003 | Hide Artifacts: Hidden Window | BrowserWindow.show/focus/center overridden so the wallet never renders; conhost.exe --headless hides the proxy-clearing PowerShell console. |
| Persistence | T1053.005 | Scheduled Task/Job: Scheduled Task | ExdBackupTool and INetHealth tasks registered post-install. |
| Defense Evasion | T1106 | Native API | Tasks registered via the Task Scheduler COM API rather than schtasks.exe, leaving no task-creation command line. |
| Defense Evasion | T1112 | Modify Registry | ProxyEnable, ProxyServer, and AutoConfigURL blanked under HKCU\...\Internet Settings. |
| Discovery | T1016 | System Network Configuration Discovery | C2 module calls WinHttpGetIEProxyConfigForCurrentUser before beaconing. |
| Discovery | T1082 | System Information Discovery | cmd.exe /c chcp 65001 >nul 2>&1 & systeminfo run from inside the wallet process. |
| Command and Control | T1102.002 | Web Service: Bidirectional Communication | Azure Table Storage dead drop (tasking rows T_, result rows R_) instead of a direct beacon. |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | C2 transport rides WinHTTP WebSockets over HTTPS to table.core.windows.net. |
| Command and Control | T1090.002 | Proxy: External Proxy | dll4_socks.dll turns the compromised host into a SOCKS relay. |
| Command and Control | T1219 | Remote Access Software | dll4_vnc.dll creates a hidden, invisible desktop for interactive VNC access. |
| Credential Access | T1555.003 | Credentials from Password Stores: Credentials from Web Browsers | dll4_browser.dll harvests Chrome, Edge, and Firefox saved credentials and autofill data. |
| Credential Access | T1539 | Steal Web Session Cookie | Same module steals session cookies and includes a cookie wiper to force re-authentication. |
Native Audit-Log Hunts
These checks are useful redundancy where Sysmon, Windows auditing, or PowerShell logging run alongside Falcon, or as a fallback where CQL coverage has a documented gap (Section 5).
Task Scheduler operational log
Microsoft-Windows-TaskScheduler/Operational, Event ID 106 (task registered). Filter TaskName for ExdBackupTool or INetHealth. This log captures COM-API task registration even when no schtasks.exe process ever runs, which is the exact gap the actor is exploiting.
PowerShell Script Block Logging
Windows Event ID 4104. Even with an -EncodedCommand base64 blob, script block logging records the decoded content, which will surface the literal InternetSetOption P/Invoke definition and the ProxyEnable/ProxyServer/AutoConfigURL registry writes that make up the INetHealth payload.
Registry auditing on Internet Settings
Windows Security Event ID 4657 (or 4663 with an object-access SACL configured) on HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings, watching ProxyEnable, ProxyServer, and AutoConfigURL. Requires a SACL to be present; verify one is configured before relying on this as a detection source.
MSI installer event log
Application log, source MsiInstaller, Event IDs 1040/1042 (install start/end) and 11707 (success). Cross-reference the install directory captured in these events against %LOCALAPPDATA%\exodus; anything installing Exodus-branded content to %APPDATA% instead is the same signal as Q4, from a different log source.
Sysmon fallback (environments without full Falcon coverage)
Sysmon Event ID 1 (process create) reproduces Q1, Q2, Q4, Q6, and Q12 using Image, ParentImage, and CommandLine in place of the Falcon field names. Sysmon Event ID 11 (file create) reproduces Q9 for the .tmp.node koffi module.
CrowdStrike LogScale CQL Hunt Queries
Looks for: wscript.exe or cscript.exe launched against a filename containing the .pdf.js double extension, the confirmed initial-access chain. IOA candidate: yes.
// HUNT: Double-extension .pdf.js executed by Windows Script Host // MITRE: T1204.002, T1036.007, T1059.007 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: rare; legitimate files almost never carry a .pdf.js double extension // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ FileName=/^(wscript|cscript)\.exe$/i CommandLine=/\.pdf\.js/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Looks for: wscript.exe or cscript.exe, parented by explorer.exe, run against a path containing Explorer's .zip.<n>\ staging fragment, the fingerprint left when a user opens a file inside a ZIP without extracting it first. FP: legitimate ZIP-hosted install scripts (rare but real) can trigger this; correlate with the file's parent archive name before escalating. IOA candidate: no, investigate-only.
// HUNT: ZIP-staged JS executed from Explorer's compressed-folder view // MITRE: T1204.002, T1059.007 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: legitimate vendor-distributed install scripts occasionally ship as a .js inside a .zip // TUNING: exclude known internal software-distribution ZIPs by SHA256 of the parent archive once identified // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ FileName=/^(wscript|cscript)\.exe$/i CommandLine=/\.zip\.\d+\\/i ParentBaseFileName=/^explorer\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Looks for: msiexec.exe run from a two-letter-plus-four-digit-named MSI under a Temp path with the /quiet /norestart flag combination. FP: some legitimate enterprise software also silently installs from Temp with these flags; the naming-pattern regex narrows this considerably. IOA candidate: yes.
// HUNT: Silent MSI install matching the campaign naming and flag pattern // MITRE: T1218.007 // CONF: high // FP: medium // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: some legitimate installers use /quiet /norestart from Temp; the [a-z]{2}\d{4}.msi naming narrows this to the observed campaign pattern // TUNING: exclude known-good silent installers by publisher/hash once your baseline (Section 11) identifies them // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ FileName=/^msiexec\.exe$/i CommandLine=/\\Temp\\[a-z]{2}\d{4}\.msi/i CommandLine=/\/quiet\s+\/norestart/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine])
Looks for: Exodus.exe running from %APPDATA%\ExdBackupTool\ instead of the genuine %LOCALAPPDATA%\exodus path, parented by explorer.exe. This is the single highest-confidence, lowest-noise signal in the pack. IOA candidate: yes, strong promotion candidate to prevent-mode.
// HUNT: Trojanized Exodus install path, wrong location and re-parented launch // MITRE: T1036.005 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: none expected; legitimate Exodus never installs to %APPDATA%\ExdBackupTool\ // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ ImageFileName=/\\AppData\\Roaming\\ExdBackupTool\\Exodus\.exe$/i ParentBaseFileName=/^explorer\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ImageFileName, ParentBaseFileName, CommandLine])
Looks for: scheduled task registration with either campaign task name. Catches the persistence step even when it is registered through the Task Scheduler COM API with no visible command line. IOA candidate: yes.
// HUNT: Suspicious scheduled task registration, ExdBackupTool or INetHealth // MITRE: T1053.005, T1106 // CONF: high // FP: low // COST: low // REQUIRES: ScheduledTaskRegistered // FALSE POSITIVES: none expected; both task names are campaign-specific // ⚠ validate in tenant: confirm ScheduledTaskRegistered fires for tasks created via the Task Scheduler COM API (not just schtasks.exe) on your sensor version // LOOKBACK: 7d (set via console time picker) #event_simpleName=/^ScheduledTaskRegistered$/ TaskName=/^(ExdBackupTool|INetHealth)$/i | table([@timestamp, aid, ComputerName, UserName, TaskName, TaskExecutable])
Looks for: svchost.exe (the Task Scheduler service host) launching Exodus.exe out of the trojanized path, the telemetry signature of the ExdBackupTool task firing. IOA candidate: yes.
// HUNT: Hourly svchost-parented relaunch of the trojanized wallet // MITRE: T1053.005 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: none expected; the install path itself is the malicious signal // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ ImageFileName=/\\AppData\\Roaming\\ExdBackupTool\\Exodus\.exe$/i ParentBaseFileName=/^svchost\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ImageFileName, ParentBaseFileName])
Looks for: conhost.exe with --headless hosting an encoded PowerShell command. FP: Huntress explicitly notes conhost.exe --headless is a legitimate developer pattern for suppressing a console window, not inherently malicious on its own; this query is deliberately broad and needs the pivot to Q8 (proxy registry change) to raise confidence. IOA candidate: no, investigate-only.
// HUNT: Hidden-window PowerShell launched via conhost --headless // MITRE: T1564.003, T1059.001, T1027 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: conhost.exe --headless is a legitimate developer technique for hiding a console window and is used outside this campaign // TUNING: exclude known build/CI tooling that legitimately uses conhost --headless in your environment; escalate only when paired with a Q8 hit on the same host // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ FileName=/^conhost\.exe$/i CommandLine=/--headless/i CommandLine=/powershell/i CommandLine=/-e(ncodedcommand)?\s/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine])
Looks for: writes to the three Internet Settings proxy values that INetHealth blanks to force direct C2 egress. FP: legitimate GPO and SCCM proxy management also writes these values; scope by process context and correlate with Q7. IOA candidate: no, investigate-only.
// HUNT: Proxy configuration tamper, ProxyEnable / ProxyServer / AutoConfigURL cleared // MITRE: T1112, T1016 // CONF: medium // FP: medium // COST: low // REQUIRES: RegGenericValueUpdate or AsepValueUpdate // FALSE POSITIVES: Group Policy and SCCM proxy management legitimately write these same values on a change-control schedule // TUNING: exclude writes from gpupdate.exe, gpscript.exe, and your SCCM client process; escalate only when the writing process is powershell.exe or conhost.exe outside a change window // LOOKBACK: 7d (set via console time picker) #event_simpleName=/RegGenericValueUpdate|AsepValueUpdate/ RegObjectName=/Internet Settings/i RegValueName=/^(ProxyEnable|ProxyServer|AutoConfigURL)$/i | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue])
Looks for: a PE-format file written with the koffi extraction naming pattern, a GUID followed by .tmp.node. FP: other legitimate Node.js native-addon software (Electron apps using FFI libraries) can produce similarly named temp files; treat as a pivot signal rather than a standalone detection. IOA candidate: no, investigate-only.
// HUNT: koffi native module extracted to Temp (.tmp.node) // MITRE: T1620, T1027 // CONF: medium // FP: medium // COST: low // REQUIRES: PeFileWritten or NewExecutableWritten // FALSE POSITIVES: other Electron applications bundling native FFI addons can produce similarly named .tmp.node files // TUNING: correlate the writing process against Q4's trojanized install path before escalating; on its own this is a pivot, not a verdict // LOOKBACK: 7d (set via console time picker) #event_simpleName=/PeFileWritten|NewExecutableWritten/ TargetFileName=/\.tmp\.node$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, TargetFileName])
Looks for: DNS resolution of either Azure Table Storage dead-drop hostname. FP: low; these are specific subdomains, not the parent table.core.windows.net service that many legitimate Azure customers use, so collision with unrelated Azure Storage usage is unlikely. IOA candidate: yes.
// HUNT: C2 beacon to the Azure Table Storage dead drop // MITRE: T1102.002, T1071.001 // CONF: high // FP: low // COST: low // REQUIRES: DnsRequest // FALSE POSITIVES: none expected; these are specific storage-account subdomains, not the shared table.core.windows.net parent domain // ⚠ validate in tenant: ContextBaseFileName population on DnsRequest events can vary by sensor version; confirm it is populated before relying on it for process attribution // LOOKBACK: 7d (set via console time picker) #event_simpleName=/^DnsRequest$/ DomainName=/^(lgapistorage123|winapi)\.table\.core\.windows\.net$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, DomainName])
Looks for: DNS or network-connect activity to the confirmed delivery IP and domain. Perishable: Huntress confirmed this domain was already offline at time of publication; treat any hit as historical unless corroborated by a fresh source. IOA candidate: no, investigate-only, atomic and short-lived.
// HUNT: Known delivery infrastructure contact (IP / domain) // MITRE: T1071.001 // CONF: high // FP: low // COST: low // REQUIRES: DnsRequest, NetworkConnectIP4 // FALSE POSITIVES: none expected while active; the domain was already offline at publication, so a hit is likely historical // LOOKBACK: 30d (this indicator is perishable; widen the window once to sweep for historical hits, then narrow back to 7d) #event_simpleName=/DnsRequest|NetworkConnectIP4/ (DomainName = "us05.org" or RemoteAddressIP4 = "35.212.159.20") | table([@timestamp, aid, ComputerName, UserName, DomainName, RemoteAddressIP4])
Looks for: cmd.exe or systeminfo.exe parented directly by Exodus.exe, the recon step the RAT runs after establishing C2. Legitimate Exodus never spawns child processes of this kind. IOA candidate: yes.
// HUNT: Host recon spawned from the trojanized wallet process // MITRE: T1082 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: none expected; the genuine Exodus wallet does not spawn cmd.exe or systeminfo.exe as children // LOOKBACK: 7d (set via console time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ ParentBaseFileName=/^Exodus\.exe$/i FileName=/^(cmd|systeminfo)\.exe$/i CommandLine=/chcp 65001/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
CrowdStrike Custom IOA Recommendations
Seven of the twelve hunt queries are strong Custom IOA candidates: stable behavioral patterns with low expected false-positive rates that do not depend on perishable atomic indicators.
| Query | IOA Name | Pattern | Exclusions | Deployment Path |
|---|---|---|---|---|
| Q1 | DETECT: PDF.JS Double-Extension WSH Execution (Exodus RAT) | wscript.exe/cscript.exe with CommandLine containing .pdf.js | None identified | Investigate 14 days, then promote to Detect |
| Q3 | DETECT: Silent MSI From Temp Matching Campaign Naming (Exodus RAT) | msiexec.exe, Temp-path MSI matching [a-z]{2}\d{4}.msi, /quiet /norestart | Known internal silent-install tooling, once baselined | Investigate 14 days, then promote to Detect |
| Q4 | PREVENT: Exodus Wallet Wrong Install Path (ExdBackupTool) | Exodus.exe running from %APPDATA%\ExdBackupTool\ | None identified | Investigate 7 days, then promote directly to Prevent; this pattern cannot legitimately fire |
| Q5 | DETECT: ExdBackupTool / INetHealth Scheduled Task Registration | ScheduledTaskRegistered, TaskName in {ExdBackupTool, INetHealth} | None identified | Investigate 7 days, then promote to Detect |
| Q6 | DETECT: Hourly svchost-Launched ExdBackupTool Relaunch | svchost.exe launching Exodus.exe from the trojanized path | None identified | Investigate 14 days, then promote to Detect |
| Q10 | DETECT: Azure Table Storage Dead-Drop Resolution (Exodus RAT) | DnsRequest to lgapistorage123 or winapi table.core.windows.net subdomains | None identified | Investigate 14 days, then promote to Detect |
| Q12 | DETECT: Recon Child Process From Exodus.exe | cmd.exe/systeminfo.exe parented by Exodus.exe with chcp 65001 | None identified | Investigate 14 days, then promote to Detect |
Alert & triage package (representative: Q4, the highest-confidence detection)
Scheduled Search name: DETECT: Exodus Wallet Wrong Install Path (ExdBackupTool)
Scheduled Search description: Fires when Exodus.exe runs from %APPDATA%\ExdBackupTool\ instead of the genuine %LOCALAPPDATA%\exodus path. This path is exclusive to the trojanized installer; there is no legitimate reason for it to exist on a host.
Alert email subject: [CRITICAL] Detection: Exodus Wallet Installer RAT, trojanized wallet path observed
Alert email body: A host has executed Exodus.exe from %APPDATA%\ExdBackupTool\, the install path used exclusively by the trojanized Exodus wallet installer that hides a six-module remote access trojan (hidden VNC, SOCKS proxy, browser credential theft, file management, remote shell, and Lua scripting). Treat this host as a full interactive compromise, not a malware infection: the module set implies an operator may have had hands-on-keyboard access, and any credentials or session cookies in the affected user's browsers should be considered stolen. Immediate actions: network-isolate the host in Falcon, do not power off (preserve volatile memory for potential RAT-module analysis), and open an incident. Escalate to IR on confirmed hit; this query has no known false-positive path.
Triage checklist
- Confirm the alerting process image path is exactly
%APPDATA%\ExdBackupTool\Exodus.exe, not a legitimate Exodus path. - Pull the host's process tree for the prior 30 days; look for the Q1/Q2 delivery pattern (wscript.exe/cscript.exe with a .pdf.js or .zip.<n>\ commandline) as patient zero.
- Check for the Q5 scheduled tasks (
ExdBackupTool,INetHealth) and the Q6 hourly svchost relaunch pattern to establish persistence duration. - Check for Q10/Q11 network activity to confirm active C2 versus a stale, uncommunicating install.
- Network-isolate the host in Falcon Console immediately; do not allow further C2 traffic.
- Identify every browser profile on the host and treat all stored credentials, cookies, and autofill data as compromised.
- Pull a full process listing and network-connection snapshot before remediation, in case hidden VNC or SOCKS activity needs later reconstruction.
- Escalate to IR for scoping across other hosts using Q4 and Q6 environment-wide (see pivot queries below).
Pivot queries
Host-scoped, confirm persistence:
#event_simpleName=/^ScheduledTaskRegistered$/ aid = "<affected-aid>" TaskName=/^(ExdBackupTool|INetHealth)$/i | table([@timestamp, TaskName, TaskExecutable])
Environment-wide, scope the campaign:
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ ImageFileName=/\\AppData\\Roaming\\ExdBackupTool\\Exodus\.exe$/i | groupBy([aid, ComputerName], function=count(as=Hits), limit=1000) | sort(Hits, order=desc)
Environment-wide, confirm active C2:
#event_simpleName=/^DnsRequest$/ DomainName=/^(lgapistorage123|winapi)\.table\.core\.windows\.net$/i | groupBy([aid, ComputerName], function=[count(as=Hits), selectFromMax(field=@timestamp, include=[DomainName])], limit=1000)
Investigate-only queries (Q2, Q7, Q8, Q9, Q11)
These stay as hunt/investigate queries rather than IOA candidates: Q2 and Q7 rely on patterns with legitimate-use overlap (ZIP-staged scripts, conhost --headless), Q8 overlaps with routine GPO/SCCM proxy management, Q9's .tmp.node pattern is a pivot signal shared with other Electron/FFI software, and Q11's atomic indicators are explicitly confirmed short-lived by the source. Run these on a schedule and hand hits to an analyst for correlation rather than auto-alerting.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,c513a7346484ee69a2931c4a89956ee50aa63e4366ef989315e669d8f10d7485,prevent,critical,2027-03-15,Trojanized Exodus Backup Tool MSI installer (jn0101.msi / jg0384.msi label variants); corroborated by 3 independent sources,campaign:ExodusWalletRAT sha256,8c3b41ea5a85778145a6e5772bfee2eb0f8b027d0af199fb71a76dfb8bb29e5a,prevent,critical,2027-03-15,Decrypted modular RAT payload; memory-resident; corroborated by 2 independent sources,campaign:ExodusWalletRAT sha256,fdd376562aac4be64fb635546a61e1912ff2c353360db73d2c553dcbb5a44f54,detect,high,2027-03-15,dll4_fileman.dll RAT file-manager module; single-source (Huntress),campaign:ExodusWalletRAT sha256,2f47cfbb13f7a8a2d30d287f4ddd974fabea6762ad9781d438eb53da41b4582d,detect,high,2027-03-15,dll4_socks.dll RAT SOCKS proxy module; single-source (Huntress),campaign:ExodusWalletRAT sha256,84437d4239d2a3d90c4faad0a3c0630b2f61a40f7bbd12109bef74d7613b8756,detect,high,2027-03-15,dll4_cmd.dll RAT remote command module; single-source (Huntress),campaign:ExodusWalletRAT sha256,5274e93e35586a341d14b50cdf8413d59c51fd94f32bdc70bfdfb77198367603,detect,high,2027-03-15,dll4_script.dll RAT Lua execution module; single-source (Huntress),campaign:ExodusWalletRAT sha256,7e74f6e2eb7a17a8d25bb322a14c392c9d92c6ab29fc66b50221da134a1bdba8,detect,high,2027-03-15,dll4_browser.dll RAT browser-credential theft module; single-source (Huntress),campaign:ExodusWalletRAT sha256,5fe753945da0eaac2c2ef3845cba603dea6c3e8529fa581d7e0192f8af60391a,detect,high,2027-03-15,dll4_vnc.dll RAT hidden-VNC module; single-source (Huntress),campaign:ExodusWalletRAT domain,us05.org,detect,high,2026-10-15,Delivery redirector; 302 to search-ms: WebDAV URI; offline at last vendor check,campaign:ExodusWalletRAT ipv4,35.212.159.20,detect,high,2026-10-15,Hosts jn0101.msi and resolves us05.org,campaign:ExodusWalletRAT domain,lgapistorage123.table.core.windows.net,detect,high,2026-12-15,Azure Table Storage C2 dead drop; primary,campaign:ExodusWalletRAT domain,winapi.table.core.windows.net,detect,medium,2026-12-15,Azure Table Storage C2 dead drop; secondary or staging,campaign:ExodusWalletRAT
Install path: %APPDATA%\ExdBackupTool\Exodus.exe (genuine Exodus uses %LOCALAPPDATA%\exodus)
Parent process: explorer.exe -> Exodus.exe (initial launch), svchost.exe -> Exodus.exe (hourly relaunch)
Scheduled tasks: ExdBackupTool (hourly relaunch), INetHealth (proxy-clearing)
Named mutex: ExodusHelper (single-instance guard; no direct Falcon telemetry, hunt via process pattern)
Temp artifact: %TEMP%\<guid>.tmp.node (koffi native module)
MSI metadata: Manufacturer "Apple Inc", ProductName "Background Service" (both false)
MSI ProductCode: {4046AD2B-3831-4011-AEAD-D98C5C9FD1EF}
MSI UpgradeCode: {C4A1D8F2-3E5B-4C72-9A6D-1B8F0E27A3C9}
Registry remnant: C:\Windows\Installer\SourceHash{4046AD2B-3831-4011-AEAD-D98C5C9FD1EF} (survives directory removal)
Recon command: cmd.exe /c chcp 65001 >nul 2>&1 & systeminfo (spawned from inside Exodus.exe)
jn0101.msi Trojanized installer, campaign A (filename is a per-build label, not stable) jg0384.msi Trojanized installer, campaign B (filename is a per-build label, not stable) exodus_patch.js Suppresses the Electron window (BrowserWindow.show/focus/center override) keystorage.js Reflective PE loader; AES-256-CBC decrypts the RAT in memory dll4_cmd.dll Remote command execution, STDIN/STDOUT over pipes dll4_fileman.dll File browse / upload / download / delete / mkdir dll4_browser.dll Chrome/Edge/Firefox credential, cookie, autofill theft + cookie wiper dll4_socks.dll SOCKS proxy relay dll4_vnc.dll Hidden VNC on an invisible Windows desktop dll4_script.dll Lua scripting engine: injection, registry CRUD, DPAPI, raw sockets @intelcorp/wmi-native-module npm scope impersonating Intel; used for COM/WMI host recon
\# Check whether known file extensions are hidden (1 = hidden, the risky default)
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name HideFileExt
\# Check WebClient (WebDAV) service state
Get-Service -Name WebClient | Select-Object Status, StartType
\# Check current proxy configuration for tamper
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyEnable, ProxyServer, AutoConfigURL
\# Check Defender ASR rule state for the obfuscated-script rule
Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids
\# Look for the trojanized install path directly
Test-Path "$env:APPDATA\ExdBackupTool\Exodus.exe"
\# Look for the two campaign scheduled tasks
Get-ScheduledTask | Where-Object { $_.TaskName -in @('ExdBackupTool','INetHealth') }
JSON indicator array
[
{"type":"sha256","value":"c513a7346484ee69a2931c4a89956ee50aa63e4366ef989315e669d8f10d7485","desc":"Trojanized Exodus Backup Tool MSI"},
{"type":"sha256","value":"8c3b41ea5a85778145a6e5772bfee2eb0f8b027d0af199fb71a76dfb8bb29e5a","desc":"Decrypted modular RAT payload"},
{"type":"sha256","value":"fdd376562aac4be64fb635546a61e1912ff2c353360db73d2c553dcbb5a44f54","desc":"dll4_fileman.dll"},
{"type":"sha256","value":"2f47cfbb13f7a8a2d30d287f4ddd974fabea6762ad9781d438eb53da41b4582d","desc":"dll4_socks.dll"},
{"type":"sha256","value":"84437d4239d2a3d90c4faad0a3c0630b2f61a40f7bbd12109bef74d7613b8756","desc":"dll4_cmd.dll"},
{"type":"sha256","value":"5274e93e35586a341d14b50cdf8413d59c51fd94f32bdc70bfdfb77198367603","desc":"dll4_script.dll"},
{"type":"sha256","value":"7e74f6e2eb7a17a8d25bb322a14c392c9d92c6ab29fc66b50221da134a1bdba8","desc":"dll4_browser.dll"},
{"type":"sha256","value":"5fe753945da0eaac2c2ef3845cba603dea6c3e8529fa581d7e0192f8af60391a","desc":"dll4_vnc.dll"},
{"type":"domain","value":"us05.org","desc":"Delivery redirector, offline at last check"},
{"type":"ipv4","value":"35.212.159.20","desc":"Delivery / resolver IP"},
{"type":"domain","value":"lgapistorage123.table.core.windows.net","desc":"Azure Table Storage C2 dead drop, primary"},
{"type":"domain","value":"winapi.table.core.windows.net","desc":"Azure Table Storage C2 dead drop, secondary"}
]
Detection Validation Gates
| Gate | Action | Pass Criteria |
|---|---|---|
| Telemetry ready | Confirm ProcessRollup2, DnsRequest, RegGenericValueUpdate, and ScheduledTaskRegistered are flowing for the target host population. | All four event types present for the last 24h across >=95% of in-scope hosts. |
| Benign baseline | Run Q1, Q2, Q3, and Q7 over a trailing 30-day window before enabling any prevent-mode IOA. | Document every legitimate hit (build tooling, internal installers) as a named exclusion. |
| Positive test | In an isolated lab, reproduce each Q1-Q12 pattern with a benign stand-in (e.g. spawn wscript.exe against a dummy test.pdf.js; run msiexec against a harmless MSI with matching flags and naming). | Every query fires against its lab reproduction. |
| Promotion criteria | Move a query from Investigate to Custom IOA prevent-mode. | Zero false positives over a 14-day observation window (7 days for Q4, given near-zero legitimate-overlap risk). |
Hardening, Tiered
- Enable file-extension visibility fleet-wide. Defeats the
.pdf.jsdouble-extension trick outright. MITRE M1038 (Execution Prevention). No formal CIS Benchmark item covers this specific registry key by name, but it is a standard Microsoft security guidance recommendation.⚠ best-practice, no formal benchmark citation for this exact key. - Enable the Defender Attack Surface Reduction rule "Block execution of potentially obfuscated scripts" (GUID
5beb7efe-fd9a-4556-801d-275e5ffc04cc), in audit mode first. MITRE M1038, Microsoft Defender ASR reference documentation. - Disable the WebClient (WebDAV Client) service on hosts that do not need WebDAV, closing the documented
search-ms:302-redirect delivery path. MITRE M1042 (Disable or Remove Feature or Program). - Import the prevent/critical hashes (MSI, decrypted RAT payload) into Falcon IOC Management and the detect/high hashes (six DLL modules) for visibility. MITRE M1040 (Behavior Prevention on Endpoint).
- Deploy AppLocker or WDAC policy requiring signed MSI packages for interactive install, or at minimum alert on unsigned MSI execution. MITRE M1045 (Code Signing). This is a broad, threat-agnostic control that also blunts the next unsigned-installer campaign.
- Restrict local scheduled-task creation to administrators via GPO and forward the Task Scheduler operational log (Event ID 106/140/141/200/201) to your SIEM, closing the COM-API blind spot that
schtasks.exe-focused detections miss. MITRE M1047 (Audit) / M1028 (Operating System Configuration). - Enforce proxy configuration via GPO with a short refresh interval and alert on out-of-window changes to
ProxyEnable/ProxyServer/AutoConfigURL. MITRE M1024 (Restrict Registry Permissions). - Roll out browser credential-store hardening (Chrome/Edge App-Bound Encryption, equivalent Firefox OS-level protection) to blunt
dll4_browser-class theft even on an already-compromised host. MITRE M1041 (Encrypt Sensitive Information).
- Coordinate with the cloud/network team on an egress-monitoring rule for
*.table.core.windows.netthat flags unsanctioned endpoint-originated traffic rather than blocking the shared Azure Storage service outright. MITRE M1037 (Filter Network Traffic). - Roll out Credential Guard and HVCI on managed Windows endpoints to raise the cost of in-memory reflective loading and credential harvesting generally. MITRE M1040, Microsoft Security Baseline guidance.
- Require cryptocurrency wallet and other sensitive financial software to be installed only via managed software deployment (Intune/SCCM) from an internal, vetted repository rather than ad hoc downloads. MITRE M1038 / M1033 (Limit Software Installation). This is the structural fix for the initial-access vector, not just this campaign.
Deployable Playbooks
Playbook A: Enable file-extension visibility fleet-wide
\# Deploy via GPO Preference or login script; per-user HKCU value Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name HideFileExt -Value 0 Stop-Process -Name explorer -Force \# restarts Explorer to apply immediately for the interactive session
Playbook B: Enable the obfuscated-script ASR rule (audit mode first)
\# Audit mode first Set-MpPreference -AttackSurfaceReductionRules_Ids 5beb7efe-fd9a-4556-801d-275e5ffc04cc -AttackSurfaceReductionRules_Actions AuditMode \# After a clean audit window, switch to enforced Set-MpPreference -AttackSurfaceReductionRules_Ids 5beb7efe-fd9a-4556-801d-275e5ffc04cc -AttackSurfaceReductionRules_Actions Enabled \# Rollback Set-MpPreference -AttackSurfaceReductionRules_Ids 5beb7efe-fd9a-4556-801d-275e5ffc04cc -AttackSurfaceReductionRules_Actions Disabled
Playbook C: Disable the WebClient (WebDAV) service
\# Disable Set-Service -Name WebClient -StartupType Disabled Stop-Service -Name WebClient -Force \# Rollback Set-Service -Name WebClient -StartupType Manual Start-Service -Name WebClient
Playbook D: Eradication script, confirmed-compromised host
\# Stop the trojanized wallet process Get-Process -Name Exodus -ErrorAction SilentlyContinue | Stop-Process -Force \# Remove both campaign scheduled tasks Unregister-ScheduledTask -TaskName 'ExdBackupTool' -Confirm:$false -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName 'INetHealth' -Confirm:$false -ErrorAction SilentlyContinue \# Remove the install directory (per-user path; run once per affected profile) Remove-Item -Path "$env:APPDATA\ExdBackupTool" -Recurse -Force -ErrorAction SilentlyContinue \# Restore proxy settings per your organization's standard GPO-managed values, then force re-apply gpupdate /target:user /force \# Note: the MSI SourceHash registry remnant under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer \# survives directory removal per the source reporting; verify it no longer resolves to a live install \# before considering the MSI uninstall registration fully cleaned.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon immediately. Do not power off; preserve volatile memory. Block the confirmed delivery IP/domain and the Azure Table Storage dead-drop hostnames at the proxy/firewall where feasible (note: the Azure hostnames are shared infrastructure, prefer alert-and-review over blanket block per Section 12). | SOC / IR on-call | Falcon isolation confirmation, network-connection snapshot pre-isolation |
| Eradicate | Run Playbook D: kill the Exodus.exe process tree, remove both scheduled tasks, delete the %APPDATA%\ExdBackupTool\ directory, verify the MSI SourceHash registry remnant, and force a GPO refresh to restore proxy settings. | IR / endpoint engineering | Playbook D execution log, before/after Get-ScheduledTask and Test-Path output |
| Recover | Rotate all credentials and revoke active sessions for every account used in a browser on the affected host; do not rely on a password reset alone, since stolen session cookies survive it. Reissue any API keys or secrets found in browser-stored autofill or extensions. Reimage the host if hidden-VNC or SOCKS-proxy activity is confirmed in the investigation. Monitor the host and the affected user's accounts for 30 days using Q4, Q6, and Q10. | IR / identity team / affected user's manager | Credential-rotation confirmation, 30-day monitoring log, closure report |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1204.002 / T1036.007 | Double-extension .pdf.js lure execution | Q1 | Yes | Good |
| T1204.002 | ZIP-staged JS execution | Q2 | No | Partial |
| T1218.007 | Silent MSI install | Q3 | Yes | Good |
| T1036.005 | Wrong-path trojanized install | Q4 | Yes | Good |
| T1620 | In-process reflective PE loading of the RAT | None (in-process JS behavior, no discrete Falcon event) | No | Gap |
| T1027 | Named mutex ExodusHelper (single-instance guard) | None (no Falcon mutex-creation event) | No | Gap |
| T1620 (koffi artifact) | .tmp.node native module extraction | Q9 | No | Partial |
| T1053.005 / T1106 | ExdBackupTool / INetHealth task registration | Q5 | Yes | Good |
| T1053.005 | Hourly svchost-launched relaunch | Q6 | Yes | Good |
| T1564.003 / T1059.001 | Hidden-window PowerShell (INetHealth payload) | Q7 | No | Partial |
| T1112 / T1016 | Proxy configuration tamper | Q8 | No | Partial |
| T1102.002 / T1071.001 | Azure Table Storage C2 dead drop | Q10 | Yes | Good |
| T1071.001 (delivery infra) | Known IP/domain contact | Q11 | No | Partial (atomic, perishable) |
| T1082 | Recon command from wallet process | Q12 | Yes | Good |
| T1555.003 / T1539 | Browser credential, cookie, autofill theft | None (no Falcon telemetry for DPAPI/credential-store access) | No | Gap, IOC-hash-based coverage only (Section 10) |
| T1090.002 | SOCKS proxy relay module in use | None (would surface as anomalous outbound connection volume, not a discrete event) | No | Gap |
| T1219 | Hidden VNC module in use | None (invisible-desktop VNC has no discrete Falcon event) | No | Gap |
Validation-gate summary: telemetry readiness, benign baselining, positive lab testing, and promotion criteria are detailed in Section 11. Do not enable prevent-mode on any IOA candidate before its 14-day (7-day for Q4) clean observation window completes.
Hunt Summary Ticket
TITLE: Hunt for Exodus Wallet Installer RAT (trojanized MSI, modular in-memory RAT)
SEVERITY: High / Active
SCOPE: Windows endpoints; crypto-wallet users and general user population (delivery does not require crypto interest, only opening a lure file)
HYPOTHESIS: A trojanized Exodus wallet installer is running on one or more hosts, installed via a
.pdf.js or ZIP-staged JS lure, hiding a six-module memory-resident RAT with hidden VNC,
SOCKS proxy, and browser credential theft, persisting via two scheduled tasks and
beaconing to an Azure Table Storage dead drop.
QUERIES: Q1-Q12 (Section 8); IOA candidates Q1, Q3, Q4, Q5, Q6, Q10, Q12 (Section 9)
DO FIRST: Run Q4 and Q6 environment-wide. Both are near-zero-FP and directly confirm or rule out
the trojanized install path. Then run Q10 to check for active C2.
FINDINGS: [populate after hunt execution]
GAPS: No Falcon telemetry for named-mutex creation (ExodusHelper), in-process reflective PE
loading, or browser DPAPI/credential-store access. Covered indirectly via process-tree
proxies and IOC-hash matching; see Section 15.
ACTIONS: Deploy Q4 and Q6 to prevent-mode after a 7-day clean baseline (Section 11). Deploy the
remaining IOA candidates after a 14-day clean baseline. Roll out Immediate-tier hardening
(Section 12) this week regardless of hunt findings.
OWNER: HuntPack
VERSION: v0.1 · 2026-09-15
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| Tier 1 (Primary) | Huntress: "The Crypto Wallet That Never Opened: Tampered Exodus Installer Hides a Modular RAT" (published 2026-09-01) | Full technical detail: delivery chains, MSI internals, obfuscation and decryption method, all six RAT modules, C2 mechanics, complete IOC set, mitigation guidance | 2026-09-15 |
| Tier 2 (Corroborating) | GBHackers: "Trojanized Exodus Wallet Installer Deploys RAT to Steal Browser Credentials and Cookies" | Second-source confirmation of MSI SHA-256, RAT payload SHA-256, install path, and scheduled task names | 2026-09-15 |
| Tier 2 (Corroborating) | Cyberpress: "Malicious Exodus Installer Steals Browser Credentials and Turns PCs Into SOCKS Proxies" | Third-source confirmation of MSI filename, MSI SHA-256, install path, and the search-ms: WebDAV delivery capability | 2026-09-15 |