Meilleures pratiques OPSEC¶
Référence complète en matière de sécurité opérationnelle pour les opérateurs de Stentor. Ce guide couvre les surfaces de détection pour chaque grande catégorie de techniques, le pipeline d'obfuscation de garble, la commande de posture d'exécution opsec, une matrice de décision pour la sélection de techniques par environnement et des recommandations opérationnelles depuis le pré-engagement jusqu'au nettoyage.
OPSEC n'est pas facultatif
Chaque technique de l'arsenal de Stentor produit des artefacts médico-légaux. La question n’est jamais « est-ce que cela sera détectable ? mais plutôt "qu'est-ce qui le détecte, et cette détection est-elle présente dans cet environnement cible ?" Utilisez ce guide pour prendre des décisions éclairées en matière de risques tout au long de votre engagement.
Surface de détection par catégorie de technique¶
Chaque catégorie de techniques produit des artefacts médico-légaux distincts sur différentes couches de détection (télémétrie des points finaux, surveillance du réseau, analyse des journaux). Les sections ci-dessous mappent les capacités de Stentor à leurs surfaces de détection avec des références spécifiques à MITRE ATT&CK et les mesures d'atténuation recommandées.
Injection de processus¶
implant/internal/modules/inject/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| Créer un thread distant | T1055.001 | Rappels du noyau ETW, événement Sysmon 8 (CreateRemoteThread), analyse de la pile d'appels | Élevé | Utilisez plutôt QueueUserAPC ou NtMapViewOfSection ; combiner avec des appels système indirects |
| QueueUserAPC | T1055.004 | Surveillance des attentes des threads ETW pouvant être alertées, modèles d'allocation de mémoire | Moyen | Associez-le au module Stomping pour le support MEM_IMAGE |
| NtMapViewOfSection | T1055.012 | Création d'objets de section (Sysmon Event 9), cartographie inter-processus | Moyen | Utilisez des appels système indirects pour éviter la détection du hook ntdll |
| APC pour inscription anticipée | T1055.004 | Création de processus en état suspendu (corrélation Sysmon Event 1 + 8), inspection de la file d'attente APC | Moyen | Randomiser le processus cible ; utiliser l'usurpation d'identité PPID |
| Détournement de discussion | T1055.003 | Appels GetThreadContext/SetThreadContext (ETW), modification du pointeur d'instruction | Élevé | Combinez avec BeaconGate pour acheminer les API de contexte via des appels système |
| Module piétinant | T1574.002 | Modification de la section DLL .text (intégrité de la mémoire), incompatibilité de hachage de section | Faible | Choisissez des DLL volumineuses et rarement chargées (xpsservices.dll) |
Risque d’injection primaire
Le type d’allocation de mémoire est l’indicateur le plus puissant. Les allocations MEM_PRIVATE avec PAGE_EXECUTE_READWRITE sont signalées par chaque EDR moderne. Activez toujours le piétinement du module (support MEM_IMAGE) et désactivez UseRWX (utilisez les transitions RW puis RX) pour réduire ce signal.
Accès aux informations d'identification¶
implant/internal/modules/creds/, kerberos/, dpapi/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| Dump SAM (registre) | T1003.002 | Accès par clé de registre (HKLM\SAM), événement Sysmon 12/13 | Élevé | Utiliser l'analyse en mémoire ; éviter la sauvegarde reg sur le disque |
| Accès LSASS | T1003.001 | Handle de processus vers lsass.exe (Sysmon Event 10), contournement de la protection PPL | Critique | Utilisez minidump via comsvcs.dll ou BOF ; évitez OpenProcess direct sur lsass |
| Kerberoast | T1558.003 | Événement de sécurité 4769 (demandes TGS pour le chiffrement RC4), requêtes LDAP SPN | Élevé | Demander des billets cryptés AES (type 17/18) ; limiter les demandes au fil du temps |
| Synchronisation DC | T1003.006 | Événement de sécurité 4662 (DS-Replication-Get-Changes-All), trafic de réplication réseau | Critique | Limité à des comptes spécifiques ; exécuté pendant les fenêtres de réplication |
| Clé principale DPAPI | T1555.004 | Appels API DPAPI, accès LSASS pour clé de sauvegarde de domaine | Moyen | Utilisez l'analyse hors ligne lorsque cela est possible ; éviter les demandes répétées de passe-partout |
Le LSASS est la cible à plus haut risque
Chaque EDR surveille l’accès LSASS. Credential Credential Guard, PPL et RunAsPPL rendent l'accès direct impossible sur les systèmes renforcés. Préférez Kerberoasting (craquage hors ligne) ou DPAPI (pas de contact LSASS) lorsque cela est possible. Lorsque l'accès LSASS est requis, utilisez un BOF avec des appels système indirects et BeaconGate activé.
Mouvement latéral¶
implant/internal/modules/lateral/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| PsExec (service) | T1021.002 | Événement de création de service 7045, événement de sécurité 4624 type 3, canal nommé | Élevé | Utilisez des noms de service aléatoires ; supprimer le service après l'exécution ; éviter les noms de tuyaux par défaut |
| Exécutif WMI | T1047 | Journaux d'événements WMI (Microsoft-Windows-WMI-Activity), création de processus sous WmiPrvSE.exe | Moyen | WMI est courant dans les entreprises ; se fondre avec le trafic administratif normal |
| WinRM | T1021.006 | Journaux de gestion à distance Windows, événements de session à distance PowerShell (événement 4103/4104) | Moyen | Utilisez le transport HTTPS ; se fondre avec la gestion à distance existante |
| DCOM | T1021.003 | Instanciation d'objet COM, chaînes de processus parent-enfant inhabituelles | Faible | Varie selon l'objet DCOM ; MMC20.Application et ShellBrowserWindow sont bien connus |
| Passez le hachage | T1550.002 | Authentification NTLM Événement 4624 type 3 avec LogonProcessName : NtLmSsp | Élevé | Alterner entre les techniques ; éviter les PtH répétés sur la même cible |
| Passez le billet | T1550.003 | Anomalies d'authentification Kerberos, réutilisation des tickets provenant d'adresses IP inattendues | Moyen | Utiliser les tickets du bon contexte utilisateur ; respecter la durée de vie du billet |
Corrélation du journal d'authentification
Le mouvement latéral génère des événements d'authentification (4624/4625) à la fois sur la source et sur la cible. Les SOC les corrèlent entre les systèmes. Variez les techniques, espacez les mouvements et préférez les méthodes à faible empreinte de log (WMI, DCOM) à celles à forte empreinte (PsExec avec création de service).
Persistance¶
implant/internal/modules/persist/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| Clés d'exécution du registre | T1547.001 | Événements Sysmon 13/12/14 (modification du registre), énumération d'exécution automatique | Élevé | Utilisez des clés moins surveillées (UserInitMprLogonScript) ; réglé pendant les périodes de faible activité |
| Tâches planifiées | T1053.005 | Événement de sécurité 4698 (tâche créée), événement Sysmon 1 (processus hôte de tâche) | Élevé | Utilisez des définitions de tâches XML avec des noms d'apparence légitime ; définir des temps de déclenchement distants |
| Création de services | T1543.003 | Événement Service Manager 7045, modification du registre sous HKLM\SYSTEM\CurrentControlSet\Services | Élevé | Imitez les conventions de dénomination de services légitimes ; utiliser les services partagés svchost.exe |
| Détournement de DLL | T1574.001 | Événements de création de fichiers (Sysmon Event 11), chargement de DLL à partir de chemins inhabituels | Moyen | Cibler les applications qui se chargent à partir de répertoires inscriptibles ; faire correspondre les métadonnées de la DLL |
| Détournement de COM | T1546.015 | Modification du registre dans HKCU\Software\Classes\CLSID, modifications InprocServer32 | Faible | Le détournement de COM est difficile à détecter sans référence ; choisissez des CLSID obscurs |
Hiérarchie OPSEC de persistance
Le détournement de COM est le mécanisme de persistance le plus furtif (faible détection, par utilisateur, aucun administrateur requis). Les clés d'exécution du registre et les tâches planifiées sont les plus détectées. Choisissez en fonction du niveau de privilège requis et de la capacité de surveillance cible.
Évasion de la défense¶
implant/internal/modules/evasion/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| AMSI Bypass (patch en ligne) | T1562.001 | Analyse de l'intégrité de la mémoire de amsi.dll, événements du fournisseur ETW AMSI | Moyen | Utilisez des points d'arrêt matériels (hwbp amsi on) au lieu de correctifs en ligne |
| Mise à jour ETW | T1562.006 | Surveillance de la valeur de retour EtwEventWrite, détection des écarts de session ETW | Moyen | Utiliser des points d'arrêt matériels (hwbp etw on) ; patch sélectivement par fournisseur |
| Masquage du sommeil | T1497.003 | Analyse périodique de la mémoire pendant les fenêtres d'exécution, analyse des modèles de minuterie | Faible | Activez les trois masques (texte + tas + pile) pour une couverture complète |
| Usurpation PPID | T1134.004 | Événements de processus du noyau ETW (incompatibilité EventHeader.ProcessId) | Faible | Choisir des processus parents contextuellement appropriés |
| Appels système indirects | T1106 | Analyse du cadre de pile (appel ntdll sans exportation correspondante), ETW Threat-Intelligence | Faible | Combinez avec BeaconGate pour une couverture API complète |
| Décrochage EDR | T1562.001 | Vérification périodique de l'intégrité du hook par EDR, accès à la section KnownDlls | Moyen | Utiliser le décrochage ciblé (fonction unique) plutôt que la restauration complète des DLL |
Évasion en couches
Aucune technique d’évasion n’est suffisante. Combinez appels système indirects + BeaconGate + masquage du sommeil + HWBP + module stomping pour une couverture complète. La commande opsec note votre posture actuelle et identifie les lacunes.
Découverte¶
implant/internal/modules/discovery/)| Technique | ATTAQUE À ONGLET&CK | Vecteur de détection | Gravité | Atténuation |
|---|---|---|---|---|
| Numérisation réseau | T1046 | Détection d'anomalies réseau (modèles de balayage de port), journaux de pare-feu | Élevé | Taux de balayage des gaz ; cibler des ports spécifiques ; utiliser l'analyse ARP sur le sous-réseau local |
| Énumération LDAP | T1087.002 | Anomalies de volume de requêtes LDAP, modèles de base de recherche/filtre inhabituels | Moyen | Utiliser des requêtes ciblées (UO/groupes spécifiques) ; répartir les requêtes dans le temps |
| Analyse SPN | T1558.003 | Requêtes Kerberos TGS avec type RC4, volume de requêtes SPN inhabituel | Moyen | Demandez des billets AES ; limiter la portée aux SPN de grande valeur |
| Découverte du système local | T1082 | Exécution de processus (systeminfo, ipconfig, etc.), requêtes WMI | Faible | Utilisez des appels d'API natifs au lieu de générer des processus ; préférer l'exécution BOF |
| Découverte de confiance de domaine | T1482 | Requêtes LDAP pour les objets trustDomain, exécution de nltest.exe | Faible | Utilisez LDAP directement au lieu de nltest ; requête unique plutôt qu'une énumération |
Découverte OPSEC
Les commandes de découverte qui génèrent des processus enfants (commandes shell) sont plus détectables que celles utilisant des API natives ou des BOF. Préférez l’exécution en ligne plutôt que le fork-and-run lorsque cela est possible. Utilisez execute-assembly avec les outils .NET compilés plutôt que les commandes shell pour l'énumération AD.
Pipeline d’obfuscation Garble¶
Garble est l'outil d'obscurcissement au moment de la construction de Stentor pour les binaires Go. Il supprime, crypte ou randomise les artefacts médico-légaux qui rendent les binaires Go identifiables et réversibles. Comprendre ce que Garble corrige et ce qu'il ne peut pas corriger est essentiel pour la planification OPSEC.
Créer un flux de pipeline¶
graph LR
A[Payload Generation<br/>API / CNA Hook] --> B[garble<br/>-seed=random<br/>-literals -tiny]
B --> C[ldflags<br/>-s -w -trimpath<br/>-buildid=]
C --> D[Compiled Binary<br/>EXE / DLL]
D --> E{Shellcode<br/>Wrapping?}
E -->|Yes| F[Donut<br/>Position-independent<br/>shellcode]
E -->|No| G[Final Binary<br/>Obfuscated EXE/DLL]
F --> H[Final Payload<br/>PE headers stripped]
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 F fill:#0d47a1,color:#fff
style H fill:#01579b,color:#fff Ce que Garble corrige¶
| Artefact | Risque sans confusion | Drapeau brouillé | Statut |
|---|---|---|---|
Chemins d'accès aux packages (github.com/...) | Chemin du dépôt source complet visible dans les chaînes | -trimpath + brouillage | CORRIGÉ |
| Noms des fonctions/symboles | Tous les noms de fonctions récupérables | -seed=random | FIXED -- noms randomisés par build |
| Littéraux de chaîne (URL, erreurs, configuration) | URL C2, messages d'erreur lisibles | -literals | FIXED -- chaînes chiffrées au moment de la compilation |
| Métadonnées de l'ID de build | Liens binaires vers l'environnement de construction | -buildid= (ldflags) | FIXED -- supprimé du binaire |
| Taille binaire (sortie panique/débogage) | Chaînes de panique, binaire de gonflement des informations de débogage | -tiny | RÉDUIT -- ~15 % plus petit, sortie de panique supprimée |
| Symboles de débogage | Informations complètes sur le débogage DWARF | -s -w (ldflags) | FIXED -- supprimé par défaut |
Limitations connues et irréparables¶
Il s’agit d’exigences architecturales du runtime Go. Aucun outil d'obscurcissement ne peut les supprimer sans casser le binaire.
| Limitation | Gravité | Pourquoi irréparable | Atténuation |
|---|---|---|---|
octets magiques pclntab (0xFFFFFFF0/0xFFFFFFF1) | ÉLEVÉ | Requis par le runtime Go pour le déroulement de la pile, le GC et la récupération de panique | L'emballage du shellcode Donut supprime entièrement les en-têtes PE ; le masque de sommeil crypte le .text pendant le sommeil |
| Caractéristiques des sections PE spécifiques à Go | MOYEN | L'éditeur de liens Go produit une disposition et un alignement distinctifs des sections .text/.data | Le chargeur Donut/shellcode élimine la structure PE ; Le clonage PE (en-tête Rich) réduit le caractère unique |
| Aller aux goroutines d'exécution (sysmon, GC) | MOYEN | Les threads d'arrière-plan pour le garbage collection et la surveillance du système sont toujours en cours d'exécution | Filtrage du nombre de threads ; le masque de sommeil interrompt le GC pendant le sommeil |
| Tapez les métadonnées pour Reflect/Interfaces | FAIBLE | Noms de types exportés requis pour la répartition et la réflexion de l'interface | Définissez GOGARBLE pour limiter la portée ; éviter les types exportés inutiles |
| .text lisible pendant l'exécution | MOYEN | Go ne peut pas s'exécuter à partir d'une mémoire non lisible (pas d'exécution W^X uniquement) | Le masque de sommeil crypte le .text pendant le sommeil ; exposé uniquement pendant l'exécution active |
| Aller à la version dans pclntab | FAIBLE | La version de la structure pclntab révèle la gamme de versions Go (1.18+ vs 1.20+) | Non pratiquement exploitable au-delà de l'identification de la famille de versions Go |
Le pclntab (Tableau des numéros de ligne du compteur de programme) est l'artefact non réparable le plus risqué. Il existe dans chaque binaire Go et contient :
- Octets magiques qui identifient la famille de versions Go (0xFFFFFFF0 pour Go 1.18+, 0xFFFFFFF1 pour Go 1.20+)
- Points d'entrée des fonctions (noms tronqués mais structure intacte)
- Mappages de numéros de ligne du fichier source (chemins supprimés par -trimpath)
- Tailles de cadre de pile pour le déroulement
Des outils comme GoReSym exploitent cette structure pour récupérer les limites des fonctions, même à partir de binaires tronqués. La structure elle-même ne peut pas être supprimée – le runtime Go panique sans elle.
Impact : Tout binaire contenant des octets magiques pclntab peut être identifié comme Go indépendamment de toute autre obscurcissement. Les analystes binaires peuvent récupérer les limites des fonctions (mais pas les noms) et reconstruire le graphe d'appel du programme.
Meilleure atténuation : Enveloppez le binaire tronqué dans le shellcode Donut. Donut convertit le binaire en code indépendant de la position, supprimant entièrement les en-têtes PE et les caractéristiques des sections. Le pclntab existe toujours en mémoire au moment de l'exécution, mais il est chiffré pendant les périodes de veille lorsque le masquage du sommeil est activé.
Modes de construction¶
| Mode | Commande | Cas d'utilisation | Niveau d'obscurcissement |
|---|---|---|---|
| Développement | make build-implant | Itération rapide, débogage | Minimal (symboles supprimés, -trimpath, -buildid=) |
| Fabrication | make build-implant-prod | Déploiement de l'engagement | Complet (garble -seed=random -literals -tiny) |
| Payloads de relais (obscurcies) | API de payload avec obfuscate: true | Payloads générées par l'opérateur | Complet (mêmes drapeaux déformés que la production) |
| Payloads de relais (pas de confusion) | API de payload avec obfuscate: false | Tests rapides | Minimal (-trimpath, -buildid= dans ldflags) |
Outils de détection¶
| Outil | Auteur | Capacité | Efficacité contre les garbles |
|---|---|---|---|
| GoReSym | Mandiant | Récupère les symboles via l'analyse de la structure pclntab | Élevé – récupère les limites des fonctions malgré le brouillage |
| GoStringUngarbler | Vaincre le garble -literals via la correspondance de modèles | Moyen -- identifie et déchiffre le chiffrement de chaîne de Garble | |
| Indéformable | Plugin Ninja binaire | Analyse CFG pour inverser l'obscurcissement des confusions | Moyen - le graphique de flux de contrôle récupère les informations sémantiques |
| Règles YARA (pclntab) | Divers | Détecte les binaires Go via l'analyse des octets magiques de pclntab | Fonctionne toujours - exigence architecturale, ne peut pas être masquée |
| chaînes + grep | Norme | Recherche des chaînes de texte en clair en binaire | Inefficace -- garble -literals crypte toutes les constantes |
| PE-ours / CFF Explorer | Divers | Analyse la structure du PE et les caractéristiques des sections | Partiel : identifie la disposition des sections spécifiques à Go |
Guide de l'opérateur¶
-
Garble est une évasion, pas une invisibilité. Cela rend l'ingénierie inverse statique beaucoup plus difficile mais ne rend pas un binaire inanalysable. Un analyste déterminé utilisant GoReSym peut toujours récupérer les limites des fonctions.
-
Les binaires Go SONT identifiables comme Go. Les octets magiques pclntab sont une exigence architecturale. Aucune dissimulation ne peut changer cela. Si "not Go" est une exigence stricte, utilisez le stager C pour l'accès initial.
-
Enveloppez l'implant tronqué dans le chargeur de shellcode. Donut convertit l'EXE tronqué en shellcode indépendant de la position, supprimant entièrement les en-têtes PE et les caractéristiques de section.
-
Le masque de sommeil protège au moment de l'exécution. Pendant le sommeil, la section .text est cryptée en mémoire, annulant ainsi l'analyse de la mémoire pour les modèles Go.
-
-seed=randomsignifie que chaque build est unique. Chaque compilation produit un binaire avec différents noms de symboles et clés de cryptage de chaîne, battant ainsi la détection AV basée sur les signatures. -
La détection comportementale EDR est orthogonale au garble. Garble n'affecte que l'analyse statique. Les détections comportementales (séquences d'appels API, modèles de réseau, injection de threads) ne sont pas affectées par l'obscurcissement binaire.
-
Le stager C évite entièrement les signatures Go. Le stager MinGW C (~ 23 Ko) télécharge et exécute l'implant complet. Il n'a pas de runtime Go, pas de pclntab, pas de goroutines. Utilisez le stager C lorsque l’accès initial ne doit pas ressembler à Go.
Commande de posture OPSEC d'exécution¶
La commande opsec exécute l'OpsecModule (implant/internal/modules/opsec/opsec.go) et renvoie un rapport de posture noté avec 17 vérifications individuelles. Utilisez-le pour auditer la configuration d'évasion d'un beacon avant d'exécuter des opérations sensibles.
Exécuter la commande¶
Syntaxe du shell :
Exemple d'API :
curl -s -X POST https://stentor.app/api/v1/cockpit/shell \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"beacon_id": "BEACON_UUID",
"command": "opsec"
}'
Exemple de sortie¶
[*] OPSEC Posture Report
[*] Score: 71/100
[+] syscall_method: indirect -- APIs routed via ntdll gadgets
[+] sleep_mask: enabled -- .text encrypted during sleep
[+] heap_mask: enabled -- Heap records encrypted during sleep
[!] stack_mask: disabled -- Thread stack visible during sleep
[+] beacon_gate: enabled (25 APIs) -- Sensitive APIs through syscall shim
[!] module_stomp: disabled -- No module stomping (MEM_PRIVATE allocations)
[+] ppid_spoof: explorer.exe -- Child processes spoofed under explorer.exe
[+] spawnto: RuntimeBroker.exe (pool: 7) -- Context-aware rotation
[+] amsi_patched: enabled -- AmsiScanBuffer patched in fork-and-run
[!] etw_patched: disabled -- ETW active in fork-and-run processes
[+] tls_fingerprint: chrome_auto -- uTLS fingerprint spoofing active
[!] sleep_method: direct -- Standard sleep (no timer queue obfuscation)
[+] drip_load_inject: enabled -- Injection memory allocated in small chunks
[+] use_rwx: disabled -- W^X compliant (RW->RX transitions)
[!] udrl: disabled -- Standard reflective loading
[-] edr_hooks: 3 hooked -- Hooked: NtAllocateVirtualMemory, NtWriteVirtualMemory, NtCreateThreadEx -- run edr_unhook
[+] hwbp_status: 2/4 DR slots active -- AMSI/ETW bypass via hardware breakpoints
Recommendations:
- Consider enabling stack masking for additional sleep protection
- Configure module stomping DLL for MEM_IMAGE backing
- Consider timer_queue sleep method for Ekko-style timer-based sleep
- Consider enabling UDRL for custom reflective loading
- Run edr_unhook to remove EDR userland hooks before injection/credential operations
Calcul des scores¶
Chacun des 17 contrôles est noté en fonction de son statut :
| Statut | Points | Indicateur | Signification |
|---|---|---|---|
good | 1.0 | [+] | Paramètre OPSEC optimal actif |
warn | 0.5 | [!] | Acceptable mais amélioration disponible |
bad | 0.0 | [-] | Risque de détection important |
info | 0.0 | [*] | Informatif (non noté en fonction de la posture) |
Formule : score = (sum of points / total checks) * 100
Un score de 100 signifie que les 17 chèques sont dans l'état good. Visez un score minimum de 70 pour les engagements standard et de 85+ pour les environnements à forte intensité EDR.
Les 17 contrôles de posture¶
| # | Vérifier | Valeurs | Bien | Avertir | Mauvais | Recommandation |
|---|---|---|---|---|---|---|
| 1 | syscall_method | indirect, direct, none | indirect | direct | aucun | Activer les appels système indirects pour contourner les hooks du mode utilisateur |
| 2 | sleep_mask | enabled, disabled | activé | -- | désactivé | Chiffrer la mémoire du beacon pendant le sommeil |
| 3 | heap_mask | enabled, disabled | activé | désactivé | -- | Activer le chiffrement de tas pour une protection supplémentaire du sommeil |
| 4 | stack_mask | enabled, disabled | activé | désactivé | -- | Activer le chiffrement de la pile et l'usurpation d'identité |
| 5 | beacon_gate | enabled (N APIs), disabled | activé | -- | désactivé | Acheminer les API sensibles via des appels système |
| 6 | module_stomp | Nom de la DLL, disabled | DLL configurée | désactivé | -- | Utiliser le support MEM_IMAGE via le module Stomping |
| 7 | ppid_spoof | nom du processus, disabled | configuré | désactivé | -- | Usurper le PID parent du processus enfant |
| 8 | spawnto | exe + informations sur le pool | personnalisé/piscine | -- | rundll32.exe | Changement par rapport à rundll32.exe par défaut |
| 9 | amsi_patched | enabled, disabled | activé | désactivé | -- | Corriger AMSI dans les processus fork-and-run |
| 10 | etw_patched | enabled, disabled | activé | désactivé | -- | Corriger ETW dans les processus fork-and-run |
| 11 | tls_fingerprint | nom de l'empreinte digitale, default | configuré | -- | par défaut | Définir l'empreinte digitale uTLS pour éviter la détection Go TLS |
| 12 | sleep_method | timer_queue, direct | minuterie_file d'attente | direct | -- | Utilisez le mode veille basé sur une minuterie de style Ekko |
| 13 | drip_load_inject | enabled, disabled | activé | désactivé | -- | Allouer la mémoire d'injection en petits morceaux |
| 14 | use_rwx | disabled, enabled | désactivé (W^X) | -- | activé (RWX) | Désactivez RWX pour les allocations conformes à W^X |
| 15 | udrl | enabled, disabled | activé | désactivé | -- | Activer le chargeur réfléchissant défini par l'utilisateur |
| 16 | edr_hooks | none detected, N hooked | aucun | -- | accro | Exécutez edr_unhook avant les opérations sensibles |
| 17 | hwbp_status | N/4 DR slots, inactive | actif | -- | -- | Activer HWBP pour le contournement AMSI/ETW sans correctif |
Améliorer votre score
Exécutez opsec après l'enregistrement initial pour identifier les lacunes, puis utilisez les commandes d'évasion pour activer les contrôles manquants. Une séquence de durcissement typique : syscall-method indirect puis beacon_gate enable puis sleep_config sleep_mask on puis hwbp both on.
Matrice de décision : sélection de la technique par environnement¶
Sélectionnez les techniques d'évasion en fonction de la posture défensive de l'environnement cible. La matrice ci-dessous mappe chaque paramètre configurable à trois profils d'environnement.
| Technique | Laboratoire / Pas d'EDR | EDR standard | EDR-lourd / MDR |
|---|---|---|---|
| Méthode d'appel système | none -- aucune évasion nécessaire | direct -- contourne les hooks du mode utilisateur | indirect -- trampoline ntdll, le plus difficile à détecter |
| Masquage du sommeil | Désactivé : itération rapide | .text uniquement -- protection de base de la mémoire | .text + tas + pile -- couverture complète |
| Méthode de sommeil | direct -- fiable, déboguable | direct -- stable pour les opérations | timer_queue -- évite la surveillance SleepEx |
| BeaconGate | Désactivé - surcharge inutile | Activé : couvre 25 API critiques | Activé + mask_on_call -- crypte la mémoire par appel d'API |
| usurpation d'identité PPID | Désactivé | explorer.exe pour le contexte utilisateur | Parent adapté au contexte (svchost pour SYSTEM, RuntimeBroker pour l'utilisateur) |
| Piétinement de modules | Désactivé | xpsservices.dll -- Support MEM_IMAGE | xpsservices.dll -- essentiel pour contourner l'analyse de la mémoire |
| SpawnTo | Par défaut (rundll32.exe) | RuntimeBroker.exe ou dllhost.exe | svchost.exe + usurpation d'argument + blockdll |
| Contournement AMSI/ETW | Pas nécessaire | Patch en ligne (commandes amsi / etw) | Points d'arrêt matériels (hwbp both on) -- aucune modification de la mémoire |
| Technique d'injection | CreateRemoteThread -- le plus simple | QueueUserAPC ou NtMapViewOfSection | Early Bird APC + module stomping + appels système indirects |
| Processus fork-and-run | N'importe lequel | RuntimeBroker.exe avec des blockdll | Minimisez les « fork-and-run » ; préférer l'exécution en ligne BOF |
| Transport C2 | HTTP -- non chiffré, rapide | HTTPS avec empreinte digitale uTLS | HTTPS + profil malléable + fronting de domaine |
| Obscurcissement des confusions | Désactivé : constructions plus rapides | Complet (-seed=random -literals -tiny) | Encapsulation du shellcode Full + Donut + Stager C pour l'accès initial |
| Empreinte digitale TLS | Go TLS par défaut | chrome_auto -- imite Chrome | chrome_auto -- essentiel pour éviter les signatures Go TLS |
| Injection goutte à goutte | Désactivé : inutile | Activé (délai de 10 ms) | Activé (délai de 20 ms+) pour une allocation prudente |
| UtiliserRWX | Soit – pas de surveillance EDR | Désactivé (W^X : RW puis RX) | Désactivé : les pages RWX sont des signaux d'alarme immédiats |
Profils d'évasion complets¶
Utilisez ces profils copier-coller comme points de départ pour chaque type d'environnement.
Configuration minimale pour une itération et des tests rapides.
Aucun paramètre d'évasion n'est nécessaire. Concentrez-vous sur les tests de fonctionnalités.
Évasion modérée pour les environnements avec CrowdStrike, SentinelOne, Defender for Endpoint ou similaire.
Évasion maximale pour les environnements fortement surveillés avec SOC actif, analyse de la mémoire et analyse comportementale.
sleep 300 40
syscall-method indirect
sleep_config sleep_mask on
sleep_config heap_mask on
sleep_config stack_spoof on
sleep_config stack_depth 0
sleep_config method timer_queue
beacon_gate enable
beacon_gate mask_on_call true
ppid explorer.exe
spawnto x64 %windir%\sysnative\dllhost.exe
blockdlls start
hwbp both on
argue net1.exe /enum /domain
Compromis de stabilité
Les paramètres d'évasion maximum (masquage de pile, veille timer_queue, masque sur appel) augmentent la surcharge du processeur et peuvent interagir avec le runtime Go dans les cas extrêmes. Testez minutieusement dans un miroir de laboratoire de l’environnement cible avant le déploiement. Utilisez opsec pour vérifier que la configuration est appliquée correctement.
Workflow de sélection de profil
- Exécutez une reconnaissance pour identifier les produits EDR sur la cible (utilisez
edr_queryou une énumération manuelle) - Sélectionnez le profil approprié dans la matrice ci-dessus
- Appliquer les paramètres via les commandes d'évasion après l'enregistrement initial du beacon
- Exécutez
opsecpour vérifier la configuration et vérifier votre score de posture - Ajustez les paramètres individuels en fonction des recommandations du rapport de posture
Garde-corps d'exécution¶
Les garde-fous d'exécution imposent des limites opérationnelles à l'exécution des beacons. Configurez-les au moment de la génération de le payload pour empêcher les beacons de s'exécuter dans des environnements non autorisés, après les délais d'engagement ou en dehors des fenêtres opérationnelles.
Date de mise à mort¶
Le beacon vérifie la date actuelle par rapport à la date d'élimination configurée à chaque cycle d'interrogation. Après la date d'arrêt, le beacon exécute CleanupArtifacts (supprime les tâches planifiées, les clés de registre et s'auto-supprime), puis se termine.
Fixez toujours une date de mise à mort
Chaque payload d'engagement doit avoir une date de mise à mort. Les beacons oubliées qui s’enregistrent après la fin d’un engagement sont un handicap. Définissez la date de mise à mort sur la date de fin de l'engagement plus une période tampon (généralement 7 jours).
Heures de travail¶
Limitez l’activité du beacon à des heures et des jours spécifiques. En dehors de la fenêtre configurée, le beacon calcule le temps restant jusqu'à la prochaine période de travail et se met en veille pendant cette durée dans un seul appel de veille obscurci (et non dans une boucle de vérification-veille rapide).
Le mappage des fuseaux horaires Windows couvre 16 zones communes. Le beacon résout le nom du fuseau horaire Windows en décalage UTC au démarrage.
Géolocalisation¶
Restreindre l’exécution à des environnements réseau spécifiques. Le beacon vérifie ces contraintes au démarrage et revérifie tous les 10 cycles d'interrogation.
| Contrainte | Méthode de vérification | Action en cas de non-concordance |
|---|---|---|
| Plage IP | IP des adaptateurs locaux par rapport à la liste CIDR | Sortie + nettoyage |
| Nom d'hôte | os.Hostname() par rapport à la liste autorisée | Sortie + nettoyage |
| Domaine | Barre oblique inverse dans l'heuristique du nom d'utilisateur | Sortie + nettoyage |
| Nom d'utilisateur | Utilisateur actuel par rapport à la liste autorisée | Sortie + nettoyage |
{
"geofence_ips": ["10.10.10.0/24", "192.168.1.0/24"],
"geofence_hostnames": ["WS01", "WS02"],
"geofence_domains": ["corp.local"],
"geofence_usernames": ["labuser"]
}
Détection DNS Canary¶
Configurez un domaine DNS Canary que le beacon résout au démarrage. Si le domaine est résolu (indiquant que le binaire a été soumis à un bac à sable qui résout automatiquement le DNS), le beacon déclenche le point de terminaison Canary et se termine.
Le point final du voyage Canary n'est pas authentifié (accessible au relais sans jeton JWT), de sorte que le beacon peut signaler avant même l'enregistrement C2 complet. La résolution Canary utilise net.Resolver (multiplateforme, aucune beacon de build nécessaire).
Vérifications OPSEC préalables à la tâche¶
Lorsque anti_analysis est activé, le beacon exécute des vérifications d'environnement avant d'exécuter des tâches sensibles :
- Détection EDR - 10 signatures de processus de fournisseurs (CrowdStrike, SentinelOne, Defender, Carbon Black, Cylance, ESET, Kaspersky, Sophos, Trend Micro, Symantec)
- Indicateurs du bac à sable – Faible nombre de processeurs, faible RAM, installation récente du système d'exploitation, noms d'utilisateur du bac à sable connus
- Détection du débogueur --
IsDebuggerPresent,NtQueryInformationProcess(ProcessDebugPort) - Indicateurs VM – Clés de registre pour VMware/VirtualBox/Hyper-V, préfixes MAC connus
Un seuil d'indicateur 2+ est requis pour le déclenchement (un seul indicateur est ignoré pour réduire les faux positifs). Voir Anti-Analysis pour la configuration d'exécution.
Nettoyage à la sortie¶
Lorsqu'un garde-corps se déclenche ou que la date de mise à mort est atteinte, CleanupArtifacts effectue :
- Supprime 3 noms de tâches planifiées connues utilisées par la persistance
- Nettoie 3 modèles de clés de registre utilisés par la persistance
- Supprime automatiquement le binaire du beacon via un fichier batch (
cmd /c del /q /f <path>)
Recommandations opérationnelles¶
Pré-Engagement¶
La sécurité opérationnelle commence avant que la première payload ne touche le réseau cible.
Configuration de l'infrastructure :
- Catégorisation des domaines : Enregistrez les domaines plus de 30 jours avant l'engagement. Soumettez-les aux services de catégorisation (Bluecoat, McAfee, Palo Alto) pour une classification légitime. Les domaines datant de moins de 7 jours sont signalés par la plupart des proxys Web.
- Certificats TLS : Utilisez Let's Encrypt ou achetez des certificats légitimes. Les certificats auto-signés sont signalés par les appareils d'inspection SSL et génèrent des avertissements du navigateur.
- Redirecteurs : Placez les redirecteurs Apache/nginx entre le trafic de l'implant et le serveur d'équipe. Configurez les règles de redirection pour filtrer les sondages des analystes (user-agent, plages IP, timing).
- Profils malléables : utilisez un profil C2 malléable qui imite les modèles de trafic légitimes (Microsoft 365, Slack, CDN). Testez le profil par rapport aux bases de données d'empreintes digitales JA3/JA4.
Tests de payload :
- Construire avec garble : Utilisez toujours
obfuscate: truepour les payloads d'engagement. Testez les taux de détection par rapport à l’AV/EDR de la cible dans un environnement miroir. - Définissez des garde-fous : configurez des garde-fous d'adresse IP, de nom d'hôte, de domaine ou de nom d'utilisateur pour empêcher l'exécution sur les sandbox d'analyste.
- Définissez les dates d'arrêt : Chaque payload d'engagement doit avoir une date d'arrêt définie sur la date de fin de l'engagement plus une période tampon.
- Vérifiez la sortie tronquée : Exécutez
stringssur le binaire tronqué pour confirmer qu'il ne reste aucune URL C2 en texte clair, message d'erreur ou chemin de package.
Liste de contrôle des infrastructures
Âge du domaine > 30 jours, certificat TLS valide, redirecteur avec règles de filtrage, profil malléable testé par rapport aux bases de données JA3, garde-fous définis, date de mise à mort configurée. L’absence de l’un de ces éléments augmente considérablement le risque de détection lors de l’accès initial.
Accès initial¶
La première exécution de le payload est le moment le plus risqué. Un binaire inconnu exécuté pour la première fois déclenche l'analyse la plus agressive.
- Utilisez le stager C pour éviter la signature Go. Le stager MinGW C (~ 23 Ko) n'a pas de runtime Go, pas de pclntab, pas de goroutines. Il télécharge et exécute l'implant complet en mémoire. Utilisez-le lorsque le compte-gouttes initial ne doit pas être identifié comme Go.
- Sélectionnez le transport avec soin. HTTPS avec empreinte digitale uTLS (
chrome_auto) est la valeur par défaut la plus sûre. DNS C2 est utile pour les environnements qui bloquent le HTTPS direct mais ont une bande passante inférieure. SMB est destiné uniquement au pivotement interne (pas à l'accès initial). - Utilisez des profils malléables. Un profil malléable bien configuré fait apparaître le trafic C2 comme HTTPS légitime pour les appareils d'inspection. Sans cela, les modèles HTTP par défaut sont facilement signés.
- Réduisez l'empreinte initiale. Exécutez
opsecimmédiatement après le premier enregistrement. Appliquez le profil d'évasion approprié avant d'exécuter des commandes post-exploitation.
Post-Exploitation¶
Chaque commande exécutée via le beacon génère des artefacts. Minimisez l’empreinte en choisissant soigneusement les méthodes d’exécution.
- Préférez BOF plutôt que fork-and-run. Les fichiers objets Beacon s'exécutent en ligne dans le processus Beacon : pas de création de processus enfant, pas d'injection, pas de terminaison de processus sacrificiel. Fork-and-run génère un processus enfant visible que EDR surveille.
- Préférez
inline-executeàexecute-assembly. Pour les outils .NET, l'exécution en ligne évite les artefacts de chargement CLR détectés par le profilage .NET au niveau du processus. - Gérer les intervalles de veille. Le mode interactif (veille 0) génère un trafic réseau continu. Utilisez
sleep 5pour les opérations actives et revenez àsleep 60+lorsque vous êtes inactif. La gigue empêche la détection de modèles. - Surveillez la génération du journal des événements. Chaque technique génère des événements Windows spécifiques. Soyez conscient des événements que votre opération actuelle produit (voir les tableaux des surfaces de détection ci-dessus).
Fork-and-run est l'opération la plus bruyante
Chaque opération fork-and-run crée une chaîne de processus visible : le beacon génère un processus sacrificiel, injecte du code, capture la sortie, termine le processus. Cela génère les événements Sysmon 1 (création de processus), 8 (CreateRemoteThread), 5 (fin de processus) et potentiellement 10 (accès au processus). Utilisez des BOF ou une exécution en ligne dans la mesure du possible.
Mouvement latéral¶
Le déplacement entre les systèmes génère des événements d'authentification que les SOC mettent en corrélation dans l'ensemble de l'environnement.
- Évitez de répéter PtH sur la même cible. La transmission du hachage au même système à partir de la même source génère un modèle détecté par la corrélation automatisée. Varier les beacons sources et les techniques.
- Nettoyer les services après PsExec. PsExec crée un service (événement 7045) qui persiste après l'exécution. Supprimez le service immédiatement après utilisation.
- Soyez conscient des horodatages. Les mouvements latéraux en dehors des heures d'ouverture (connexion à 3h00 depuis le poste de travail) génèrent des alertes. Faites correspondre l'activité aux heures d'ouverture prévues pour le compte cible.
- Préférez WMI ou DCOM à PsExec. L'exécution WMI et les abus DCOM génèrent moins d'artefacts distinctifs que l'exécution basée sur les services. WMI est particulièrement efficace car l’activité WMI est courante dans les environnements d’entreprise.
- Utilisez l'usurpation d'identité de jeton pour un contexte légitime. Volez les jetons des processus appartenant aux utilisateurs qui accéderaient légitimement au système cible, puis déplacez-vous latéralement dans ce contexte.
Persistance et longue distance¶
Les opérations de longue durée nécessitent une attention particulière aux modèles de comportement des beacons.
- Gestion des intervalles de sommeil. Les beacons longue distance doivent utiliser des intervalles de sommeil de plus de 300 secondes avec une gigue de 30 à 40 %. Les modèles d'enregistrement lents et faibles sont beaucoup plus difficiles à détecter via la détection des anomalies du réseau.
- Rotation des transports. Si vous travaillez sur plusieurs jours, envisagez une rotation entre les transports (HTTPS vers DNS ou entre différents points de terminaison HTTPS) pour éviter une détection de modèles cohérente.
- Modèles d'enregistrement des beacons. Même en cas de gigue, un beacon qui s'enregistre à des intervalles parfaitement réguliers se démarque. La combinaison sommeil + instabilité crée une variation naturelle, mais sachez que les engagements extrêmement longs peuvent présenter des tendances globales.
- Diversité des mécanismes de persistance. Ne comptez pas sur un seul mécanisme de persistance. Utilisez le détournement de COM (furtif, faible détection) comme tâche principale et une tâche planifiée (fiable, haute détection) comme sauvegarde. Testez la survie de la persistance lors des redémarrages en laboratoire.
- Actualisation des informations d'identification. Les tickets Kerberos et les sessions NTLM expirent. Planifiez des intervalles d'actualisation des informations d'identification et disposez d'une procédure pour obtenir à nouveau l'accès si la persistance survit mais que les informations d'identification mises en cache expirent.
Nettoyage¶
Le nettoyage de l'engagement est une obligation de l'OPSEC. Supprimez ou documentez tous les artefacts laissés sur les systèmes cibles.
Conscience du journal des événements :
Chaque technique génère des événements Windows spécifiques. Événements clés à connaître :
| Technique | Événements générés | Remarques |
|---|---|---|
| Injection de processus | Sysmon 1, 8, 10 | CreateRemoteThread enregistré avec les PID source/cible |
| Création de services | Sécurité 7045 | Nom du service, chemin binaire, compte visible |
| Tâche planifiée | Sécurité 4698 | Définition XML de tâche enregistrée |
| Modification du registre | Sysmon 12, 13, 14 | Chemin de clé, anciennes/nouvelles valeurs enregistrées |
| Authentification (latérale) | Sécurité 4624, 4625 | Type de connexion, IP source, nom de compte enregistré |
| Requêtes Kerberos | Sécurité 4768, 4769 | SPN, type de cryptage, options de ticket enregistrées |
| Accès LSASS | Sysmon 10 | Processus source, masque d'accès accordé enregistré |
| PowerShell | Événement 4103, 4104 | Journalisation complète en ligne de commande et en blocs de script |
Vous ne pouvez pas supprimer les journaux d'événements de sécurité sans laisser de trace
L'effacement du journal des événements de sécurité génère l'événement 1102 (le journal d'audit a été effacé). La suppression sélective (evtdelete) génère toujours l'événement 1102/104 et laisse des espaces vides dans l'ID d'enregistrement. La seule façon d'éviter cela est de ne pas générer l'événement en premier lieu : choisissez des techniques avec des empreintes de journal inférieures.
Suppression des artefacts :
- Supprimez les fichiers supprimés. Supprimez tous les exécutables, DLL ou scripts placés sur le disque. Utilisez
timestomppour restaurer les horodatages d'origine sur les répertoires auxquels vous avez accédé. - Supprimez les mécanismes de persistance. Supprimez les clés de registre, les tâches planifiées, les services et les entrées de piratage COM. Vérifiez la suppression avec une deuxième vérification.
- Nettoyer les artefacts de service. Les services PsExec, les abonnements WMI et les enregistrements DCOM doivent tous être supprimés.
- Utilisez timestomp pour les opérations sur les fichiers. La commande
timestomp(T1070.006) modifie les horodatages des fichiers pour qu'ils correspondent aux fichiers environnants, réduisant ainsi l'efficacité de l'analyse de la chronologie. Voir opérations sur les fichiers pour plus de détails. - Documentez ce qui ne peut pas être supprimé. Certains artefacts (entrées du journal des événements, traces ETW, enregistrements d'audit au niveau du noyau) ne peuvent pas être supprimés après l'exécution. Documentez-les dans votre rapport de mission afin que le client puisse réinitialiser les références.
Indicateurs de risque du menu contextuel¶
Le menu contextuel du cockpit affiche un point de risque OPSEC coloré à côté de chaque technique, donnant aux opérateurs une évaluation du risque en un coup d'oeil avant l'exécution.
| Couleur | Niveau de risque | Signification |
|---|---|---|
| Faible | Énumération passive, lectures de configuration, appels API bénins. Génère une télémétrie minimale. Sûr pour la reconnaissance initiale. | |
| Moyen | Opérations actives avec empreinte de détection modérée. Fork-and-run, manipulation de tokens, opérations fichiers, contournement UAC, LOLBins. | |
| Élevé | Opérations touchant des ressources fortement surveillées : LSASS, SAM, NTDS, injection de processus, vol de credentials, PowerShell, opérations destructives. La plupart des EDR les signalent immédiatement. |
Utilisez les indicateurs de risque pour planifier votre approche
Commencez un engagement avec des techniques d'énumération vertes (faible risque) pour cartographier l'environnement avant de passer aux techniques jaunes et rouges. Cela réduit le risque de détection précoce et vous donne le temps d'identifier quelles défenses sont actives.
Les niveaux de risque sont définis dans les métadonnées YAML de la base de connaissances (server/knowledge_base/techniques/) et servis via l'API -- ils ne sont pas codés en dur dans l'interface et peuvent être ajustés par engagement.
Voir le Guide du menu contextuel pour la liste complète des indicateurs visuels incluant les badges de privilège et le filtrage par OS.
Références croisées¶
- Kits d'évasion -- Options d'évasion au moment de la construction, kits personnalisés (artefact, ressource, UDRL, masque de sommeil) et tableau de référence complet des options d'évasion.
- Commandes d'évasion -- Syntaxe des commandes d'évasion d'exécution, exemples d'API et profils recommandés pour chaque commande
- Injection de processus -- Détails de la technique d'injection, méthodes prises en charge et considérations OPSEC par technique
- Accès aux informations d'identification -- Commandes de collecte d'informations d'identification avec conseils OPSEC par technique
- Profils malléables -- OPSEC au niveau du réseau via la mise en forme du trafic, le masquage d'empreintes digitales TLS et la transformation HTTP