Magic Quadrant™ pour la gestion des accès privilégiés 2025 : Netwrix reconnue pour la quatrième année consécutive. Téléchargez le rapport.

Plateforme
Centre de ressourcesBlog
Covenant C2 Framework : Le tutoriel complet

Covenant C2 Framework : Le tutoriel complet

Dec 16, 2022

Covenant is one of the latest and greatest command and control (C2) post-exploitation frameworks. This post will walk you through the process of configuring Covenant and using it to execute payloads on compromised hosts.

Remarque : Cet article présente les capacités de Covenant en date de mi-septembre 2019.

1. Installez Covenant

Tout d'abord, nous devons installer Covenant sur une machine hôte qui servira à la fois de base de données Covenant et d'application de gestion contrôlant les agents d'application, connus sous le nom de grunts.

Prérequis

Pour cet article de blog, j'ai installé Covenant sur une station de travail Windows 10, mais tout système d'exploitation Windows Server récent ou distribution Linux qui prend en charge .NET Core devrait également convenir parfaitement.

Les applications suivantes doivent être installées sur la machine hébergeant Covenant:

Processus d'installation

Étant donné l'architecture moderne et multiplateforme de Covenant, il ne fournit pas d'exécutable d'installation à l'ancienne. Au lieu de cela, nous devons cloner le dépôt git du projet puis construire et exécuter l'application en utilisant les commandes suivantes :

      git clone --recurse-submodules https://github.com/cobbr/Covenant

cd Covenant/Covenant

dotnet build

dotnet run
      
Image

Alternativement, nous pourrions exécuter Covenant dans un conteneur Docker.

2. Créez un compte.

Avec le service Covenant en fonctionnement, nous pouvons naviguer vers l'interface de l'application Covenant sur son port web par défaut de 7443. Nous serons invités à configurer un compte utilisateur :

Image

Après avoir terminé le processus d'inscription, nous serons redirigés vers la page de gestion des utilisateurs :

Image

Le menu sur la gauche nous permet de naviguer vers les différentes capacités de Covenant.

3. Configurez un écouteur.

Les écouteurs permettent aux grognements de communiquer avec l'application Covenant. Aucun écouteur n'est configuré par défaut, donc nous devons en configurer un. Cliquez sur Listeners dans le menu de gauche pour ouvrir la page des écouteurs :

Image

Cliquez ensuite sur le bouton Create pour ouvrir la page de création de l'écouteur HTTP :

Image

Nous devrons mettre à jour quelques-unes des valeurs fournies :

  • Nom — Par défaut, Covenant fournit un nom simple de type « GUID ». N'hésitez pas à le changer pour quelque chose de plus lisible.
  • BindAddress et ConnectAddress — Assurez-vous que ces deux adresses spécifient une adresse accessible par les grunts.
  • UseSSL — Si vous souhaitez utiliser SLL, vous devrez spécifier un fichier de certificat SSL et un mot de passe.

Une fois la configuration terminée, cliquez sur le bouton Create pour créer et activer l'écouteur.

4. Créez un lanceur.

Ensuite, nous devons créer un lanceur. Les lanceurs sont utilisés pour transformer les hôtes distants en subordonnés et les connecter à l'application Covenant. Ils se présentent généralement sous la forme d'un paquet de charge utile qui s'exécute sur un hôte distant. Chaque lanceur est associé à un écouteur.

Depuis le menu de gauche de la page de gestion des utilisateurs, cliquez sur Launchers. Vous verrez une liste des types de lanceurs. Le lanceur binaire, qui est utilisé pour générer des binaires personnalisés, est l'un des lanceurs les plus faciles à utiliser, alors sélectionnons Binary pour notre premier lanceur.

Image

La page de configuration s'ouvrira :

Image

Spécifiez les options de configuration suivantes :

  • Écouteur — Spécifiez l'écouteur que le nouveau lanceur utilisera. Utilisons l'écouteur HTTP que nous avons créé précédemment :
Image
  • Modèle — Utilisons le modèle prêt à l'emploi GruntHTTP:
Image
  • Délai et Gigue — Ces paramètres contrôlent la fréquence à laquelle un grunt communique avec Covenant. Nous pouvons conserver les valeurs par défaut.
  • ConnectAttempts et KillDate — Ces paramètres contrôlent le moment où un grunt cessera de tenter de communiquer avec Covenant. Là encore, nous pouvons conserver les valeurs par défaut.

Une fois la configuration terminée, cliquez sur le bouton Generate pour créer le nouveau lanceur et revenir à la page de configuration.

5. Créez un grunt en exécutant le lanceur.

Ensuite, nous devons enregistrer la charge utile du lanceur : Cliquez sur Download puis sur Save File.

Image

Ensuite, copiez le fichier enregistré sur l'hôte souhaité et exécutez-le.

Le nouveau grunt enregistré apparaîtra sur notre tableau de bord dans Covenant:

Image

6. Attribuez des tâches au subalterne.

