Aller au contenu

Notifications par webhook

Les notifications par webhook envoient des alertes en temps reel vers des canaux Slack, Discord ou Microsoft Teams lorsque des evenements C2 significatifs se produisent. Au lieu de consulter le tableau de bord, les operateurs recoivent des notifications push instantanees pour les nouveaux beacons, les beacons perdus, les taches terminees et les identifiants recoltes -- le tout formate nativement pour chaque fournisseur.


Fournisseurs pris en charge

Stentor prend en charge trois fournisseurs de webhooks. Chaque fournisseur recoit des payloads formates dans son format de messagerie natif pour des notifications riches et interactives.

Fournisseur Format d'URL du webhook Format du payload
slack https://hooks.slack.com/services/T.../B.../xxx Block Kit (blocs header + section avec mrkdwn)
discord https://discord.com/api/webhooks/123456/abcdef Embeds avec bordures colorees
teams https://outlook.office.com/webhook/... (connecteur Incoming Webhook) Adaptive Cards v1.4

Obtenir les URL de webhook

  • Slack : Creez un Incoming Webhook dans les parametres de votre espace de travail Slack
  • Discord : Ouvrez Parametres du canal > Integrations > Webhooks > Nouveau Webhook > Copier l'URL du Webhook
  • Teams : Ajoutez un connecteur Incoming Webhook a votre canal Teams et copiez l'URL generee

Types d'evenements

Quatre types d'evenements peuvent declencher des notifications par webhook. Chaque evenement a une couleur associee utilisee pour les bordures des embeds Discord et un ensemble specifique de champs de payload.

Evenement Titre affiche Couleur Description
beacon_new New Beacon Vert (#22C55E) Se declenche lorsqu'un nouvel implant s'enregistre aupres du serveur C2
beacon_dead Beacon Lost Rouge (#EF4444) Se declenche lorsqu'un beacon manque des check-ins et est marque comme perdu
task_complete Task Complete Bleu (#3B82F6) Se declenche lorsqu'une execution de tache est terminee sur un beacon
credential_added Credential Harvested Ambre (#F59E0B) Se declenche lorsqu'un identifiant est recolte depuis une cible

Champs du payload

Chaque type d'evenement expose differents champs de payload dans le message de notification :

Champ Description
hostname Nom de la machine cible
username Contexte utilisateur actuel
ip Adresse IP du beacon
os Systeme d'exploitation (ex. "Windows 10 Pro")
pid ID du processus du beacon

Exemple de message : Host: WS01 | User: CORP\jsmith | IP: 10.10.10.21 | OS: Windows 10 Pro | PID: 4832

Champ Description
hostname Nom de la machine cible
username Contexte utilisateur actuel
ip Adresse IP du beacon
last_seen Horodatage du dernier check-in

Exemple de message : Host: WS01 | User: CORP\jsmith | IP: 10.10.10.21 | Last Seen: 2026-02-21T10:00:00Z

Champ Description
beacon Identifiant du beacon
task_type Type de tache terminee
output Sortie de la tache (tronquee a 200 caracteres)

Exemple de message : Beacon: a1b2c3d4 | Task: exec.shell | Output: USER INFORMATION...

Champ Description
credential_type Type d'identifiant (ex. ntlm, kerberos, plaintext)
username Nom d'utilisateur de l'identifiant
source Source de l'identifiant (ex. lsass, sam, dcsync)

Exemple de message : Type: ntlm | Username: CORP\admin | Source: lsass


Reference API

Tous les endpoints webhook sont sous le groupe de routes cockpit et necessitent une authentification JWT.

Chemin de base : /api/v1/cockpit/webhooks

Methode Endpoint Description
GET /api/v1/cockpit/webhooks Lister tous les endpoints webhook
POST /api/v1/cockpit/webhooks Creer un nouveau endpoint webhook
PUT /api/v1/cockpit/webhooks/:id Mettre a jour un endpoint webhook
DELETE /api/v1/cockpit/webhooks/:id Supprimer un endpoint webhook
POST /api/v1/cockpit/webhooks/:id/test Envoyer une notification de test
GET /api/v1/cockpit/webhooks/:id/logs Lister les journaux de livraison (50 derniers)

Creer un endpoint webhook

POST /api/v1/cockpit/webhooks

Corps de la requete :

Champ Type Requis Description
name string Oui Nom d'affichage de l'endpoint webhook
provider string Oui Type de fournisseur : slack, discord ou teams
url string Oui URL du webhook du fournisseur
events string[] Oui Tableau des types d'evenements auxquels s'abonner
filters object Non Objet JSON de filtre pour le matching d'evenements (par defaut {})
curl -s -X POST https://stentor.app/api/v1/cockpit/webhooks \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Slack Alerts",
    "provider": "slack",
    "url": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
    "events": ["beacon_new", "beacon_dead", "credential_added"],
    "filters": {}
  }'

Reponse (201 Created) :

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Slack Alerts",
  "provider": "slack",
  "url": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
  "events": ["beacon_new", "beacon_dead", "credential_added"],
  "filters": {},
  "enabled": true,
  "created_at": "2026-02-21T10:00:00Z",
  "updated_at": "2026-02-21T10:00:00Z"
}

Lister les endpoints webhook

GET /api/v1/cockpit/webhooks

Retourne tous les endpoints webhook configures.

curl -s https://stentor.app/api/v1/cockpit/webhooks \
  -H "Authorization: Bearer $TOKEN"

Mettre a jour un endpoint webhook

PUT /api/v1/cockpit/webhooks/:id

Prend en charge les mises a jour partielles -- seuls les champs fournis sont modifies. Tous les champs sont optionnels.

Corps de la requete :

Champ Type Requis Description
name string Non Nom d'affichage mis a jour
provider string Non Fournisseur mis a jour (slack, discord, teams)
url string Non URL du webhook mise a jour
events string[] Non Abonnements aux evenements mis a jour
filters object Non Objet de filtre mis a jour
enabled boolean Non Activer ou desactiver l'endpoint
curl -s -X PUT https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "events": ["beacon_new", "credential_added"]
  }'
curl -s -X PUT https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": false
  }'

