Aller au contenu

Profil de Menace : Cobalt Strike et C2

Comprendre Cobalt Strike nécessite de disséquer son architecture à trois niveaux. Les acteurs de la menace utilisent cette structure pour abstraire leur localisation réelle et maintenir un accès persistant aux réseaux compromis.

1. Le Team Server

le hub central du C2, déployé par l’attaquant sur un VPS ou un hébergeur “bulletproof”. Il gère les retours (callbacks) des balises, héberge les profils Malleable C2, coordonne les mouvements latéraux et consigne toutes les données extraites.

2. Le Client

l’interface graphique utilisée par l’acteur de la menace pour se connecter au Team Server. Elle fournit à l’opérateur une carte visuelle en temps réel du réseau compromis.

3. Le Beacon (Charge utile)

l’implant (payload) réel déployé sur la machine de la victime. C’est un agent asynchrone hautement sophistiqué qui interroge le Team Server pour obtenir des tâches, les exécute entièrement en mémoire et renvoie les résultats.

Le Beacon est bien plus qu’un simple reverse shell ; c’est un véritable couteau suisse de post-exploitation conçu pour mettre en échec la protection statique des terminaux.

C’est la fonctionnalité la plus redoutable de Cobalt Strike. Les profils “Malleable C2” permettent à l’opérateur de réécrire complètement la signature réseau de la balise. Un attaquant peut modifier les en-têtes HTTP, les URI, les User-Agents et l’encodage de la charge utile pour que son trafic C2 ressemble exactement à Google Analytics, jQuery ou à la télémétrie de Microsoft Update. Cela rend les équipements de détection d’intrusion (IDS/IPS) basés sur les signatures presque inutiles.

B. Exécution en mémoire et injection de processus

Section intitulée « B. Exécution en mémoire et injection de processus »

Cobalt Strike vise à opérer de manière totalement “fileless” (sans fichier) après l’exécution initiale. Il s’appuie fortement sur l’injection de DLL réflective (Reflective DLL Injection) et le “Process Hollowing”. Le Beacon injecte généralement sa charge utile dans des processus Windows légitimes (comme svchost.exe, rundll32.exe ou werfault.exe). Par conséquent, le code malveillant s’exécute à l’intérieur de l’espace mémoire d’un binaire Microsoft de confiance et signé, contournant ainsi les moteurs antivirus traditionnels.

Le Beacon intègre des capacités intégrées pour exécuter nativement des techniques Living Off The Land (LOLBAS) :

  • Vol d’identifiants : exécution en mémoire de Mimikatz pour extraire les mots de passe en clair et les hashs NTLM du processus LSASS.
  • Manipulation de jetons : exécution d’attaques Pass-the-Hash (PtH) et Pass-the-Ticket (PtT) directement depuis la mémoire.

D. Mouvement latéral via les balises SMB (SMB Beacons)

Section intitulée « D. Mouvement latéral via les balises SMB (SMB Beacons) »

Si un terminal ne peut pas atteindre Internet (ex: un serveur de base de données isolé), un attaquant peut déployer un SMB Beacon. Cette balise communique avec une balise principale exposée à Internet via le réseau interne en utilisant des Tubes Nommés encapsulés dans le protocole SMB. Pour les défenseurs du réseau, ce trafic apparaît comme un partage de fichiers Windows interne standard, gardant l’intrusion réseau profonde totalement invisible.

3. DFIR sur les terminaux et filiation des processus

Section intitulée « 3. DFIR sur les terminaux et filiation des processus »

Détecter Cobalt Strike sur un terminal nécessite une analyse comportementale et de la forensique mémoire.

  • Anomalies de filiation des processus : comme le soulignent les recherches d’Elastic Security, le comportement par défaut de Cobalt Strike implique souvent la génération de rundll32.exe sans aucun argument de ligne de commande pour héberger la charge utile de la balise injectée. Un processus rundll32.exe avec une ligne de commande vide ou généré par un parent inattendu (comme winword.exe ou wscript.exe) est une alerte rouge majeure. (Corréler avec l’Événement 4688).
  • Événement Sysmon 8 (CreateRemoteThread) : surveiller les processus injectant des threads dans svchost.exe ou lsass.exe.
  • Forensique mémoire et extraction de configuration : si un analyste capture un vidage mémoire (dump) d’une machine infectée, des outils comme Volatility ou des scripts spécifiques (ex: 1768.py de Didier Stevens) peuvent sculpter la mémoire pour localiser le Beacon. L’extraction du bloc de configuration du Beacon (Beacon Configuration Block) est le jackpot ultime : il révèle le profil Malleable C2 de l’attaquant, les temps de sommeil (sleep times), les chaînes de tubes nommés et l’IP/domaine exact du Team Server.

4. Threat Hunting proactif : trouver les Team Servers

Section intitulée « 4. Threat Hunting proactif : trouver les Team Servers »

Les analystes en Cyber Threat Intelligence (CTI) n’attendent pas simplement les alertes ; ils scannent activement l’espace IPv4 pour identifier et bloquer l’infrastructure Cobalt Strike avant qu’une attaque ne se produise. Selon les méthodologies de chasse avancées de Hunt.io, les Team Servers peuvent être découverts via des échecs OPSEC évidents des attaquants.

  1. Ports par défaut : le port par défaut pour l’interface de gestion du Team Server est 50050. Scanner ce port exposé est la première étape pour identifier l’infrastructure d’adversaires amateurs.
  2. Empreinte JARM : JARM est un outil de prise d’empreinte active des serveurs TLS. Les Team Servers Cobalt Strike non modifiés renvoient souvent un hash JARM très spécifique (ex: 07d14d16d21d21d00042d41d00041d...).
  3. Anomalies de réponse HTTP : les Team Servers par défaut répondent aux requêtes web non authentifiées avec une erreur 404 Not Found présentant un Content-Length: 0 exact et un formatage spécifique de l’en-tête Date.
  4. Répertoires ouverts (Open Directories) : les attaquants configurent fréquemment mal leurs répertoires d’hébergement de charges utiles. Les plateformes CTI indexent les répertoires ouverts contenant des noms de charge utile typiques tels que payload.bin, beacon.exe ou des stagers PowerShell par défaut.
hunt_cs_rundll32_injection.kql
// Détecte l'exécution suspecte de rundll32 souvent associée à l'injection de processus de Cobalt Strike
DeviceProcessEvents
| where FileName =~ "rundll32.exe"
// Cobalt Strike génère fréquemment rundll32 sans arguments pour injecter la charge utile du beacon
| where isempty(ProcessCommandLine) or ProcessCommandLine endswith "rundll32.exe"
// Exclure les processus parents normaux pour réduire le bruit
| where InitiatingProcessFileName !in~ ("explorer.exe", "svchost.exe")
| project TimeGenerated, DeviceName, InitiatingProcessFileName, FileName, ProcessCommandLine