Gestion des cibles¶
Les cibles représentent les hôtes découverts au cours de votre engagement : machines identifiées via les importations Nmap, les enregistrements de beacons, la saisie manuelle ou la génération par lots à partir de plages CIDR. L'inventaire cible donne aux opérateurs une vue unifiée de chaque machine concernée, qu'elle soit compromise ou non.
Architecture¶
Les cibles sont stockées dans PostgreSQL et exposées via une API REST. Ils peuvent être créés individuellement, en masse à partir de plages IP, ou importés directement à partir de la sortie d'analyse XML Nmap. Le système utilise la sémantique upsert : si une cible avec la même adresse IP existe déjà, les champs de métadonnées sont mis à jour tandis que les notes définies par l'opérateur sont conservées.
graph LR
subgraph Sources
A[Manual Entry]
B[Batch Create<br/>IP / CIDR / Range]
C[Nmap XML Import]
D[Beacon Check-in]
end
subgraph Backend
E[Target Handler]
F[Nmap Importer]
G[targets table]
H[services table]
end
A --> E
B --> E
C --> F
D --> E
E --> G
F --> G
F --> H Modèle cible¶
Chaque enregistrement cible contient les champs suivants :
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant unique (généré automatiquement) |
ip | chaîne | Adresse IPv4 (contrainte unique – utilisée pour la correspondance d'upsert) |
hostname | chaîne | Nom d'hôte DNS ou nom NetBIOS |
netbios_name | chaîne | Nom de l'ordinateur NetBIOS |
os | chaîne | Système d'exploitation (par exemple, « Windows 10 », « Ubuntu 22.04 ») |
arch | chaîne | Architecture du processeur (par exemple, "amd64", "x86") |
note | chaîne | Note définie par l'opérateur (conservée dans les upserts) |
source | chaîne | Source de découverte : manual, nmap, beacon |
last_seen | horodatage | La dernière fois que cet objectif a été observé |
discovered_at | horodatage | Quand la cible a été découverte pour la première fois |
created_at | horodatage | Heure de création de l'enregistrement |
updated_at | horodatage | Heure de modification du dernier enregistrement |
Comportement d'insertion
Lorsqu'une cible est créée avec une adresse IP qui existe déjà, le système met à jour hostname, os, arch, netbios_name, source et last_seen -- mais uniquement si les nouvelles valeurs ne sont pas vides. Le champ note n'est jamais écrasé en cas de conflit, garantissant ainsi que les annotations de l'opérateur sont préservées lors des importations d'analyses et des enregistrements de beacons.
Création de cibles¶
Cible unique¶
Créez une cible unique en spécifiant au minimum une adresse IP. Tous les autres champs sont facultatifs.
curl -s -X POST https://stentor.app/api/v1/targets \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ip": "10.10.10.21",
"hostname": "WS01.lab.local",
"netbios_name": "WS01",
"os": "Windows 10 Pro",
"arch": "amd64",
"note": "Developer workstation",
"source": "manual"
}' | jq
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ip": "10.10.10.21",
"hostname": "WS01.lab.local",
"netbios_name": "WS01",
"os": "Windows 10 Pro",
"arch": "amd64",
"note": "Developer workstation",
"source": "manual",
"last_seen": "2026-02-21T12:00:00Z",
"discovered_at": "2026-02-21T12:00:00Z",
"created_at": "2026-02-21T12:00:00Z",
"updated_at": "2026-02-21T12:00:00Z"
}
Champs de demande :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
ip | chaîne | Oui | Adresse IPv4 de la cible |
hostname | chaîne | Non | Nom d'hôte DNS |
netbios_name | chaîne | Non | Nom de l'ordinateur NetBIOS |
os | chaîne | Non | Système d'exploitation |
arch | chaîne | Non | Architecture du processeur |
note | chaîne | Non | Note de l'opérateur |
source | chaîne | Non | Source de découverte (par défaut : manual) |
Déduplication automatique
Si une cible avec la même adresse IP existe déjà, l'enregistrement est mis à jour plutôt que dupliqué. Cela permet de réimporter en toute sécurité les résultats de l'analyse sans créer d'entrées en double.
Création par lots¶
Créez plusieurs cibles à la fois à partir d'une seule adresse IP, d'un bloc CIDR ou d'une plage IP. Utile pour remplir l'inventaire cible à partir des listes de portée avant le début de l'analyse.
Champs de demande :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
address | chaîne | Oui | IP unique, CIDR (par exemple, 10.0.0.0/24) ou plage (par exemple, 10.0.0.1-50 ou 10.0.0.1-10.0.0.50) |
hostname | chaîne | Non | Nom d'hôte appliqué à toutes les cibles du lot |
os | chaîne | Non | OS appliqué à toutes les cibles |
note | chaîne | Non | Remarque appliquée à toutes les cibles |
Exemples de formats d'adresse :
| Formater | Exemple | Description |
|---|---|---|
| IP unique | 192.168.1.100 | Crée une cible |
| CIDR | 192.168.1.0/24 | S'étend jusqu'à 254 IP (ignore le réseau et la diffusion pour /24+) |
| Courte portée | 192.168.1.1-50 | S'étend jusqu'à 50 IP (plage du dernier octet) |
| Gamme complète | 192.168.1.1-192.168.1.50 | S'étend jusqu'à 50 IP (début et fin explicites) |
Limites d'expansion
La création de lots est limitée à 1 024 IP par requête. Les blocs CIDR supérieurs à /22 sont rejetés. Utilisez plusieurs requêtes pour des étendues plus grandes.
Importation XML Nmap¶
Importez des cibles et des services directement à partir de la sortie XML de Nmap. L'importateur analyse les éléments <host>, <address>, <hostname>, <os> et <port> du XML et crée des enregistrements de cible et de service en conséquence.
Comportement d'importation :
- Seuls les hôtes avec
state="up"sont importés - La première adresse IPv4 (ou IPv6) trouvée sur chaque hôte est utilisée comme adresse IP cible
- Le premier élément
<hostname>est utilisé comme nom d'hôte - La correspondance du système d'exploitation la plus précise de
<osmatch>est utilisée comme nom du système d'exploitation. - Seuls les ports avec
state="open"sont importés en tant que services - Les bannières de service sont assemblées à partir des attributs
product,versionetextrainfo. - Toutes les cibles importées ont
sourcedéfini surnmap - Les cibles existantes (correspondantes par IP) sont mises à jour ; les notes sont conservées
Commande d'analyse Nmap
Pour de meilleurs résultats, exécutez Nmap avec la détection du système d'exploitation et l'analyse de la version du service :
Limite de taille de fichier
La payload XML maximale acceptée est de 50 Mo. Pour les analyses très volumineuses, divisez les résultats en plusieurs fichiers.
Mise à jour groupée du système d'exploitation¶
Mettez à jour le champ du système d'exploitation sur plusieurs cibles à la fois. Utile après avoir identifié les versions du système d'exploitation via la post-exploitation ou lors de la correction des résultats des empreintes digitales du système d'exploitation Nmap.
Champs de demande :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
target_ids | UUID[] | Oui | Tableau d'UUID cibles à mettre à jour |
os | chaîne | Oui | Nouvelle valeur du système d'exploitation à définir |
Liste des cibles¶
Récupérez toutes les cibles, classées par heure de découverte (la plus récente en premier).
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ip": "10.10.10.21",
"hostname": "WS01.lab.local",
"netbios_name": "WS01",
"os": "Windows 10 Pro",
"arch": "amd64",
"note": "Developer workstation",
"source": "nmap",
"last_seen": "2026-02-21T12:00:00Z",
"discovered_at": "2026-02-21T11:45:00Z",
"created_at": "2026-02-21T11:45:00Z",
"updated_at": "2026-02-21T12:00:00Z"
}
]
Obtenez une cible unique¶
Récupérez une cible spécifique par son UUID.
curl -s https://stentor.app/api/v1/targets/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Authorization: Bearer $TOKEN" | jq
Mise à jour des notes¶
Mettre à jour la note de l'opérateur sur une cible spécifique. Les notes sont des champs de texte libre permettant de marquer des cibles avec un contexte d'engagement.
Suppression de cibles¶
Supprimez une cible par son UUID. Renvoie 204 No Content en cas de succès.
curl -s -X DELETE https://stentor.app/api/v1/targets/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"
Référence API¶
| Méthode | Point de terminaison | Description |
|---|---|---|
GET | /api/v1/targets | Lister toutes les cibles |
GET | /api/v1/targets/:id | Obtenez une seule cible |
POST | /api/v1/targets | Créer ou insérer une cible |
POST | /api/v1/targets/batch | Création par lots à partir d'IP/CIDR/plage |
POST | /api/v1/targets/import/nmap | Importer depuis Nmap XML |
PUT | /api/v1/targets/bulk-os | Champ de mise à jour groupée du système d'exploitation |
PUT | /api/v1/targets/:id/note | Mettre à jour la note sur la cible |
DELETE | /api/v1/targets/:id | Supprimer une cible |
Exemple de flux de travail¶
Un flux de travail typique de gestion des cibles lors d'un engagement :
- Importation de portée : création par lots de cibles à partir de la portée fournie par le client à l'aide de la notation CIDR.
- Nmap scan – Exécutez la découverte du réseau et importez les résultats via le point de terminaison XML Nmap.
- Enrichissement des beacons -- Lors de l'enregistrement des beacons, les enregistrements cibles sont automatiquement mis à jour avec le nom d'hôte, le système d'exploitation et l'architecture de l'implant.
- Notes de l'opérateur – Étiquetez les cibles de grande valeur (contrôleurs de domaine, postes de travail d'administrateur) avec des notes pour la priorisation.
- Correction du système d'exploitation – Utilisez la mise à jour groupée du système d'exploitation après avoir confirmé les versions via la post-exploitation.
sequenceDiagram
participant Op as Operator
participant API as Stentor API
participant DB as PostgreSQL
Op->>API: POST /targets/batch (scope CIDR)
API->>DB: Upsert 254 targets
API-->>Op: {created: 254}
Op->>API: POST /targets/import/nmap (scan XML)
API->>DB: Upsert targets + services
API-->>Op: {targets_created: 12, services_created: 47}
Note over API,DB: Beacon checks in from 10.10.10.21
API->>DB: Upsert target (hostname, OS from beacon)
Op->>API: PUT /targets/:id/note
API->>DB: Update note (preserved on future upserts)
API-->>Op: {status: "updated"}