SOC Prime Bias: Critique

09 Avr 2026 17:52

ChainShell : MuddyWater & MaaS Russe

Author Photo
Ruslan Mikhalov Chef de la Recherche sur les Menaces chez SOC Prime linkedin icon Suivre
ChainShell : MuddyWater & MaaS Russe
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

MuddyWater, un acteur d’espionnage lié à l’Iran, exploite la plateforme malware-as-a-service TAG-150 russe pour livrer CastleRAT et un nouvel agent C2 Node.js, activé par la blockchain, suivi sous le nom de ChainShell contre les cibles israéliennes et autres cibles de haute valeur. L’activité est soutenue par un serveur Web C2 exposé et mal configuré, un script de déploiement PowerShell (reset.ps1), et des charges utiles PE dissimulées via la stéganographie. Plusieurs versions de CastleRAT (y compris la Build 120 et la Build 13) contiennent des identifiants codés en dur partagés qui pointent vers la même lignée MaaS. L’infrastructure backend semble être structurée en campagnes, utilisant des domaines partagés (par exemple, serialmenot.com) et des identifiants JWT par opération pour séparer l’accès et le suivi à travers les déploiements.

Enquête

JUMPSEC a examiné l’hôte C2 exposé, récupéré 15 échantillons de malware, et lié la logique de déploiement du reset.ps1 à la livraison à la fois de ChainShell et de plusieurs versions de CastleRAT. Les enquêteurs ont également corrélé les certificats de signature de code (Amy Cherne et Donald Gay) observés dans les outils connus de MuddyWater avec l’installateur TAG-150 MSI, formant une piste d’attribution à haute confiance. Des chevauchements supplémentaires ont été observés sur des échantillons dans les marqueurs de build codés en dur, les conventions de nommage récurrentes des tâches planifiées, et les ID de campagne JWT intégrés dans les outils et les artefacts côté serveur.

Atténuation

Surveiller pour le reset.ps1, les tâches planifiées associées, et les artefacts de mutex ou de chemin de fichier uniques liés à CastleRAT et ChainShell. Bloquer l’infrastructure TAG-150 connue, y compris serialmenot.com, ttrdomennew.com, et sharecodepro.com, et examiner l’installation pilotée par PowerShell de composants Node.js. Appliquer des contrôles stricts de signature de code et valider les certificats suspects par rapport aux matériaux de signature connus liés à MuddyWater.

Réponse