Supprimer un endpoint webhook

DELETE /api/v1/cockpit/webhooks/:id

Supprime definitivement un endpoint webhook et tous les journaux de livraison associes.

curl -s -X DELETE https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID \
  -H "Authorization: Bearer $TOKEN"

Reponse : 204 No Content

Envoyer une notification de test

POST /api/v1/cockpit/webhooks/:id/test

Envoie une notification de test a l'endpoint webhook pour verifier que la configuration fonctionne. Consultez la section Envoi de test pour les details sur le payload de test.

curl -s -X POST https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID/test \
  -H "Authorization: Bearer $TOKEN"

Reponse (200 OK) :

{
  "message": "test notification sent"
}

Reponse d'erreur (502 Bad Gateway) :

{
  "error": "webhook returned HTTP 404"
}

Lister les journaux de livraison

GET /api/v1/cockpit/webhooks/:id/logs

Retourne les 50 dernieres tentatives de livraison pour un endpoint webhook, classees par les plus recentes en premier. Consultez la section Journaux de livraison pour la description des champs.

curl -s https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID/logs \
  -H "Authorization: Bearer $TOKEN"

Filtrage

Les filtres permettent de restreindre quels evenements declenchent une notification webhook. L'objet de filtre est une map JSON cle-valeur ou les cles correspondent aux noms des champs du payload et les valeurs sont comparees au payload de l'evenement.

Fonctionnement du filtrage

  • Filtres vides ({}) -- Tous les evenements correspondant aux types d'evenements abonnes passent (comportement par defaut)
  • Comparaison de chaines -- Les valeurs des filtres sont comparees de maniere insensible a la casse avec strings.EqualFold
  • Champs manquants -- Si une cle de filtre n'existe pas dans le payload de l'evenement, ce critere de filtre est ignore (ne bloque pas la livraison)
  • Filtres multiples -- Tous les criteres de filtre doivent correspondre pour que l'evenement passe (ET logique)

Exemples de filtres

Ne declencher que pour les evenements d'un hote specifique :

{
  "filters": {
    "hostname": "DC01"
  }
}

Ce webhook ne se declenche que lorsque le payload de l'evenement contient un hostname correspondant a "DC01" (insensible a la casse).

Ne declencher que pour les recoltes d'identifiants NTLM :

{
  "filters": {
    "credential_type": "ntlm"
  }
}

Ce webhook ne se declenche que pour les evenements credential_added ou le type d'identifiant est "ntlm".

Ne declencher que pour un utilisateur specifique sur un hote specifique :

{
  "filters": {
    "hostname": "WS01",
    "username": "CORP\\admin"
  }
}

Les deux conditions doivent correspondre (logique ET) pour que le webhook se declenche.

Portee des filtres

Les filtres s'appliquent aux champs du payload d'evenement documentes dans la section Types d'evenements. Par exemple, les evenements beacon_new exposent hostname, username, ip, os et pid -- vous pouvez filtrer sur n'importe lequel de ces champs.


