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¶
Commande de lien¶
La commande link connecte un beacon parent au serveur de canaux SMB d'un beacon enfant :
Exemple :
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 Commande de dissociation¶
La commande unlink déconnecte un beacon enfant de son parent :
Exemple :
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: truesur 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 :
- L'enfant demande la clé publique RSA du parent (Phase 1)
- L'enfant génère une clé de session AES-256 de 32 octets
- L'enfant chiffre la clé de session avec la clé publique RSA du parent à l'aide d'OAEP-SHA256.
- Le parent décrypte et confirme en envoyant une réponse « OK » cryptée
- 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. |