Si des indicateurs sont trouvés, isoler les points de terminaison impactés, capturer des images complètes de disque et de mémoire, et rechercher les restes de CastleRAT et ChainShell supplémentaires. Révoquer ou méfier des certificats de signature de code compromis, réinitialiser les identifiants affectés, et coordonner les rapports avec les CERT nationaux concernés. Examiner la télémétrie du réseau pour les motifs d’accès RPC Ethereum et l’utilisation de JWT liés au workflow de commande et de contrôle de 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>Action</b> – <b>T1566.002 Phishing</b><br/>Document malveillant activé par macro (ClickFix/BatClickFix) livré par email"] class action_phishing action action_user_exec["<b>Action</b> – <b>T1204.002 Exécution par l’utilisateur</b><br/>La victime ouvre le document déclenchant PowerShell"] class action_user_exec action tool_powershell["<b>Outil</b> – <b>T1059.001 PowerShell</b><br/>Interpréteur de script utilisé pour charger le chargeur"] class tool_powershell tool tool_cmstp["<b>Outil</b> – <b>T1218.003 CMSTP</b><br/>Exécution par proxy binaire système qui charge un INF malveillant"] class tool_cmstp tool technique_dll_sideload["<b>Technique</b> – <b>T1574.002 Chargement latéral de DLL</b><br/>DLLs malveillants chargés via INF"] class technique_dll_sideload technique technique_dll_hijack["<b>Technique</b> – <b>T1574.005 Détournement du flux d’exécution</b><br/>userenv.dll et xmllite.dll malveillants placés à côté de binaires légitimes"] class technique_dll_hijack technique technique_scheduled_task["<b>Technique</b> – <b>T1543.001 Créer ou modifier un processus système</b><br/>Tâches planifiées (VirtualSmokestGuy120/666) pour la persistance"] class technique_scheduled_task technique technique_steganography["<b>Technique</b> – <b>T1027.003 Stéganographie</b><br/>Charges utiles PE natives cachées dans des images JPEG"] class technique_steganography technique technique_embedded_payload["<b>Technique</b> – <b>T1027.009 Charges utiles intégrées</b><br/>Charges utiles supplémentaires mieux dissimulées"] class technique_embedded_payload technique technique_data_obfusc["<b>Technique</b> – <b>T1001 Obfuscation des données</b><br/>Cryptage AESu2011256u2011CBC du trafic C2"] class technique_data_obfusc technique technique_uac_bypass["<b>Technique</b> – <b>T1548.002 Abus du mécanisme de contrôle d’élévation</b><br/>Exécution CMSTP contourne UAC"] class technique_uac_bypass technique technique_steal_cookie["<b>Technique</b> – <b>T1539 Vol de cookie de session Web</b><br/>Déchiffrer les cookies appu2011bound de Chrome v127+"] class technique_steal_cookie technique technique_forge_cookie["<b>Technique</b> – <b>T1606.001 Forger des informations d’identification Web</b><br/>Utiliser les cookies extraits pour l’authentification"] class technique_forge_cookie technique technique_alt_auth["<b>Technique</b> – <b>T1550.004 Utiliser du matériel d’authentification alternatif</b><br/>Abuser les cookies pour un mouvement latéral"] class technique_alt_auth technique technique_vnc["<b>Technique</b> – <b>T1021.005 Services à distance VNC</b><br/>VNC caché offrant le contrôle du bureau invisible"] class technique_vnc technique technique_remote_service["<b>Technique</b> – <b>T1021 Services à distance</b><br/>Mouvement latéral supplémentaire via services à distance"] class technique_remote_service technique technique_dead_drop["<b>Technique</b> – <b>T1102.001 Résolveur en dépôt mort</b><br/>Adresse C2 résolue à partir d’un contrat intelligent Ethereum"] class technique_dead_drop technique technique_websocket_bidirectional["<b>Technique</b> – <b>T1102.002 WebSocket Bidirectionnel</b><br/>Canal WebSocket pour échange de commandes"] class technique_websocket_bidirectional technique technique_websocket_oneway["<b>Technique</b> – <b>T1102.003 Communication unidirectionnelle</b><br/>Chemin C2 de secours"] class technique_websocket_oneway technique technique_web_protocol["<b>Technique</b> – <b>T1071.001 Protocole Web Application Layer</b><br/>Trafic sur WebSocket via HTTPS"] class technique_web_protocol technique malware_chainshell["<b>Malware</b> – <b>Nom</b>: ChainShell<br/>Orchestrateur de charge utile gérant C2, cryptage, et mouvement latéral"] class malware_chainshell malware %% Connections action_phishing –>|conduit à| action_user_exec action_user_exec –>|exécute| tool_powershell tool_powershell –>|charge| tool_cmstp tool_cmstp –>|utilise| technique_dll_sideload tool_cmstp –>|contourne| technique_uac_bypass technique_dll_sideload –>|permet| technique_dll_hijack technique_dll_hijack –>|supporte| technique_scheduled_task technique_scheduled_task –>|crée| malware_chainshell malware_chainshell –>|contient| technique_steganography malware_chainshell –>|contient| technique_embedded_payload malware_chainshell –>|chiffre| technique_data_obfusc malware_chainshell –>|vole| technique_steal_cookie technique_steal_cookie –>|permet| technique_forge_cookie technique_forge_cookie –>|permet| technique_alt_auth technique_alt_auth –>|permet| technique_vnc technique_vnc –>|utilise| technique_remote_service malware_chainshell –>|résout C2 via| technique_dead_drop technique_dead_drop –>|communique via| technique_websocket_bidirectional technique_websocket_bidirectional –>|chute de sauvegarde vers| technique_websocket_oneway technique_websocket_bidirectional –>|utilise le protocole| technique_web_protocol "

Flux d’attaque

Exécution de simulation