Depuis le menu de gauche de la page de gestion des utilisateurs, cliquez sur Grunts puis ouvrez le grunt que nous venons d'enregistrer. L'onglet Info fournit des détails sur son statut de connexion et sa fonctionnalité :

Image

Pour assigner une tâche à notre subalterne, nous devons cliquer sur l'onglet Task.

Exemple 1 : Prenez une capture d'écran.

Tout d'abord, supposons que nous voulons que le grunt prenne une capture d'écran du bureau de l'utilisateur actif. Nous sélectionnons Screenshot dans le menu déroulant Tâche et ensuite nous cliquons sur le bouton Task ci-dessous pour exécuter immédiatement cette action sur le grunt :

Image

Rafraîchissez la page pour voir le statut de la tâche mis à jour. Il indiquera que la tâche est terminée et fournira sa sortie, qui dans ce cas est simplement une capture d'écran. Notez que la sortie d'une tâche dépend du type de tâche.

Image

Exemple 2 : Exécutez Mimikatz.

Faisons exécuter une autre tâche par l'agent : Exécuter Mimikatz.

Nous devons revenir à l'onglet Tâches de la page de détails de notre grunt. Ensuite, nous sélectionnerons Mimikatz dans le menu déroulant des tâches.

De nombreuses tâches disposent d'un ensemble de paramètres d'entrée personnalisables. Les tâches Mimikatz ont un paramètre d'entrée “Command” qui nous permet de spécifier quelle commande Mimikatz nous souhaitons exécuter. Pratiquement, il est pré-rempli avec la commande sekurlsa::logonPasswords, qui découvre les mots de passe stockés en mémoire. Assignons cette tâche à notre grunt et voyons ce qui se passe.

Il se trouve qu'un compte d'administrateur de domaine était connecté à cet hôte subalterne — donc dans la sortie de la tâche, nous pouvons voir le mot de passe de l'administrateur de domaine en clair !

Image

L'utilisation de Mimikatz avec Covenant permet aux adversaires d'éviter la détection car Covenant ne stocke pas directement les tâches sur l'hôte grunt. Au lieu de cela, il compile et déploie dynamiquement le payload de la tâche via sa connexion client au moment de l'assignation de la tâche. De plus, chaque fois qu'un nouveau grunt est créé ou qu'une nouvelle tâche lui est assignée, le code pertinent est recompilé et obfusqué avec ConfuserEx, ce qui évite les payloads statiques qui seraient plus faciles à détecter. En fait, lors de l'exécution des étapes ici sur ma machine, Windows Defender était activé et à jour, et pourtant, les tâches Mimikatz du grunt se sont exécutées sans problème.

Examen de l'historique des tâches et de leur résultat.

Covenant fournit un historique clair des tâches qu'il a exécutées. Depuis le menu de gauche de la page de gestion des utilisateurs, cliquez sur Taskings:

Image

Vous pouvez voir à la fois la tâche de capture d'écran et la tâche mimikatz que nous avons exécutées plus tôt. Cliquez sur n'importe quelle ligne pour voir les paramètres de la tâche et la sortie complète.

Notez que de nombreuses tâches enregistrent également des éléments de leur sortie dans la page Data. Cliquez sur les différents onglets pour voir les identifiants, indicateurs, artefacts téléchargés et captures d'écran. Par exemple, voici les identifiants découverts par notre tâche Mimikatz :

Image

Et voici une capture d'écran réalisée par notre autre tâche :

Image

Exemple 3 : Téléchargez un fichier.

Maintenant, exécutons une tâche supplémentaire sur notre grunt pour télécharger un fichier afin de pouvoir le visualiser dans l'onglet Downloads.

Supposons que nous ayons découvert qu'il y a un fichier sur notre hôte grunt appelé MySecretDocument.txt. Utilisons la tâche Download pour obtenir une copie de ce fichier pour nous-mêmes !

Image

L'exécution de cette tâche permettra de récupérer une copie du fichier et de la rendre immédiatement disponible dans l'onglet Téléchargements :

Image

Cette tâche est simple en soi mais présente des cas d'utilisation fascinants étant donné que nous pouvons exécuter cette tâche en utilisant les droits de l'utilisateur qui a exécuté le lanceur grunt ou les identifiants que nous avons obtenus via d'autres tâches.

Conclusion

Covenant offre déjà une grande variété de tâches, et la liste s'allonge chaque jour grâce à la participation de la communauté open-source. Ce projet aura très probablement un avenir passionnant et vaut certainement la peine d'y jeter un coup d'œil !

Partager sur

En savoir plus

À propos de l'auteur

Asset Not Found

Joe Dibley

Chercheur en sécurité

Chercheur en sécurité chez Netwrix et membre de l'équipe de recherche en sécurité de Netwrix. Joe est un expert en Active Directory, Windows et une grande variété de plateformes logicielles d'entreprise et de technologies, Joe étudie les nouveaux risques de sécurité, les techniques d'attaque complexes, ainsi que les atténuations et détections associées.