Aller au contenu

Campagnes C2

Les campagnes C2 constituent l'unité organisationnelle de niveau supérieur pour les engagements des équipes rouges chez Stentor. Une campagne regroupe les beacons, les tâches, les informations d'identification et les listeners dans un contexte opérationnel unique, permettant ainsi la création de rapports par engagement, le suivi des activités et l'agrégation des informations d'identification sur toutes les sessions associées.


Aperçu

Chaque beacon peut être attribuée à exactement une campagne. Une fois associées, toutes les tâches exécutées via ce beacon et toutes les informations d'identification obtenues à partir de celle-ci sont attribuées à la campagne. Cela alimente le moteur de reporting (PDF, DOCX, CSV, JSON, TSV, XML) et donne aux opérateurs une vue unifiée de l'activité d'engagement.

graph LR
    C[Campaign] --> B1[Beacon 1]
    C --> B2[Beacon 2]
    C --> B3[Beacon 3]
    B1 --> T1[Tasks]
    B2 --> T2[Tasks]
    B3 --> T3[Tasks]
    B1 --> CR1[Credentials]
    B2 --> CR2[Credentials]
    C --> L[Linked Listeners]
    L --> AB[Auto-associate<br/>new beacons]
    C --> R[Reports & Export]

Objet de campagne

Champ Type Description
id UUID Identifiant unique de la campagne
name chaîne Nom à afficher de la campagne
description chaîne Description en texte libre
status chaîne active, paused ou archived
created_by UUID Opérateur qui a créé la campagne
start_date horodatage Date de début de l'engagement (facultatif)
end_date horodatage Date de fin de mission (facultatif)
created_at horodatage Heure de création de l'enregistrement
updated_at horodatage Heure de la dernière modification
recording_mode booléen Si le mode d'enregistrement est activé
beacon_count int Nombre en direct des beacons associées
credential_count int Décompte en direct des identifiants récoltés
task_count int Nombre en direct des tâches exécutées

Comptes en direct

Les champs beacon_count, credential_count et task_count sont calculés au moment de la requête et reflètent l'état actuel de la base de données. Ils ne sont pas stockés sur le dossier de campagne lui-même.


Campagne CRUD

Créer une campagne

POST /api/v1/c2/campaigns
Champ Type Obligatoire Description
name chaîne Oui Nom de la campagne
description chaîne Non Description de la campagne
start_date RFC3339 Non Date de début des fiançailles
end_date RFC3339 Non Date de fin de mission
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ACME Corp Pentest Q1",
    "description": "Quarterly external penetration test",
    "start_date": "2026-02-01T00:00:00Z",
    "end_date": "2026-02-28T23:59:59Z"
  }' | jq
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "ACME Corp Pentest Q1",
  "description": "Quarterly external penetration test",
  "status": "active",
  "created_by": "operator-uuid",
  "start_date": "2026-02-01T00:00:00Z",
  "end_date": "2026-02-28T23:59:59Z",
  "created_at": "2026-02-21T10:00:00Z",
  "updated_at": "2026-02-21T10:00:00Z",
  "recording_mode": false,
  "beacon_count": 0,
  "credential_count": 0,
  "task_count": 0
}

Les nouvelles campagnes sont créées avec status: "active" par défaut.

Répertorier toutes les campagnes

GET /api/v1/c2/campaigns

Renvoie toutes les campagnes de l'opérateur authentifié, classées par ordre d'importance. Chaque campagne de la réponse comprend des valeurs beacon_count, credential_count et task_count en direct calculées via des requêtes par lots.

curl -s "https://stentor.app/api/v1/c2/campaigns" \
  -H "Authorization: Bearer $TOKEN" | jq

Obtenez une campagne

GET /api/v1/c2/campaigns/:id
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID" \
  -H "Authorization: Bearer $TOKEN" | jq

Mettre à jour une campagne

PUT /api/v1/c2/campaigns/:id
Champ Type Obligatoire Description
name chaîne Oui Nom mis à jour
description chaîne Non Description mise à jour
status chaîne Oui active, paused ou archived
start_date RFC3339 Non Date de début mise à jour
end_date RFC3339 Non Date de fin mise à jour
curl -s -X PUT "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ACME Corp Pentest Q1 (Complete)",
    "description": "Engagement completed successfully",
    "status": "archived"
  }' | jq

Statuts valides

Le champ status doit être l'un des active, paused ou archived. Toute autre valeur renvoie une erreur 400.

Supprimer (Archiver) une campagne

DELETE /api/v1/c2/campaigns/:id

Les campagnes sont supprimées de manière réversible en définissant leur statut sur archived. Aucune donnée n'est définitivement supprimée.

curl -s -X DELETE "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID" \
  -H "Authorization: Bearer $TOKEN"
# Returns 204 No Content

Association des beacons

