Consultez notre article précédent sur la façon de collecter les implants de balise Cobalt Strike. Nous nous appuierons sur ces informations pour extraire les configurations des balises.
Dans cet article, nous allons analyser manuellement une configuration Cobalt Strike C2 à partir d'une balise binaire en utilisant l'excellent Extracteur de Configuration Cobalt Strike (CSCE). Nous aborderons également l'activation de certaines fonctionnalités plus récentes de la pile Elastic qui vous permettront de le faire à l'échelle de tous vos points d'extrémité surveillés, en extrayant les balises de la mémoire.
L'équipe de Blackberry a publié un excellent manuel intitulé "Finding Beacons in the Dark" (enregistrement requis) qui traite en profondeur des configurations des balises Cobalt Strike. Nous aborderons ici quelques champs dans les configurations, mais si vous souhaitez en savoir plus sur le fonctionnement des balises, nous vous recommandons vivement de consulter cette ressource.
Extracteur de configuration de la gâche en cobalt
Le Cobalt Strike Configuration Extractor (CSCE) de Stroz Friedberg est une bibliothèque python "et un ensemble de scripts permettant d'extraire et d'analyser les configurations des balises Cobalt Strike".
Pour utiliser l'ECSC, nous allons créer un environnement virtuel Python, l'activer et installer le paquetage Python de l'ECSC.
Configuration de l'extracteur de configuration Cobalt Strike
$ python3 -m venv csce
$ source csce/bin/activate
(csce) $ pip3 install libcsce
...truncated...
Collecting libcsce
Using cached libcsce-0.1.0-py3-none-any.whl (24 kB)
Collecting pefile>=2019.4.18
...truncated...
Ensuite, nous pouvons exécuter le CSCE sur la charge utile de la balise que nous avons extraite de la mémoire pour voir s'il y a des informations intéressantes stockées que nous pouvons collecter (nous ajouterons le drapeau --pretty
pour rendre la sortie plus facile à lire en tant que document JSON).
Visualisation des indicateurs atomiques de la configuration de la balise CS
(csce) $ csce --pretty beacon.exe
{
"beacontype": [
"HTTPS"
],
"sleeptime": 45000,
"jitter": 37,
"maxgetsize": 1403644,
"spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
"license_id": 334850267,
"cfg_caution": false,
"kill_date": "2021-12-24",
"server": {
"hostname": "clevelandclinic[.]cloud",
"port": 443,
"publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4G...
...truncated...
Immédiatement, nous pouvons voir que la balise utilise HTTPS pour communiquer et que le domaine est clevelandclinic[.]cloud
. Nous disposons ainsi d'un indicateur atomique que nous pouvons analyser. En consultant la documentation de Malleable Command and Control, nous pouvons obtenir une description des variables de configuration.
Par exemple, nous pouvons voir que sleeptime
est 450000
millisecondes, ce qui modifie le contrôle de la balise par défaut de toutes les 60 secondes à 450 secondes, ou 7 ½ minutes. En outre, nous constatons une gigue de 37
, ce qui signifie qu'il y a une gigue aléatoire de 37 % des millisecondes de 450000
(166,500
millisecondes), de sorte que l'enregistrement de la balise pourrait avoir lieu entre 283,000
et 450,000
millisecondes (4,7 - 7,5 minutes).
En outre, le champ publickey
est utilisé par le serveur Cobalt Strike Team pour crypter les communications entre le serveur et la balise. Cela diffère des certificats TLS normaux utilisés pour accéder au domaine C2 à l'aide d'un navigateur ou de bibliothèques de transfert de données, telles que cURL
. Ce champ est important car le serveur d'équipe utilise la même clé publique pour chaque balise, ce qui permet de regrouper les balises avec leur serveur d'équipe respectif. En effet, les acteurs de la menace utilisent souvent le même serveur d'équipe pour plusieurs campagnes, et ces données de la configuration peuvent donc être utilisées pour relier les acteurs de la menace à plusieurs campagnes et à plusieurs infrastructures.
En continuant d'examiner les résultats de la configuration, nous pouvons voir une autre section intéressante autour du champ imbriqué process-inject
, stub
:
Visualisation du champ process-inject.stub
(csce) $ csce --pretty beacon.exe
...truncated...
"process-inject": {
"allocator": "NtMapViewOfSection",
"execute": [
"CreateThread 'ntdll!RtlUserThreadStart'",
"CreateThread",
"NtQueueApcThread-s",
"CreateRemoteThread",
"RtlCreateUserThread"
],
"min_alloc": 17500,
"startrwx": false,
"stub": "IiuPJ9vfuo3dVZ7son6mSA==",
"transform-x86": [
"prepend '\\x90\\x90'"
],
...
Le champ stub
contient le hachage MD5 codé en Base64 de l'archive Cobalt Strike Java. Pour le convertir, nous pouvons à nouveau utiliser CyberChef, cette fois-ci en ajoutant les recettes "From Base64" et "To Hex", en veillant à modifier le délimiteur "" en "None" dans la recette "To Hex".
Maintenant que nous disposons de la valeur MD5 de l'archive Java (222b8f27dbdfba8ddd559eeca27ea648
), nous pouvons la comparer à des bases de données en ligne telles que VirusTotal pour obtenir des informations supplémentaires, en particulier le hachage SHA256 (7af9c759ac78da920395debb443b9007fdf51fa66a48f0fbdaafb30b00a8a858
).
Enfin, nous pouvons vérifier le hachage SHA256 avec CobaltStrike pour identifier la version de l'archive Java en allant sur https://verify.cobaltstrike.com et en recherchant le hachage.
Nous savons maintenant que cette balise a été créée à l'aide d'une version sous licence de Cobalt Strike 4.4.
Le champ license_id
est un autre champ de la configuration qui permet de regrouper les activités.
Visualisation du filigrane Cobalt Strike
...truncated
"spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
"license_id": 334850267,
"cfg_caution": false,
...truncated...
Il s'agit d'une valeur à 9 chiffres, unique pour chaque licence. Bien que cette valeur puisse être modifiée, elle peut toujours être utilisée en conjonction avec les champs process-inject.stub
et publickey
(voir ci-dessus) pour regrouper les groupes d'infrastructures et d'activités.
Il ne s'agit là que de quelques champs qui peuvent être utilisés pour identifier et regrouper des activités à l'aide de configurations extraites de la balise Cobalt Strike. Si vous souhaitez une analyse approfondie de la configuration, nous vous recommandons de consulter le manuel Finding Beacons in the Dark Cobalt Strike, rédigé par l'équipe de Blackberry.
Passer de l'analyse à l'action
Pour tester notre manuel d'analyse afin de collecter les charges utiles des balises Cobalt Strike, leurs configurations et les métadonnées qu'elles contiennent, nous pouvons les appliquer à davantage de données afin d'identifier des groupes d'activité.
Dans l'illustration ci-dessus, nous pouvons regrouper les acteurs de la menace en fonction de leur utilisation commune de la clé publique de la charge utile de la balise, qui, comme nous l'avons décrit plus haut, est unique pour chaque serveur d'équipe. Cela nous permettrait de regrouper plusieurs hachages de charges utiles de balises, infrastructures et campagnes en un seul acteur de la menace.
Comme toujours, l'utilisation des indicateurs atomiques extraits des configurations des charges utiles des balises (clevelandclinic[.]cloud
dans notre exemple) vous permet d'identifier d'autres infrastructures partagées, des cibles verticales et des capacités des acteurs de la menace.
Cette fois-ci à pleine vitesse
Toutes les étapes que nous avons mises en évidence dans cette version, ainsi que dans la version précédente, peuvent être automatisées et écrites dans Elasticsearch à l'aide du projet Cobalt Strike Beacon Extraction.
Résumé
Dans cet article, nous avons mis en évidence les nouvelles fonctionnalités de la pile Elastic qui peuvent être utilisées pour collecter les charges utiles des balises C2 Cobalt Strike Malleable. En outre, nous avons abordé les processus d'élaboration des politiques de la flotte pour extraire les charges utiles des balises de la mémoire, ainsi que leurs configurations.
Ces politiques et processus de la flotte permettent aux analystes de sécurité de collecter les charges utiles des balises Cobalt Strike et leurs configurations afin d'identifier l'infrastructure contrôlée par les acteurs de la menace et l'activité des clusters.
Éléments
Observable | Type | Note -------------------------------------------------------------------|-------------|------------------------------------------ 697fddfc5195828777622236f2b133c0a24a6d0dc539ae7da41798c4456a3f89
| SHA256 | Cobalt Strike Malleable C2 beacon payload 7475a6c08fa90e7af36fd7aa76be6e06b9e887bc0a6501914688a87a43ac7ac4
| SHA256 | Cobalt Strike Malleable C2 beacon payload f9b38c422a89d73ebdab7c142c8920690ee3a746fc4eea9175d745183c946fc5
| SHA256 | Cobalt Strike Malleable C2 beacon payload clevelandclinic[.]cloud
| domain-name | Cobalt Strike Malleable C2 domain 104[.]197[.]142[.]19
| ipv4-addr | Cobalt Strike Malleable C2 IP address 192[.]64[.]119[.]19
| ipv4-addr | Cobalt Strike Malleable C2 IP address
Éléments
Les artefacts sont également disponibles au téléchargement en format ECS et STIX dans un paquet zip combiné.