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.
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
{
"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.
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é.
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.
{
"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) |