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.
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 |
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.
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 :
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 :
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 :
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 :
Reponse d'echec (ex. URL invalide ou le fournisseur a rejete le payload) :
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¶
- Naviguez vers Preferences > Webhook Settings
- Cliquez sur Add Webhook pour ouvrir le dialogue de creation
- Selectionnez un fournisseur (Slack, Discord ou Teams)
- Collez l'URL du webhook de votre fournisseur
- Selectionnez les evenements qui doivent declencher des notifications
- Ajoutez optionnellement des criteres de filtre pour restreindre la portee des evenements
- Cliquez sur Save pour creer l'endpoint
- Cliquez sur le bouton Test pour verifier la configuration
- 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