Formats de payload par fournisseur

Chaque fournisseur recoit les notifications dans son format de messagerie natif pour un rendu optimal.

Slack

Les webhooks Slack recoivent des payloads Block Kit avec un bloc header affichant le titre de l'evenement et un bloc section avec les details de l'evenement formates en mrkdwn.

{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Stentor: New Beacon"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Host: WS01 | User: CORP\\jsmith | IP: 10.10.10.21 | OS: Windows 10 Pro | PID: 4832"
      }
    }
  ]
}

Discord

Les webhooks Discord recoivent des payloads Embed avec des bordures colorees correspondant au type d'evenement et un horodatage ISO 8601.

{
  "embeds": [
    {
      "title": "Stentor: New Beacon",
      "description": "Host: WS01 | User: CORP\\jsmith | IP: 10.10.10.21 | OS: Windows 10 Pro | PID: 4832",
      "color": 2278494,
      "timestamp": "2026-02-21T10:00:00Z"
    }
  ]
}

Le champ color est une representation entiere de la couleur de l'evenement (ex. 0x22C55E = 2278494 pour le vert).

Microsoft Teams

Les webhooks Teams recoivent des payloads Adaptive Card v1.4 enveloppes dans une piece jointe de message. La carte contient un TextBlock de titre en gras et un TextBlock de description avec retour a la ligne.

{
  "type": "message",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "type": "AdaptiveCard",
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "version": "1.4",
        "body": [
          {
            "type": "TextBlock",
            "text": "Stentor: New Beacon",
            "weight": "bolder",
            "size": "medium"
          },
          {
            "type": "TextBlock",
            "text": "Host: WS01 | User: CORP\\jsmith | IP: 10.10.10.21 | OS: Windows 10 Pro | PID: 4832",
            "wrap": true
          }
        ]
      }
    }
  ]
}

Envoi de test

Avant de compter sur un webhook pour les alertes en direct, utilisez l'endpoint test-send pour verifier votre configuration. La notification de test utilise un payload fixe qui exerce l'ensemble du pipeline de livraison sans necessiter de vrais evenements C2.

Payload de test

Le test-send utilise les champs de payload suivants :

Champ Valeur
hostname TEST-HOST
username test_user
ip 10.0.0.1
os Windows 10 Pro
pid 1234

La notification apparait dans votre canal avec le titre "Stentor: Test Notification" et une couleur d'accentuation violette (Discord) ou un formatage standard (Slack/Teams).

Envoyer un test

curl -s -X POST https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID/test \
  -H "Authorization: Bearer $TOKEN"

Reponse de succes :

{
  "message": "test notification sent"
}

Reponse d'echec (ex. URL invalide ou le fournisseur a rejete le payload) :

{
  "error": "webhook returned HTTP 404"
}

Verifier avant de deployer

Envoyez toujours une notification de test apres avoir cree ou mis a jour un endpoint webhook. Cela confirme que l'URL est correcte, que le fournisseur accepte le format du payload et que votre reseau permet les connexions HTTPS sortantes vers les serveurs du fournisseur.


Journaux de livraison

Chaque tentative de livraison de webhook est enregistree dans un journal de livraison. Les journaux sont stockes par endpoint et peuvent etre interroges pour depanner les echecs de livraison, verifier les notifications reussies ou auditer l'activite des webhooks.

Champs du journal de livraison

Champ Type Description
id string (UUID) Identifiant unique de l'entree de journal
endpoint_id string (UUID) Endpoint webhook parent
event_type string Type d'evenement ayant declenche la livraison (beacon_new, beacon_dead, task_complete, credential_added ou test)
status_code integer ou null Code de statut HTTP du fournisseur (null si la connexion a echoue)
success boolean Si la livraison a reussi (HTTP 2xx)
error_message string ou null Description de l'erreur si la livraison a echoue
delivered_at string (ISO 8601) Horodatage de la tentative de livraison

Interroger les journaux de livraison

L'API retourne les 50 dernieres entrees de journal de livraison pour un endpoint donne.

curl -s https://stentor.app/api/v1/cockpit/webhooks/$WEBHOOK_ID/logs \
  -H "Authorization: Bearer $TOKEN"

Reponse (200 OK) :

