Aller au contenu

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.

curl -s -X POST https://stentor.app/api/v1/targets/batch \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "address": "10.10.10.50",
    "os": "Windows Server 2022",
    "note": "File server"
  }' | jq
curl -s -X POST https://stentor.app/api/v1/targets/batch \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "address": "10.10.10.0/24",
    "note": "Lab subnet"
  }' | jq
curl -s -X POST https://stentor.app/api/v1/targets/batch \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "address": "10.10.10.1-50",
    "hostname": "",
    "os": "",
    "note": "Scope range"
  }' | jq
{
  "created": 50,
  "total": 50
}

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.

curl -s -X POST https://stentor.app/api/v1/targets/import/nmap \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/xml" \
  --data-binary @scan-results.xml | jq
{
  "targets_created": 12,
  "targets_updated": 3,
  "services_created": 47,
  "errors": 0
}

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, version et extrainfo.
  • Toutes les cibles importées ont source défini sur nmap
  • 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 :

nmap -sV -O -oX scan-results.xml 10.10.10.0/24

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.

curl -s -X PUT https://stentor.app/api/v1/targets/bulk-os \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "target_ids": [
      "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "b2c3d4e5-f6a7-8901-bcde-f12345678901"
    ],
    "os": "Windows Server 2022"
  }' | jq
{
  "updated": 2
}

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).

curl -s https://stentor.app/api/v1/targets \
  -H "Authorization: Bearer $TOKEN" | 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": "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.

curl -s -X PUT https://stentor.app/api/v1/targets/a1b2c3d4-e5f6-7890-abcd-ef1234567890/note \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "Domain admin logged in here - high value target"
  }' | jq
{
  "status": "updated"
}

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 :

  1. 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.
  2. Nmap scan – Exécutez la découverte du réseau et importez les résultats via le point de terminaison XML Nmap.
  3. 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.
  4. 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.
  5. 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"}