Aller au contenu

Listeners de canal nommés SMB

Les canaux nommés SMB fournissent une communication C2 peer-to-peer (P2P) sur les réseaux Windows internes. Utilisez les listeners SMB lorsque les hôtes cibles ne disposent pas d’une sortie Internet directe et doivent relayer le trafic via un beacon parent qui le fait.


Topologie P2P

Le transport SMB crée une relation de beacon parent-enfant dans laquelle les hôtes internes enchaînent les beacons avec une connectivité Internet.

graph LR
    subgraph Internet
        Relay["Relay<br/>(Kali)"]
    end
    subgraph Internal Network
        A["Parent Beacon<br/>10.10.10.10<br/>(Internet Egress)"]
        B["Child Beacon<br/>10.10.10.50<br/>(No Egress)"]
        C["Deep Child<br/>10.10.10.80<br/>(Isolated Subnet)"]
    end

    Relay <-->|HTTPS| A
    A <-->|"SMB Pipe<br/>\\.\pipe\msagent_a1"| B
    B <-->|"SMB Pipe<br/>\\.\pipe\msagent_b2"| C
  • Beacon parent : dispose d'une sortie Internet, se connecte au relais via HTTPS (ou tout autre transport). Exécute un serveur de canaux SMB auquel les beacons enfants se connectent.
  • Beacon enfant : se connecte au canal nommé du parent. Tout le trafic C2 (enregistrement, tâches, résultats) est relayé via le parent vers le relais.
  • Profondeur de la chaîne : plusieurs sauts sont pris en charge. Le beacon A peut relayer pour B et B peut relayer pour C, créant ainsi des chaînes pivots profondes à travers des réseaux segmentés.

Bande passante

Les canaux SMB portent le protocole HTTP C2 complet en interne. Il n'y a aucune réduction de bande passante par rapport à une connexion HTTP directe : le canal nommé est simplement la couche de transport remplaçant les sockets TCP.


Création d'un listener SMB

Créez un listener SMB à l'aide de l'API REST :

curl -s -X POST https://stentor.app/api/v1/listeners \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "SMB Pivot",
    "type": "smb_pipe",
    "relay_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "port": 0,
    "smb_pipe_name": "msagent_a1"
  }'

La réponse inclut l’ID de l’listener. Démarrez le listener :

curl -s -X POST "https://stentor.app/api/v1/listeners/$LISTENER_ID/start" \
  -H "Authorization: Bearer $TOKEN"

Arrêtez le listener :

curl -s -X POST "https://stentor.app/api/v1/listeners/$LISTENER_ID/stop" \
  -H "Authorization: Bearer $TOKEN"

Dénomination des tuyaux pour OPSEC

Choisissez des noms de canaux qui se fondent dans les services Windows légitimes. Les défenseurs surveillent les canaux nommés, de sorte que les noms comme spoolss, samr, wkssvc ou atsvc sont moins susceptibles de déclencher des alertes que les noms évidemment personnalisés.


Options de configuration

