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¶
| 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¶
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.
Obtenez une campagne¶
curl -s "https://stentor.app/api/v1/c2/campaigns/$CAMPAIGN_ID" \
-H "Authorization: Bearer $TOKEN" | jq
Mettre à jour une campagne¶
| 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¶
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¶
| 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¶
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¶
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.
Associer un listener¶
| 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.
Dissocier un listener¶
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¶
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.
| 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 |
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.
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.
| 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.
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¶
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) :
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 :
| 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) :
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¶
- Rapports de campagne – Types de rapports, formats et détails du contenu
- Intégration MITRE ATT&CK -- Suivi des techniques et export du navigateur
- Artefacts -- IOC enregistrés automatiquement lors de l'exécution de tâches
- Journal d'audit -- Piste d'audit des actions de l'opérateur