Les beacons sont attribuées aux campagnes soit manuellement via l'API, soit automatiquement via des listeners liés. Chaque beacon peut appartenir à au plus une campagne à la fois.

Associer un beacon

POST /api/v1/c2/campaigns/:id/beacons
Champ Type Obligatoire Description
beacon_id UUID Oui ID du beacon à associer
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/beacons" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"beacon_id": "beacon-uuid-here"}' | jq

L'association est conservée à la fois dans la base de données et dans le registre des beacons en mémoire.

Dissocier un beacon

DELETE /api/v1/c2/campaigns/:id/beacons/:beaconId
curl -s -X DELETE "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/beacons/$BEACON_ID" \
  -H "Authorization: Bearer $TOKEN"
# Returns 204 No Content

Liste des beacons de campagne

GET /api/v1/c2/campaigns/:id/beacons

Renvoie toutes les beacons actuellement associées à la campagne à partir du registre des beacons en mémoire.

curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/beacons" \
  -H "Authorization: Bearer $TOKEN" | jq

Liaison des listeners

Liez les listeners à une campagne afin que toute nouvelle beacon s'enregistrant via cet listener soit automatiquement attribuée à la campagne. Cela élimine le besoin d’associer manuellement chaque nouvelle beacon.

POST /api/v1/c2/campaigns/:id/listeners
Champ Type Obligatoire Description
listener_id UUID Oui ID du listener à lier
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/listeners" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"listener_id": "listener-uuid-here"}' | jq

Opération idempotente

Lier deux fois le même listener est sûr : l'opération utilise ON CONFLICT DO NOTHING et renvoie le succès sans dupliquer l'association.

DELETE /api/v1/c2/campaigns/:id/listeners/:listenerId
curl -s -X DELETE "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/listeners/$LISTENER_ID" \
  -H "Authorization: Bearer $TOKEN"
# Returns 204 No Content

Liste des listeners liés

GET /api/v1/c2/campaigns/:id/listeners

Renvoie un tableau de chaînes UUID d'écoute.

curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/listeners" \
  -H "Authorization: Bearer $TOKEN" | jq

Journal d'activité

Le journal d'activité fournit une vue chronologique paginée de toutes les tâches exécutées sur chaque beacon de la campagne.

GET /api/v1/c2/campaigns/:id/activity
Paramètre Type Par défaut Description
limit int 50 Tâches maximales par page (plafonnées à 200)
offset int 0 Décalage de pagination
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/activity?limit=25&offset=0" \
  -H "Authorization: Bearer $TOKEN" | jq
{
  "tasks": [
    {
      "id": "task-uuid",
      "beacon_id": "beacon-uuid",
      "task_type": "shell",
      "data": "{\"command\":\"whoami\"}",
      "status": "completed",
      "output": "CORP\\jdoe",
      "created_at": "2026-02-21T14:30:00Z",
      "completed_at": "2026-02-21T14:30:01Z"
    }
  ],
  "total": 342
}

Les tâches sont classées les plus récentes en premier. Le champ total active l'interface utilisateur de pagination en signalant le nombre complet de tâches sur toutes les beacons de campagne.


Agrégation d'informations d'identification

Récupérez toutes les informations d'identification collectées à partir de n'importe quelle beacon de la campagne en une seule requête.

GET /api/v1/c2/campaigns/:id/credentials
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/credentials" \
  -H "Authorization: Bearer $TOKEN" | jq

Objet d'identification

Champ Type Description
id UUID ID de l'enregistrement d'informations d'identification
session_id UUID Séance associée (facultatif)
beacon_id UUID Beacon qui a récupéré les informations d'identification
credential_type chaîne Type (par exemple, ntlm, plaintext, kerberos)
username chaîne Nom d'utilisateur du compte
domain chaîne Nom de domaine
secret chaîne Hachage du mot de passe ou texte en clair
host chaîne Hôte source
source chaîne Comment l'identifiant a été obtenu (par exemple, hashdump, mimikatz)
note chaîne Notes pour l'opérateur
created_at horodatage Quand les informations d'identification ont été capturées

Mode d'enregistrement

Activez le mode d'enregistrement sur une campagne pour la signaler pour une journalisation améliorée des activités.

POST /api/v1/c2/campaigns/:id/record-mode
Champ Type Obligatoire Description
enabled booléen Oui S'il faut activer le mode d'enregistrement
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/record-mode" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true}' | jq

Réponse : {"recording_mode": true}


Exportation de campagne

Exportez les données de campagne dans plusieurs formats et types de rapports via un seul point de terminaison.

GET /api/v1/c2/campaigns/:id/export?format=<format>&type=<type>

Formats

Formater Type de contenu Remarques
pdf application/pdf Tous les types de rapports pris en charge
docx application/vnd.openxmlformats-officedocument.wordprocessingml.document Prend en charge des options supplémentaires (voir ci-dessous)
json application/json Tous les types de rapports pris en charge
csv text/csv Tous les types sauf full
tsv text/tab-separated-values Tous les types sauf full
xml application/xml Tous les types sauf full