Champ Type Par défaut Description
name chaîne requis Nom d'affichage pour le listener
type chaîne "smb_pipe" Doit être smb_pipe pour les listeners SMB
relay_id UUID requis Relais qui hébergera le serveur de tuyaux
port int 0 Non utilisé pour SMB (le nom du canal est l'identifiant). Définissez sur 0 ou n’importe quelle valeur.
smb_pipe_name chaîne "msagent_##" Identificateur de canal nommé sans le préfixe \\.\pipe\. ## est remplacé par un hexagone aléatoire au moment de la création.
guardrails JSON null Règles de filtrage des beacons. null signifie accepter toutes les beacons.

Liaison et dissociation des beacons

La commande link connecte un beacon parent au serveur de canaux SMB d'un beacon enfant :

link <target-host> <pipe-name>

Exemple :

link 10.10.10.50 msagent_a1

Le beacon parent se connecte à \\10.10.10.50\pipe\msagent_a1 et commence à relayer le trafic C2 pour l'enfant.

sequenceDiagram
    participant Operator
    participant Parent as Parent Beacon
    participant Child as Child Beacon<br/>(10.10.10.50)

    Operator->>Parent: link 10.10.10.50 msagent_a1
    Parent->>Child: Connect to \\10.10.10.50\pipe\msagent_a1
    Child-->>Parent: Pipe connection established
    Parent-->>Operator: Link successful

    loop C2 Loop
        Child->>Parent: Checkin / Task Results
        Parent->>Operator: Relayed via HTTPS
        Operator->>Parent: Tasks
        Parent->>Child: Relayed via SMB pipe
    end

La commande unlink déconnecte un beacon enfant de son parent :

unlink <beacon-id>

Exemple :

unlink 8a3b1c4d-5e6f-7890-abcd-ef1234567890

Le beacon enfant se déconnecte mais n'est pas tuée. Il peut être rétabli ultérieurement en exécutant à nouveau link à partir de n'importe quelle beacon pouvant atteindre l'hôte.


Conventions de dénomination des tuyaux

Source Nom du tuyau Description
Par défaut msagent_## ## remplacé par un hex aléatoire lors de la création du tuyau
Profil malléable Personnalisé Définir via smb-beacon { set pipename "custom_name"; }
Requête API Personnalisé Défini via le champ smb_pipe_name lors de la création du listener

Noms de tuyaux légitimes courants

Ces noms de canaux apparaissent sur les installations Windows standard et peuvent servir de références pour le mélange :

Nom du tuyau Service
spoolss Spouleur d'impression
samr SAM À Distance
lsarpc RPC LSA
wkssvc Service de poste de travail
srvsvc Service serveur
atsvc Planificateur de tâches
browser Navigateur d'ordinateur
netlogon Connexion réseau
epmapper Mappeur de point de terminaison

Évitez les conflits

N'utilisez pas le nom exact d'un canal déjà exécuté sur la cible. Windows n'autorise pas les noms de canaux en double. Ajoutez un suffixe ou une variante (par exemple, spoolss_01) pour éviter les collisions.


Cryptage

Les connexions SMB P2P prennent en charge le cryptage AES-256-GCM :

  • Activer : définissez encrypted: true sur la configuration du client SMB.
  • Échange de clés : utilise RSA OAEP avec SHA-256 et une étiquette P2P dédiée (stentor-p2p-keyx), distincte de l'étiquette d'échange de clé HTTP (stentor-keyx).
  • Par session : chaque lien établit une nouvelle clé de session AES-256. L'échange de clés est transparent pour l'opérateur.

Le flux de chiffrement :

  1. L'enfant demande la clé publique RSA du parent (Phase 1)
  2. L'enfant génère une clé de session AES-256 de 32 octets
  3. L'enfant chiffre la clé de session avec la clé publique RSA du parent à l'aide d'OAEP-SHA256.
  4. Le parent décrypte et confirme en envoyant une réponse « OK » cryptée
  5. Tous les messages suivants utilisent session.Encrypt() / session.Decrypt()

Architecture interne

Le serveur de canaux SMB utilise le même multiplexeur HTTP C2 que les listeners HTTP/HTTPS. Du point de vue du gestionnaire, le transport est invisible : les mêmes points de terminaison d'enregistrement de beacon, de file d'attente de tâches et de soumission de résultats sont servis via le canal.

Composant Détail
Chemin de canalisation \\.\pipe\{smb_pipe_name}
Taille du tampon d'E/S 64 Ko (entrée et sortie)
Délai de lecture 30 secondes
Délai d'écriture 30 secondes
Délai d'inactivité 60 secondes
Mode messages Flux (pas en mode message)

Dépannage

Symptôme Parce que Corriger
link échoue : "canal introuvable" Nom de canal incorrect ou pare-feu cible bloquant SMB (TCP 445) Vérifiez que le nom du canal correspond à la configuration du listener. Assurez-vous que TCP 445 est ouvert entre le parent et l'enfant.
link échoue : "accès refusé" Autorisations insuffisantes pour se connecter au tuyau Le descripteur de sécurité par défaut autorise Creator et SYSTEM. Exécutez le beacon parent en tant qu'utilisateur ayant accès.
Le lien tombe de manière inattendue Le beacon parent est morte ou interruption du réseau Vérifiez l'état du beacon parent. Reconnectez-vous après la récupération du parent.
Débit lent Plusieurs sauts ou réseau à latence élevée Les canaux SMB disposent de tampons d’E/S de 64 Ko. Les chaînes profondes (3+ sauts) accumulent de la latence. Pensez à restructurer la chaîne.
Le beacon enfant affiche "hors ligne" après la dissociation Comportement attendu L'enfant n'est pas tué, juste déconnecté. Reliez à nouveau pour le remettre en ligne.