MuddyWater — Iranian MOIS Espionage APT
Executive Summary
MuddyWater (a.k.a. Mango Sandstorm, TA450, Seedworm, Earth Vetala, MERCURY, Static Kitten, G0069) is a cyber-espionage group attributed to Iran's Ministry of Intelligence and Security (MOIS), active since 2017. In early 2026, amid Middle-East tensions, the group escalated against Israeli government, military, financial, telecom, and maritime targets (and GCC critical infrastructure) with a new Rust-based implant, RustyWater, built for stealth and persistence.
MuddyWater's defining tradecraft is a custom PowerShell command-and-control lineage that it continually rebuilds — POWERSTATS → MuddyC3 → PhonyC2 → MuddyC2Go (the current Go-based framework that side-loads and runs an embedded PowerShell C2 agent) → DarkBeatC2. It pairs this with aggressive abuse of legitimate RMM tools (Atera, ScreenConnect, SimpleHelp, N-able) for persistence and remote control, plus spearphishing, LOLBins, and exploitation of internet-facing apps. Because the RMM and PowerShell are legitimate, behavior — not signatures — is the detection target.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Deep Instinct — MuddyC2Go | Go-based C2 framework; embedded PowerShell agent; Israel targeting | yes |
| 1 · News of record | CSO Online / Rescana — RustyWater | 2026 Rust implant; stealth/persistence; Israeli gov & infra targeting | yes |
| 1 · Vendor research | Picus / eSentire — Iranian threat actors / MuddyWater exposed | C2 lineage (POWERSTATS→MuddyC3→PhonyC2→MuddyC2Go→DarkBeatC2); RMM abuse list; LOLBins | yes |
| 2 · Reference | MITRE ATT&CK G0069 · Horizon3 Iranian APT report | Technique mapping, aliases, RMM & PowerShell TTPs | yes |
Decisions: behavior-first (custom C2 + RMM rotate, but the patterns persist); anchor on RMM-on-non-IT-host + the MuddyC2Go Go-loader→PowerShell-C2 chain + RustyWater; geopolitically-scoped (Israel/GCC) so relevant orgs should run this at elevated priority.
Hunt Brief & Attack Chain
Working hypothesis: MuddyWater gains access via spearphishing or an exploited internet-facing app, installs an RMM agent for resilient remote control, runs MuddyC2Go's embedded PowerShell C2 and/or the RustyWater implant, and conducts espionage with LOLBins.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Initial access | Spearphishing (archive/installer lure) or exploited edge app | ProcessRollup2; mail/proxy | Q5; N1 |
| 2 · RMM foothold | Atera/ScreenConnect/SimpleHelp/N-able agent installed for remote control | ProcessRollup2; ServiceInstalled | Q1; N2 |
| 3 · C2 | MuddyC2Go Go-loader runs an embedded PowerShell C2 agent | ProcessRollup2; NetworkConnectIP4 | Q2 / Q3 |
| 4 · Implant | RustyWater (Rust RAT) deployed for persistence | ProcessRollup2; file write | Q4 |
| 5 · Recon / collection | LOLBins; AD discovery; data staging | ProcessRollup2 | Q6 |
| 6 · Persistence | Scheduled task / service / Run key for C2/RMM | task/service/registry | N3 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints / servers | Process lineage + command line (ProcessRollup2) | Critical | Low — standard sensor |
| RMM agents | Process/service install; software inventory | High | Low — reliable |
| PowerShell C2 | Script-block logging (4104); command line; egress | High | Medium — enable 4104 |
| Edge / mail | Mail gateway; appliance/VPN logs | Medium | Medium — initial access |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Behavior | RMM agent (Atera/ScreenConnect/SimpleHelp/N-able) on a non-IT host | high | detect | MuddyWater foothold — flagship |
| Tooling | MuddyC2Go · PhonyC2 · DarkBeatC2 · POWERSTATS · MuddyC3 | high | hunt | Custom PowerShell-C2 lineage |
| Implant | RustyWater (Rust RAT, 2026) | medium | hunt | Stealthy persistence implant |
| Behavior | Go binary side-loads + runs an embedded PowerShell C2 agent | high | detect | MuddyC2Go execution pattern |
| Behavior | hidden/encoded PowerShell beaconing to external host | medium | hunt | POWERSTATS/MuddyC2Go agent |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1566.001 / T1190 — Spearphishing / exploit public app | Archive/installer lure; edge exploitation | Q5; N1 |
| Command & Control | T1219 — Remote Access Software (RMM) | Atera/ScreenConnect/SimpleHelp/N-able abuse | Q1; N2 |
| Execution / C2 | T1059.001 — PowerShell (MuddyC2Go / POWERSTATS) | Go-loader → embedded PowerShell C2 agent | Q2, Q3 |
| Defense Evasion | T1027 / T1620 — Obfuscation / in-memory load | Encoded/hidden PowerShell; Rust implant | Q3, Q4 |
| Discovery | T1087 / T1082 / T1018 — Account / system / network | LOLBin reconnaissance | Q6 |
| Persistence | T1053.005 / T1543.003 — Scheduled task / service | C2/RMM auto-start | N3 |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Spearphishing delivery | Mail gateway / EID 4688 | Archive/installer attachment → script/installer execution preceding RMM/C2 | Sweep host; quarantine sender |
| N2 · Unsanctioned RMM | Software inventory / service install | Atera/ScreenConnect/SimpleHelp/N-able present on a host with no IT-support justification | Investigate; uninstall; treat as intrusion |
| N3 · C2 persistence | Task Scheduler / Services / Run keys | Auto-start entries running PowerShell or an unsigned Go binary that beacons | Remove; isolate |
| N4 · PowerShell C2 | EID 4104 (Script Block Logging) | Obfuscated blocks with web beaconing / download-and-exec (POWERSTATS/MuddyC2Go) | Extract C2; block; investigate fleet |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Env edit: if any RMM tool is sanctioned, allow-list its managed deploy + the IT-support host group in Q1.Looks for: RMM agents MuddyWater abuses, on endpoints outside the sanctioned support fleet. Accomplishes: the highest-value foothold signal. FP: sanctioned RMM — allow-list its deploy + IT host group.
// HUNT: MuddyWater RMM abuse (RMM agent on a non-IT host) // MITRE: T1219 | CONF: high FP: medium COST: low // TUNING: allow-list any sanctioned RMM + the IT-support host group #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(atera|AteraAgent|ScreenConnect|Connectwisecontrol|SimpleHelp|remote_access|Windows-?Agent|BASupSrvc|syncro|N-?able|takecontrol)[^\\]*\.exe$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName], limit=200)
Looks for: a binary from a user-writable path spawning powershell.exe with download/exec or hidden-window flags. Accomplishes: the MuddyC2Go loader→PowerShell-C2 pattern. FP: some installers — verify the path + command.
// HUNT: MuddyC2Go loader spawning an embedded PowerShell C2 agent // MITRE: T1059.001, T1027 | CONF: high FP: low-med COST: low // TUNING: exclude sanctioned installers; focus on user-path parents + hidden/iex commands #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^powershell\.exe$/i | ParentImageFileName=/\\(ProgramData|Users\\[^\\]+\\AppData|Temp)\\.+\.exe$/i | CommandLine=/(-w\s+hidden|-windowstyle\s+hidden|-nop|-ep\s+bypass|iex|FromBase64String|DownloadString|Invoke-WebRequest)/i | table([@timestamp, ComputerName, UserName, ParentImageFileName, CommandLine], limit=200)
Looks for: powershell.exe making repeated outbound connections to an external host. Accomplishes: POWERSTATS/MuddyC2Go agent C2. FP: admin scripts — scope to external, correlate with Q2/4104.
// HUNT: PowerShell C2 beacon (POWERSTATS / MuddyC2Go agent) // MITRE: T1059.001, T1071.001 | CONF: medium FP: medium COST: medium // TUNING: exclude internal/admin endpoints; correlate to Q2 + EID 4104 #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^powershell\.exe$/i | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: a freshly-written executable in a user path that beacons, consistent with the RustyWater implant. Accomplishes: catches the 2026 implant. FP: correlate write→exec→network; verify with vendor hashes when available.
// HUNT: RustyWater implant (user-path exe write -> exec -> beacon) // MITRE: T1105, T1071.001 | CONF: medium FP: low-med COST: low // TUNING: add vendor RustyWater hashes/paths as published; correlate to Q1/Q2 on same aid #event_simpleName=/NewExecutableWritten|PeFileWritten/ | TargetFileName=/\\(ProgramData|Users\\[^\\]+\\AppData|Temp)\\.+\.(exe|dll)$/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData], limit=200)
Looks for: Office/archive apps spawning script hosts / installers (MuddyWater lure chain). FP: some legit macros/installers — correlate with a following RMM/C2 hit.
// HUNT: MuddyWater spearphishing execution lineage // MITRE: T1566.001, T1204.002 | CONF: medium FP: medium COST: low // TUNING: correlate to a following Q1/Q2 hit; exclude sanctioned macro/installer flows #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(winword|excel|powerpnt|outlook|WinRAR|Rar|7zFM)\.exe$/i | FileName=/^(powershell|pwsh|mshta|wscript|cscript|cmd|msiexec)\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: a burst of built-in discovery commands on a host with a recent RMM/C2 hit. Accomplishes: the espionage recon stage. FP: admin scripts — correlate with Q1/Q2/Q3.
// HUNT: MuddyWater LOLBin reconnaissance // MITRE: T1087, T1082, T1018 | CONF: medium FP: medium COST: low // TUNING: scope to hosts with a recent Q1/Q2/Q3 hit; allow-list admin AIDs #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(whoami|nltest|net|net1|systeminfo|ipconfig|tasklist|quser|qwinsta|arp|route|netstat|dsquery)\.exe$/i | groupBy([aid, ComputerName, UserName], function=[count(), collect([FileName, CommandLine], limit=20)]) | _count >= 5 | sort(_count, order=desc)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| MuddyWater — unsanctioned RMM agent | Image matches abused RMM agents (Atera/ScreenConnect/SimpleHelp/N-able) outside the sanctioned host group | Sanctioned RMM + IT-support host group | Endpoint Security → Custom IOA → Process Creation |
| MuddyWater — user-path binary spawns hidden PowerShell C2 | Parent *\ProgramData\*/*\AppData\* exe; Child powershell.exe with hidden/iex/encoded | Sanctioned installers (allow-list) | Custom IOA → Process Creation |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for detection and RMM governance. MuddyWater rebuilds infrastructure constantly — behavior + the tool lineage are durable; add per-incident atoms during triage.
AteraAgent.exe / atera* # Atera RMM ScreenConnect / Connectwisecontrol*.exe # ScreenConnect / CW Control SimpleHelp (remote_access.exe / *Support*) # SimpleHelp N-able / BASupSrvc.exe / takecontrol* # N-able Take Control syncro* / Windows-Agent* # other RMM seen in MuddyWater intrusions # Inventory + alert on ANY of these outside the sanctioned IT-support fleet
RustyWater # 2026 Rust-based RAT implant (current) MuddyC2Go # current Go-based C2 framework (embedded PowerShell agent) PhonyC2 # prior PowerShell C2 framework (largely retired) MuddyC3 / POWERSTATS # earlier PowerShell C2 / backdoor lineage DarkBeatC2 / Dindoor # additional custom C2 / tooling # Aliases: Mango Sandstorm, TA450, Seedworm, Earth Vetala, MERCURY, Static Kitten, MuddyKrill (G0069)
RMM agent (Atera/ScreenConnect/SimpleHelp/N-able) on a non-IT host User-path binary (ProgramData/AppData) spawning powershell -w hidden / -nop / iex (MuddyC2Go) powershell.exe beaconing repeatedly to an external host (POWERSTATS/MuddyC2Go agent) Office/archive app spawning powershell/mshta/msiexec (spearphishing lure) LOLBin recon burst (whoami/nltest/net/systeminfo) on a host with an RMM/C2 hit Freshly-written user-path exe/dll that beacons (RustyWater implant)
# RMM governance is the single biggest win against MuddyWater: WDAC/AppLocker: allow only ONE sanctioned RMM tool; deny all others (Atera/SimpleHelp/N-able/etc.) PowerShell Constrained Language Mode + ScriptBlock logging (4104) + AMSI Block executable content from email; ASR rules; patch internet-facing apps Egress: alert on PowerShell/Go-binary outbound to non-corporate hosts MFA on all external access; geo/risk-based conditional access (Israel/GCC orgs: elevated priority)
Hardening — Tiered & Deployable
RMM governance + PowerShell constraint cut MuddyWater's two favorite primitives.
- WDAC/AppLocker: sanction ONE RMM tool; deny all others — M1038 / M1042. Atera/ScreenConnect/SimpleHelp/N-able outside the sanctioned deploy = block. Directly defeats Q1.
- PowerShell Constrained Language Mode + ScriptBlock logging (4104) + AMSI — M1038 / M1040 / M1049. Blunts MuddyC2Go/POWERSTATS; feeds Q3/N4.
- Block executable content from email; ASR rules — M1042. Cuts the spearphishing lure.
- Patch internet-facing apps; MFA on all external access — M1051 / M1032.
- Inventory + alert on any RMM agent outside the IT fleet — M1042. Feeds Q1/N2.
- Egress control: alert on PowerShell/Go-binary outbound to non-corporate hosts — M1037.
- Monitor scheduled tasks/services running PowerShell or unsigned Go binaries — M1018. Feeds N3.
- Application allowlisting enterprise-wide — M1038. Denies custom implants & unsanctioned RMM.
- Tier 0/1/2 admin model; least privilege — M1026. Limits espionage reach.
- Geopolitically-aware monitoring (Israel/GCC orgs): elevated priority + threat-intel feeds — M1047.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host(s); cut external access for implicated accounts; preserve the RMM agent + PowerShell artifacts | SOC L2 | Containment timestamp; Q1/Q2 events |
| Triage | Map spearphishing → RMM → C2 → implant timeline; extract C2 from 4104; scope which hosts share the RMM/cert | IR | Process/script timeline; C2 |
| Eradicate | Remove RMM/implant + persistence; block C2; reset all credentials touched (espionage = assume broad theft) | IR | Removal log; cred reset |
| Recover | Rebuild compromised hosts; rotate creds/keys; verify no lateral foothold to DCs/sensitive systems | IR + IT | Rebuild tickets; lateral review |
| Harden | Deny unsanctioned RMM; PowerShell CLM; promote Q1/Q2 IOAs; raise monitoring priority | Detection Eng | Control status; IOA enabled |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1219 | RMM foothold | Q1 | IOA-1 | Good with allow-list |
| T1059.001 | MuddyC2Go loader → PowerShell C2 | Q2 | IOA-2 | Good |
| T1071.001 | PowerShell C2 beacon | Q3 | — | Partial + EID 4104 (N4) |
| T1105 | RustyWater implant | Q4 | — | Partial add vendor hashes |
| T1566.001 | Spearphishing lineage | Q5 | — | Partial + mail gw (N1) |
| T1087 / T1082 / T1018 | LOLBin recon | Q6 | — | Partial correlate |
Validation gates: (1) confirm process + command-line + 4104 telemetry; (2) enumerate sanctioned RMM + IT host group (allow-list for Q1); (3) lab-test a benign user-path binary → powershell -w hidden (Q2) and a benign RMM install on a test host (Q1); (4) promote Q1/Q2 to Custom IOA; keep Q3–Q6 correlated. Israel/GCC orgs: run at elevated priority.
Hunt Summary Ticket
TITLE: Hunt — MuddyWater (Iranian MOIS espionage APT)
SEVERITY: Critical (nation-state espionage; broad credential/data theft)
SCOPE: Windows endpoints/servers; Israel/GCC orgs at elevated priority
HYPOTHESIS: Spearphishing / edge exploit -> RMM foothold (Atera/ScreenConnect/SimpleHelp/
N-able) -> MuddyC2Go Go-loader -> embedded PowerShell C2 -> RustyWater implant
-> LOLBin recon / espionage.
QUERIES RUN: Q1 RMM on non-IT host (IOA) | Q2 Go-loader -> hidden PowerShell (IOA) |
Q3 PowerShell C2 beacon | Q4 RustyWater implant | Q5 phishing lineage |
Q6 LOLBin recon burst
+ Native N1-N4 (mail gw, RMM inventory, persistence, 4104 PowerShell C2)
DO FIRST: Q1, Q2 — treat any hit as a nation-state intrusion; escalate to IR
FINDINGS: <pending analyst execution>
GAPS: C2 atoms perishable; RustyWater needs vendor hashes; edge access needs appliance logs
ACTIONS: Deny unsanctioned RMM (WDAC/AppLocker); PowerShell CLM + 4104; ASR; MFA; promote Q1/Q2
OWNER: HuntPack
VERSION: v0.4 - 2026-06-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Deep Instinct — MuddyC2Go | Current Go-based C2 framework; embedded PowerShell agent |
| 1 | CSO Online — MuddyWater Rust implant (RustyWater) | 2026 RustyWater implant; targeting |
| 1 | Picus — Iranian threat actors · eSentire — MuddyWater exposed | C2 lineage, RMM abuse list, LOLBins |
| 2 | MITRE ATT&CK — MuddyWater (G0069) | Aliases, technique mapping |
HuntPack v0.3 · MuddyWater (Iran/MOIS) · Generated 2026-06-12 · Defensive use only — no offensive code. The group rebuilds infrastructure constantly; the durable signals are RMM-on-non-IT-host, the MuddyC2Go→PowerShell-C2 pattern, and RustyWater. Validate field names and sanctioned-RMM allow-lists in your tenant before promoting any query.