Prérequis : Le test de pré‑vol télémétrie & baseline doit avoir réussi.

  • Narratif et commandes de l’attaque :

    1. Étape 1 – Préparez un simple serveur C2 (exécuter sur la machine de l’attaquant ou une VM contrôlée). Le serveur écoute sur le port 9999 et fait écho aux données reçues.

    2. Étape 2 – Sur l’hôte Windows cible, lancez une porte dérobée PowerShell qui ouvre une connexion TCP au serveur C2 sur le port 9999. La charge utile utilise les classes .NET natives pour éviter de créer un exécutable séparé, imitant une approche « vivre en dehors de la terre ».

    3. Étape 3 – Saut proxy optionnel : Le script PowerShell contacte d’abord un proxy HTTP local (à l’écoute sur 127.0.0.1:8080) qui transfère le trafic TCP au serveur C2 distant, démontrant que le port de destination reste inchangé.

    Ces étapes produisent des événements de pare-feu avec DestinationPort = 9999, satisfaisant la règle Sigma.

  • Script de test de régression :

    # -------------------------------------------------
    # Simulation C2 à la manière de CastleRAT – PowerShell
    # -------------------------------------------------
    # 1. Définir l'adresse du serveur C2 (remplacer par votre IP de test)
    $c2Ip = "10.0.0.50"
    $c2Port = 9999
    
    # 2. OPTIONNEL : Définir le proxy local (si vous souhaitez tester le saut de proxy)
    $useProxy = $false
    $proxyHost = "127.0.0.1"
    $proxyPort = 8080
    
    # 3. Fonction pour ouvrir un flux TCP (direct ou via proxy)
    function Invoke-C2Connection {
        param (
            [string]$destIp,
            [int]$destPort,
            [bool]$viaProxy
        )
        if ($viaProxy) {
            # Tunnel CONNECT HTTP simple
            $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)
            # Ignorer la réponse du proxy
            $buffer = New-Object byte[] 1024
            $null = $stream.Read($buffer,0,$buffer.Length)
            Write-Host "[+] Tunnel proxy établi"
            return $stream
        } else {
            $client = New-Object System.Net.Sockets.TcpClient($destIp,$destPort)
            Write-Host "[+] Connexion TCP directe établie"
            return $client.GetStream()
        }
    }
    
    # 4. Ouvrir la connexion
    $stream = Invoke-C2Connection -destIp $c2Ip -destPort $c2Port -viaProxy:$useProxy
    
    # 5. Envoyer un simple signal
    $beacon = "Signal CastleRAT $(Get-Date -Format o)`n"
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($beacon)
    $stream.Write($bytes,0,$bytes.Length)
    Write-Host "[+] Signal envoyé"
    
    # 6. Garder le canal ouvert pendant une courte période (simuler la persistance)
    Start-Sleep -Seconds 15
    
    # 7. Nettoyage
    $stream.Close()
    Write-Host "[+] Connexion fermée"
  • Commandes de nettoyage :

    # Assurez-vous que toutes les connexions TCP persistantes sont fermées
    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 {}
    }
    
    # Supprimer tout proxy temporaire si il a été démarré localement
    Stop-Process -Name "python" -Force -ErrorAction SilentlyContinue

Observations supplémentaires & recommandations de renforcement

  1. Enrichir la détection basée sur le port : Combiner la vérification du port avec les IPs/domaines C2 malveillants connus, l’empreinte TLS, ou des heuristiques de volume de trafic anormal.
  2. Liste blanche des services légitimes : Créer une liste d’exception pour les applications qui utilisent légitimement les ports 9999 ou 8888 (par exemple, certains outils de base de données ou de gestion).
  3. Baselines comportementales : Déployer des modèles statistiques pour signaler les connexions sortantes basse fréquence vers des ports à haut risque provenant de points de terminaison non-serveurs.
  4. Contexte des processus : Corréler les événements de pare-feu avec le processus d’origine (ImageFileName, CommandLine). Signaler les connexions faites par des processus inattendus (par exemple, powershell.exe, cmd.exe).

En appliquant ces atténuations, la résilience de la règle peut être augmentée de la valeur actuelle 2 à une plage de 4-5 , réduisant considérablement les faux positifs tout en conservant la détection du trafic C2 de CastleRAT authentique.