ChainShell: MuddyWater e il MaaS russo
Detection stack
- AIDR
- Alert
- ETL
- Query
Riepilogo
MuddyWater, un attore di spionaggio collegato all’Iran, sta sfruttando la piattaforma malware-as-a-service russa TAG-150 per consegnare CastleRAT e un più recente agente C2 abilitato per blockchain in Node.js, tracciato come ChainShell, contro obiettivi israeliani e di alto valore. L’attività è supportata da un server web C2 esposto e mal configurato, da uno script di deployer PowerShell (reset.ps1) e da payload PE nascosti tramite steganografia. Diverse versioni di CastleRAT (inclusi Build 120 e Build 13) contengono identificatori hard-coded condivisi che puntano allo stesso lignaggio MaaS. L’infrastruttura backend sembra essere basata su campagne, utilizzando domini condivisi (ad esempio, serialmenot.com) e credenziali JWT per operazione per separare l’accesso e il tracciamento tra le implementazioni.
Indagine
JUMPSEC ha esaminato l’host C2 esposto, recuperato 15 campioni di malware e collegato la logica di distribuzione di reset.ps1 alla consegna sia di ChainShell che di molteplici build di CastleRAT. Gli investigatori hanno anche correlato i certificati di firma del codice (Amy Cherne e Donald Gay) visti negli strumenti noti di MuddyWater all’installatore MSC TAG-150, formandone una pista di attribuzione ad alta fiducia. Sono state osservate ulteriori sovrapposizioni tra i campioni nei marcatori di build hard-coded, nelle convenzioni di denominazione delle attività programmate ricorrenti e negli ID di campagna JWT incorporati negli strumenti e negli artefatti lato server.
Mitigazione
Monitora per reset.ps1, attività programmate associate e artefatti unici di mutex o percorso di file collegati a CastleRAT e ChainShell. Blocca l’infrastruttura TAG-150 nota, inclusi serialmenot.com, ttrdomennew.com e sharecodepro.com, e esamina l’installazione di componenti Node.js guidata da PowerShell. Imposta controlli severi di firma del codice e convalida i certificati sospetti rispetto al materiale di firma noto collegato a MuddyWater.
Risposta
Se vengono trovati indicatori, isola gli endpoint interessati, cattura immagini complete del disco e della memoria e cerca residui aggiuntivi di CastleRAT e ChainShell. Revoca o considera non attendibili i certificati di firma del codice compromessi, reimposta le credenziali interessate e coordina la segnalazione con i CERT nazionali rilevanti. Rivedi la telemetria di rete per gli schemi di accesso RPC Ethereum e l’uso di JWT legato al flusso di comando e controllo di serialmenot.com.
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef technique fill:#c2f0c2 classDef malware fill:#ff9999 classDef process fill:#ffd966 %% Nodes action_phishing["<b>Azione</b> – <b>T1566.002 Phishing</b><br/>Documento macro-malintenzionato (ClickFix/BatClickFix) consegnato via email"] class action_phishing action action_user_exec["<b>Azione</b> – <b>T1204.002 Esecuzione Utente</b><br/>La vittima apre il documento scatenando PowerShell"] class action_user_exec action tool_powershell["<b>Strumento</b> – <b>T1059.001 PowerShell</b><br/>Interprete di script utilizzato per caricare il loader"] class tool_powershell tool tool_cmstp["<b>Strumento</b> – <b>T1218.003 CMSTP</b><br/>Esecuzione di proxy binario di sistema che carica file INF maligni"] class tool_cmstp tool technique_dll_sideload["<b>Tecnica</b> – <b>T1574.002 DLL Side-loading</b><br/>DLL malevoli caricati tramite INF"] class technique_dll_sideload technique technique_dll_hijack["<b>Tecnica</b> – <b>T1574.005 Compromissione del Flusso di Esecuzione</b><br/>userenv.dll e xmllite.dll malevoli posizionati accanto ai binari legittimi"] class technique_dll_hijack technique technique_scheduled_task["<b>Tecnica</b> – <b>T1543.001 Creazione o Modifica Processo di Sistema</b><br/>Attività programmate (VirtualSmokestGuy120/666) per persistenza"] class technique_scheduled_task technique technique_steganography["<b>Tecnica</b> – <b>T1027.003 Steganografia</b><br/>Payload PE nativi nascosti dentro immagini JPEG"] class technique_steganography technique technique_embedded_payload["<b>Tecnica</b> – <b>T1027.009 Payload Incorporati</b><br/>Payload aggiuntivi ulteriormente nascosti"] class technique_embedded_payload technique technique_data_obfusc["<b>Tecnica</b> – <b>T1001 Offuscamento dei Dati</b><br/>Criptatura AES-256-CBC del traffico C2"] class technique_data_obfusc technique technique_uac_bypass["<b>Tecnica</b> – <b>T1548.002 Sfruttamento del Meccanismo di Controllo Elevazione</b><br/>Esecuzione CMSTP aggira UAC"] class technique_uac_bypass technique technique_steal_cookie["<b>Tecnica</b> – <b>T1539 Furto del Cookie di Sessione Web</b><br/>Decriptazione dei cookie app-bound di Chrome v127+"] class technique_steal_cookie technique technique_forge_cookie["<b>Tecnica</b> – <b>T1606.001 Falsificare Credenziali Web</b><br/>Uso dei cookie estratti per l’autenticazione"] class technique_forge_cookie technique technique_alt_auth["<b>Tecnica</b> – <b>T1550.004 Uso di Materiale di Autenticazione Alternativo</b><br/>Abuso dei cookie per movimento laterale"] class technique_alt_auth technique technique_vnc["<b>Tecnica</b> – <b>T1021.005 Servizi Remoti VNC</b><br/>VNC nascosto fornisce il controllo invisibile del desktop"] class technique_vnc technique technique_remote_service["<b>Tecnica</b> – <b>T1021 Servizi Remoti</b><br/>Movimento laterale aggiuntivo tramite servizi remoti"] class technique_remote_service technique technique_dead_drop["<b>Tecnica</b> – <b>T1102.001 Risolutore Dead Drop</b><br/>Indirizzo C2 risolto da smart contract Ethereum"] class technique_dead_drop technique technique_websocket_bidirectional["<b>Tecnica</b> – <b>T1102.002 WebSocket Bidirezionale</b><br/>Canale WebSocket per scambio comandi"] class technique_websocket_bidirectional technique technique_websocket_oneway["<b>Tecnica</b> – <b>T1102.003 Comunicazione Unidirezionale</b><br/>Percorso C2 di fallback"] class technique_websocket_oneway technique technique_web_protocol["<b>Tecnica</b> – <b>T1071.001 Protocollo dell’Applicazione Layer Protocolli Web</b><br/>Traffico su WebSocket via HTTPS"] class technique_web_protocol technique malware_chainshell["<b>Malware</b> – <b>Nome</b>: ChainShell<br/>Orchestratore di payload che gestisce C2, criptazione e movimento laterale"] class malware_chainshell malware %% Connections action_phishing –>|porta_a| action_user_exec action_user_exec –>|esegue| tool_powershell tool_powershell –>|carica| tool_cmstp tool_cmstp –>|usa| technique_dll_sideload tool_cmstp –>|aggira| technique_uac_bypass technique_dll_sideload –>|abilita| technique_dll_hijack technique_dll_hijack –>|supporta| technique_scheduled_task technique_scheduled_task –>|crea| malware_chainshell malware_chainshell –>|contiene| technique_steganography malware_chainshell –>|contiene| technique_embedded_payload malware_chainshell –>|cripta| technique_data_obfusc malware_chainshell –>|ruba| technique_steal_cookie technique_steal_cookie –>|abilita| technique_forge_cookie technique_forge_cookie –>|abilita| technique_alt_auth technique_alt_auth –>|abilita| technique_vnc technique_vnc –>|usa| technique_remote_service malware_chainshell –>|risolve C2 tramite| technique_dead_drop technique_dead_drop –>|comunica tramite| technique_websocket_bidirectional technique_websocket_bidirectional –>|fallback a| technique_websocket_oneway technique_websocket_bidirectional –>|usa protocollo| technique_web_protocol "
Flusso di Attacco
Rilevamenti
Possibile Tentativo di Scoperta della Lingua del Sistema Locale (tramite cmdline)
Visualizza
Possibile Tentativo di Scoperta della Lingua del Sistema Locale (tramite powershell)
Visualizza
Esecuzione di Binario NodeJS da Posizione Inusuale (tramite cmdline)
Visualizza
Possibile Tentativo di Abuso di Publicnode Ethereum come Canale C2 (tramite dns_query)
Visualizza
IOC (SourceIP) da rilevare: ChainShell: MuddyWater & Russian MaaS
Visualizza
IOC (DestinationIP) da rilevare: ChainShell: MuddyWater & Russian MaaS
Visualizza
IOC (HashSha256) da rilevare: ChainShell: MuddyWater & Russian MaaS
Visualizza
Rilevamento di Comunicazione C2 di CastleRAT su Porte Specifiche [Connessione di Rete Windows]
Visualizza
Rilevamento di Distribuzione ChainShell tramite Node.js in Operazioni MuddyWater [Creazione di Processo Windows]
Visualizza
Rileva Script PowerShell Reset.ps1 per Distribuzione ChainShell [Windows PowerShell]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre-volo di Telemetria & Baseline deve essere stato superato.
-
Narrativa dell’Attacco & Comandi:
-
Fase 1 – Prepara un semplice server C2 (eseguire sulla macchina dell’attaccante o su una VM controllata). Il server ascolta sulla porta 9999 e ripete i dati ricevuti.
-
Fase 2 – Sull’host Windows bersaglio, avvia una backdoor PowerShell che apre una connessione TCP al server C2 sulla porta 9999. Il payload utilizza classi native .NET per evitare di creare un eseguibile separato, imitando un approccio “living-off-the-land”.
-
Fase 3 – Hop proxy opzionale: Lo script PowerShell contatta prima un proxy HTTP locale (che ascolta su 127.0.0.1:8080) che inoltra il traffico TCP al server C2 remoto, dimostrando che la porta di destinazione rimane invariata.
Questi passaggi producono eventi firewall con
DestinationPort = 9999, soddisfacendo la regola Sigma. -
-
Script di Test di Regressione:
# ------------------------------------------------- # Simulazione C2 stile CastleRAT – PowerShell # ------------------------------------------------- # 1. Definisci indirizzo server C2 (sostituisci con l'IP di test) $c2Ip = "10.0.0.50" $c2Port = 9999 # 2. OPZIONALE: Definisci proxy locale (se vuoi testare hop del proxy) $useProxy = $false $proxyHost = "127.0.0.1" $proxyPort = 8080 # 3. Funzione per aprire un flusso TCP (diretto o tramite proxy) function Invoke-C2Connection { param ( [string]$destIp, [int]$destPort, [bool]$viaProxy ) if ($viaProxy) { # Semplice tunnel HTTP CONNECT $proxyUri = "http://$proxyHost`:$proxyPort" $client = New-Object System.Net.Sockets.TcpClient($proxyHost,$proxyPort) $stream = $client.GetStream() $connectRequest = "CONNECT $destIp`:$destPort HTTP/1.1`r`nHost: $destIp`r`n`r`n" $bytes = [System.Text.Encoding]::ASCII.GetBytes($connectRequest) $stream.Write($bytes,0,$bytes.Length) # Scarta risposta proxy $buffer = New-Object byte[] 1024 $null = $stream.Read($buffer,0,$buffer.Length) Write-Host "[+] Tunnel proxy stabilito" return $stream } else { $client = New-Object System.Net.Sockets.TcpClient($destIp,$destPort) Write-Host "[+] Connessione TCP diretta stabilita" return $client.GetStream() } } # 4. Apri la connessione $stream = Invoke-C2Connection -destIp $c2Ip -destPort $c2Port -viaProxy:$useProxy # 5. Invia un semplice beacon $beacon = "CastleRAT Beacon $(Get-Date -Format o)`n" $bytes = [System.Text.Encoding]::UTF8.GetBytes($beacon) $stream.Write($bytes,0,$bytes.Length) Write-Host "[+] Beacon inviato" # 6. Mantieni aperto il canale per un breve periodo (simula persistenza) Start-Sleep -Seconds 15 # 7. Pulizia $stream.Close() Write-Host "[+] Connessione chiusa" -
Comandi di Pulizia:
# Assicurati che tutte le connessioni TCP rimanenti siano chiuse Get-NetTCPConnection -RemotePort 9999 -State Established | ForEach-Object { try { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue if ($proc) { Stop-Process -Id $proc.Id -Force } } catch {} } # Rimuovi eventuali ascoltatori proxy temporanei se sono stati avviati localmente Stop-Process -Name "python" -Force -ErrorAction SilentlyContinue
Osservazioni Aggiuntive & Raccomandazioni di Rafforzamento
- Arricchisci il Rilevamento Basato su Porte: Combina il controllo della porta con IP/domini C2 noti malevoli, fingerprinting TLS o euristiche di volume di traffico anomalo.
- Lista di Ammissione dei Servizi Legittimi: Crea una lista di eccezioni per le applicazioni che utilizzano legittimamente le porte 9999 o 8888 (ad esempio, certi strumenti di database o gestione).
- Basi Comportamentali: Distribuisci modelli statistici per segnalare connessioni in uscita a bassa frequenza a porte ad alto rischio originate da endpoint non server.
- Contesto del Processo: Correla eventi firewall con il processo di origine (
NomeFileImmagine,CommandLine). Segnala connessioni effettuate da processi inaspettati (es.powershell.exe,cmd.exe).
Applicando queste mitigazioni, la resilienza della regola può essere aumentata dall’attuale 2 a un range 4-5 , riducendo drasticamente i falsi positivi mentre si preserva il rilevamento del traffico C2 genuino di CastleRAT.