[
  {
    "id": "aaa11111-bbbb-cccc-dddd-eeeeeeeeeeee",
    "endpoint_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "event_type": "beacon_new",
    "status_code": 200,
    "success": true,
    "error_message": null,
    "delivered_at": "2026-02-21T10:05:00Z"
  },
  {
    "id": "bbb22222-cccc-dddd-eeee-ffffffffffff",
    "endpoint_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "event_type": "credential_added",
    "status_code": null,
    "success": false,
    "error_message": "Post \"https://hooks.slack.com/services/...\": dial tcp: lookup hooks.slack.com: no such host",
    "delivered_at": "2026-02-21T09:55:00Z"
  }
]

Retention des journaux

L'API retourne les 50 entrees de journal de livraison les plus recentes par endpoint. Les entrees plus anciennes restent dans la base de donnees mais ne sont pas retournees par l'API.


Configuration dans l'interface

L'interface de configuration des webhooks est integree dans la page Preferences sous la carte Webhook Settings.

Fonctionnalites

  • Dialogue de creation/edition -- Configurez le nom du webhook, le fournisseur, l'URL, les evenements et les filtres via un dialogue de formulaire
  • Bouton activer/desactiver -- Desactivez temporairement un endpoint webhook sans le supprimer
  • Test en ligne -- Cliquez sur le bouton de test pour envoyer une notification de test directement depuis la liste des endpoints
  • Visualiseur de journaux de livraison -- Developpez n'importe quelle ligne d'endpoint pour afficher les journaux de livraison recents avec des indicateurs de statut (coche verte pour succes, X rouge pour echec)
  • Badges d'evenements -- Chaque endpoint affiche ses evenements abonnes sous forme de badges colores

Flux de travail

  1. Naviguez vers Preferences > Webhook Settings
  2. Cliquez sur Add Webhook pour ouvrir le dialogue de creation
  3. Selectionnez un fournisseur (Slack, Discord ou Teams)
  4. Collez l'URL du webhook de votre fournisseur
  5. Selectionnez les evenements qui doivent declencher des notifications
  6. Ajoutez optionnellement des criteres de filtre pour restreindre la portee des evenements
  7. Cliquez sur Save pour creer l'endpoint
  8. Cliquez sur le bouton Test pour verifier la configuration
  9. Verifiez votre canal pour la notification de test

Depannage

Probleme Cause Solution
Le test-send retourne 502 Bad Gateway L'URL du webhook est incorrecte ou le fournisseur a rejete la requete Verifiez que l'URL est une URL d'incoming webhook valide pour le fournisseur selectionne. Verifiez que le webhook n'a pas ete revoque ou supprime dans les parametres du fournisseur.
status_code: null dans les journaux de livraison La connexion reseau a echoue avant d'atteindre le fournisseur Verifiez la connectivite HTTPS sortante depuis le serveur Stentor. Assurez-vous que les regles de pare-feu autorisent les connexions vers hooks.slack.com, discord.com ou outlook.office.com.
Les notifications cessent d'arriver L'endpoint webhook a ete desactive ou le fournisseur a change/revoque l'URL Verifiez le statut enabled de l'endpoint via l'API ou l'interface. Regenerez l'URL du webhook dans les parametres du fournisseur si elle a ete changee.
Erreur "invalid provider" a la creation Le champ provider n'est pas l'une des valeurs acceptees Utilisez exactement slack, discord ou teams (en minuscules).
Erreur "invalid event" a la creation Un ou plusieurs evenements dans le tableau ne sont pas reconnus Utilisez uniquement beacon_new, beacon_dead, task_complete ou credential_added.
Le webhook se declenche pour des evenements non desires Les filtres sont trop larges ou vides Ajoutez des criteres de filtre pour restreindre la portee. Par exemple, {"hostname": "DC01"} restreint les notifications aux evenements de cet hote.
Limitation de debit du fournisseur Trop de notifications en peu de temps Reduisez le nombre d'evenements abonnes ou ajoutez des filtres pour limiter le volume de notifications. Slack limite a environ 1 message par seconde par URL de webhook.
La carte Teams ne s'affiche pas Incompatibilite de version du schema Adaptive Card Stentor envoie des payloads Adaptive Card v1.4. Assurez-vous que votre canal Teams prend en charge cette version (la plupart des clients Teams modernes le font).

References croisees

  • Reference de l'API REST -- Les endpoints webhook sont listes sous la section Cockpit
  • Playbooks -- Automatisez des flux de travail de beacon en plusieurs etapes pouvant declencher des evenements webhook
  • Regroupement des beacons -- Regroupez les beacons pour une surveillance organisee ; filtrez les evenements webhook par nom d'hote pour correspondre aux groupes