Types de rapports

Type Clé Description
Campagne complète full Résumé complet de la mission combinant toutes les sections
Chronologie des activités activity Exécution chronologique des tâches avec les mappages MITRE ATT&CK
Hôtes hosts Cibler les systèmes avec des sessions et des services découverts
Indicateurs de compromis indicators Payloads, IOC réseau, artefacts de fichiers/registres
Séances sessions Détails de la session Beacon avec historique des commandes
TTP ttp Utilisation de la technique MITRE ATT&CK avec statistiques tactiques
Ingénierie sociale social_eng Analyse des visites du profileur avec répartitions géographiques

Restrictions de format

Le type de rapport full est uniquement disponible aux formats pdf, json et docx. Demander full avec csv, tsv ou xml renvoie une erreur 400.

Options DOCX

Le format DOCX prend en charge des paramètres de requête supplémentaires pour la personnalisation :

Paramètre Type Description
title chaîne Titre du rapport personnalisé
description chaîne Paragraphe de description
host_filter chaîne[] Filtrer sur des noms d'hôtes spécifiques
mask_emails bool Remplacez les e-mails par ***@***.***
mask_passwords bool Remplacez les hachages NTLM par ********

Exemples

curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=pdf&type=full" \
  -H "Authorization: Bearer $TOKEN" \
  -o campaign-report.pdf
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=json&type=ttp" \
  -H "Authorization: Bearer $TOKEN" | jq
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=csv&type=activity" \
  -H "Authorization: Bearer $TOKEN" \
  -o activity.csv
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=docx&type=full&mask_emails=true&mask_passwords=true&title=Engagement+Report" \
  -H "Authorization: Bearer $TOKEN" \
  -o engagement-report.docx
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=xml&type=indicators" \
  -H "Authorization: Bearer $TOKEN" \
  -o indicators.xml
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/export?format=tsv&type=sessions" \
  -H "Authorization: Bearer $TOKEN" \
  -o sessions.tsv

Pour des informations détaillées sur le contenu des rapports, voir Rapports de campagne.


Rapports spécialisés

Rapport d'ingénierie sociale

Un point de terminaison dédié pour le rapport d'ingénierie sociale au format JSON (séparé du point de terminaison d'exportation) :

GET /api/v1/c2/campaigns/:id/report/social-eng
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/report/social-eng" \
  -H "Authorization: Bearer $TOKEN" | jq

Rapports de modèles personnalisés

Restituez les données de campagne via un modèle Go personnalisé pour des besoins de reporting sur mesure.

Exécuter le modèle :

POST /api/v1/c2/campaigns/:id/report/custom
Champ Type Obligatoire Description
template chaîne Oui Aller à la chaîne de texte/modèle
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/report/custom" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"template": "Campaign: {{.Name}} | Beacons: {{len .Beacons}}"}' | jq

Valider le modèle (essai à sec) :

POST /api/v1/c2/campaigns/:id/report/validate-template
curl -s -X POST "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID/report/validate-template" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"template": "{{.Name}}"}' | jq

Réponse : {"valid": true, "error": ""} ou {"valid": false, "error": "template: ...: unexpected ..."}.


Référence API

Méthode Point de terminaison Description
POST /api/v1/c2/campaigns Créer une campagne
GET /api/v1/c2/campaigns Lister toutes les campagnes
GET /api/v1/c2/campaigns/:id Obtenez une campagne
PUT /api/v1/c2/campaigns/:id Mettre à jour une campagne
DELETE /api/v1/c2/campaigns/:id Archiver une campagne
POST /api/v1/c2/campaigns/:id/beacons Associer un beacon
DELETE /api/v1/c2/campaigns/:id/beacons/:beaconId Dissocier un beacon
GET /api/v1/c2/campaigns/:id/beacons Liste des beacons de campagne
POST /api/v1/c2/campaigns/:id/listeners Associer un listener
DELETE /api/v1/c2/campaigns/:id/listeners/:listenerId Dissocier un listener
GET /api/v1/c2/campaigns/:id/listeners Liste des listeners liés
GET /api/v1/c2/campaigns/:id/activity Obtenir le journal d'activité
GET /api/v1/c2/campaigns/:id/credentials Obtenez des informations d'identification agrégées
GET /api/v1/c2/campaigns/:id/export Rapport de campagne d'exportation
POST /api/v1/c2/campaigns/:id/record-mode Basculer le mode d'enregistrement
GET /api/v1/c2/campaigns/:id/report/social-eng Rapport d'ingénierie sociale
POST /api/v1/c2/campaigns/:id/report/custom Exécuter un modèle personnalisé
POST /api/v1/c2/campaigns/:id/report/validate-template Valider le modèle personnalisé

Voir aussi