Aller au contenu

Discussion d'équipe

Stentor comprend un système de discussion en temps réel intégré pour la coordination des opérateurs lors des engagements. Les messages sont transmis instantanément via le CockpitHub WebSocket, apparaissant dans l'onglet Journal des événements aux côtés des événements de beacon et des notifications système. Le chat prend en charge les messages publics, les messages privés, les messages d'action et les requêtes de présence de l'opérateur.


Architecture

Les messages de chat transitent via l'API REST vers le CockpitHub WebSocket, qui les diffuse en temps réel aux clients opérateurs connectés. Il n'y a pas de stockage de messages persistant : le chat est éphémère et limité à la session en cours.

sequenceDiagram
    participant Op1 as Operator A
    participant API as REST API
    participant Hub as CockpitHub<br/>(WebSocket)
    participant Op2 as Operator B
    participant Op3 as Operator C

    Op1->>API: POST /cockpit/chat<br/>{"message": "Got DA creds"}
    API->>Hub: BroadcastConsoleLog
    Hub-->>Op1: console_log event
    Hub-->>Op2: console_log event
    Hub-->>Op3: console_log event

Envoi de messages

Tous les messages de discussion sont envoyés via le même point de terminaison. Le contenu du message détermine s'il s'agit d'une diffusion publique, d'un message privé, d'une action ou d'une requête.

Message public

Un message de chat régulier diffusé à tous les opérateurs connectés.

curl -s -X POST https://stentor.app/api/v1/cockpit/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Starting lateral movement to DC01"
  }' | jq
{
  "status": "sent"
}

Tous les opérateurs connectés reçoivent un événement WebSocket :

{
  "type": "console_log",
  "payload": {
    "tab_id": "event-log",
    "timestamp": "14:30:05",
    "type": "chat",
    "text": "<[email protected]> Starting lateral movement to DC01"
  }
}

Message privé

Envoyez un message visible uniquement à un opérateur spécifique en utilisant le préfixe de commande /msg.

curl -s -X POST https://stentor.app/api/v1/cockpit/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "/msg [email protected] Check the creds I just dumped"
  }' | jq
{
  "status": "sent"
}
{
  "error": "operator \"[email protected]\" not connected"
}

Le message privé est transmis à la fois à l'expéditeur et au destinataire. Les autres opérateurs connectés ne le voient pas.

Format : /msg <recipient-email> <message text>

Le destinataire doit être connecté

Les messages privés ne peuvent être transmis qu'aux opérateurs disposant d'une connexion WebSocket active. Si le destinataire n'est pas connecté, l'API renvoie une erreur 404.


Message d'action

Envoyez un message d'action (similaire à IRC /me) qui s'affiche sous la forme d'une ligne d'état plutôt que d'une bulle de discussion.

curl -s -X POST https://stentor.app/api/v1/cockpit/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "/me is escalating privileges on WS01"
  }' | jq
{
  "status": "sent"
}

Tous les opérateurs connectés reçoivent :

{
  "type": "console_log",
  "payload": {
    "tab_id": "event-log",
    "timestamp": "14:32:10",
    "type": "info",
    "text": "*** [email protected] is escalating privileges on WS01"
  }
}

Format : /me <action text>


Liste des opérateurs connectés

Interrogez la liste des opérateurs actuellement connectés. Ce message est uniquement renvoyé à l'opérateur demandeur ; il n'est pas diffusé.

curl -s -X POST https://stentor.app/api/v1/cockpit/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "/names"
  }' | jq
{
  "status": "sent"
}

L'opérateur demandeur reçoit une entrée de journal de console privée :

{
  "type": "console_log",
  "payload": {
    "tab_id": "event-log",
    "timestamp": "14:33:00",
    "type": "info",
    "text": "Connected operators: [email protected], [email protected]"
  }
}

Résumé des commandes de discussion

Commande Syntaxe Visibilité Description
Publique <message> Tous les opérateurs Diffusé à tout le monde
Privé /msg <email> <text> Expéditeur + destinataire Message direct à un opérateur
Action /me <text> Tous les opérateurs Message d'état/d'action
Noms /names Expéditeur uniquement Lister les opérateurs connectés

Présence de l'opérateur

Liste des opérateurs connectés (REST)

Interrogez la liste des emails des opérateurs actuellement connectés via un point de terminaison REST dédié, indépendant du système de chat.

curl -s https://stentor.app/api/v1/cockpit/operators \
  -H "Authorization: Bearer $TOKEN" | jq
{
  "operators": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ],
  "count": 3
}

Champs de réponse :

Champ Type Description
operators chaîne[] Adresses email des opérateurs connectés
count int Nombre d'opérateurs connectés

Sondage automatique

L'interface utilisateur de Stentor interroge le point de terminaison des opérateurs toutes les 15 secondes pour maintenir à jour la liste des opérateurs connectés.


Intégration WebSocket

Les messages de discussion sont transmis via le CockpitHub WebSocket à /api/v1/cockpit/ws. Il s'agit du même WebSocket utilisé pour les mises à jour des beacons, l'achèvement des tâches et d'autres événements en temps réel. Les messages de chat se distinguent par leur structure d'événement :

Champ Valeur Description
type console_log Type d'événement (identique à la sortie du shell et aux messages système)
payload.tab_id event-log Toujours envoyé dans l'onglet Journal des événements
payload.type chat ou info chat pour les messages publics/privés, info pour les actions et /names
payload.timestamp HH:MM:SS Horodatage côté serveur lorsque le message a été traité
payload.text chaîne Texte du message formaté

Formats de texte des messages :

Type de discussion Format du texte
Publique <sender@email> message text
Privé [private] <sender@email -> recipient@email> message text
Action *** sender@email action text
Noms Connected operators: email1, email2, ...

Onglet Journal des événements

Les messages de discussion apparaissent dans l'onglet Journal des événements de la console du cockpit, aux côtés d'autres événements opérationnels (enregistrements de beacons, achèvements de tâches, erreurs). Cette chronologie unifiée donne aux opérateurs une vue chronologique de l'activité du système et de la communication de l'équipe.

Le journal des événements est l'onglet par défaut et est toujours disponible. Les messages de chat sont entrelacés avec :

  • Enregistrement des beacons et notifications d'enregistrement
  • Événements de mise en file d’attente et d’achèvement des tâches
  • Notifications de démarrage/arrêt du listener
  • Erreurs et avertissements système

Entrée de chat dédiée

L'entrée de la console du cockpit peut être utilisée à la fois pour les commandes du shell de beacon (lorsqu'un onglet de beacon est actif) et pour les messages de discussion (lorsque l'onglet Journal des événements est actif). Basculez vers l’onglet Journal des événements pour saisir des messages de discussion.


Résumé de l'API

Méthode Point de terminaison Description
POST /api/v1/cockpit/chat Envoyer un message de chat (public, privé, action ou requête de noms)
GET /api/v1/cockpit/operators Liste des opérateurs actuellement connectés
GET /api/v1/cockpit/ws Point de terminaison WebSocket pour les événements en temps réel (y compris la diffusion de chat)