Aller au contenu

Rallonges

Les extensions sont des outils tiers (BOF, assemblys .NET, DLL, scripts et alias) qui se connectent à Stentor et s'enregistrent en tant que commandes shell natives dans la console beacon. Le système d'extension fournit un catalogue de style Armory pour parcourir, installer, mettre à jour et gérer les extensions, ainsi qu'une vérification de signature Ed25519 pour l'intégrité de la chaîne d'approvisionnement.


Aperçu

Les extensions permettent aux opérateurs d'étendre les capacités post-exploitation de Stentor sans modifier la base de code principale. Chaque extension est livrée avec un manifeste qui déclare ses métadonnées, les plates-formes prises en charge, son point d'entrée et les commandes shell qu'elle fournit. Une fois installées et activées, les commandes de l'extension deviennent disponibles dans la console beacon aux côtés des commandes intégrées.

Capacités clés :

  • Parcourir le catalogue – Découvrez les extensions à partir d'un référentiel distant avec un seul appel API
  • Installation en un clic - Installez les extensions par nom ; le serveur les télécharge, les vérifie et les stocke automatiquement
  • Vérification de signature -- Les signatures Ed25519 sur les packages d'extension empêchent toute falsification
  • Activer/Désactiver la bascule -- Désactiver temporairement une extension sans la désinstaller
  • Mises à jour automatiques - Recherchez et appliquez les nouvelles versions du catalogue
  • Téléchargement manuel – Installez des extensions à partir de fichiers locaux pour les environnements isolés.
  • Résolution des commandes – Les extensions activées sont automatiquement résolues lorsque les opérateurs saisissent leurs commandes dans le shell du beacon.
flowchart LR
    A[Extension Catalog] -->|download + verify| B[Stentor Server]
    C[Manual Upload] -->|multipart POST| B
    B -->|store| D[(PostgreSQL)]
    D -->|resolve command| E[Beacon Shell]
    E -->|execute| F[Beacon]

Types d'extensions

Les extensions sont classées selon leur type d'exécution :

Type Description Point d'entrée
bof Fichier objet Beacon (code C indépendant de la position) Nom de la fonction C (par exemple, go)
assembly Assemblage .NET (exécuter-assembly) Méthode de classe entièrement qualifiée
dll DLL native (chargement réflexif) Nom de la fonction exportée
script Extension de script CNA Nom de la fonction CNA
alias Alias de commande (mappé sur les commandes existantes) Cible d'alias

Manifeste d'extension

Chaque package d'extension comprend un manifest.json qui décrit l'extension. Le manifeste est validé lors de l'installation avec les règles suivantes :

  • name doit être alphanumérique avec des tirets/traits de soulignement (regex : ^[a-zA-Z0-9][a-zA-Z0-9_-]*$)
  • version doit être au format semver (par exemple, 1.2.0, 1.0.0-beta.1)
  • type doit être l'un des suivants : bof, assembly, dll, script, alias
  • Au moins une commande doit être déclarée
Champ Type Obligatoire Description
name chaîne Oui Identifiant d'extension unique (par exemple, "nanodump")
version chaîne Oui Version sémantique (par exemple, "1.2.0")
author chaîne Oui Nom ou pseudo de l'auteur
description chaîne Oui Description lisible par l'homme
type chaîne Oui Type d'extension : bof, assembly, dll, script, alias
platforms chaîne[] Oui Plateformes prises en charge (par exemple, ["windows/x64", "windows/x86"])
entry_point chaîne Oui Point d'entrée d'exécution (nom de la fonction, class.method, etc.)
commands Commande d'extension[] Oui Commandes Shell fournies par cette extension
dependencies chaîne[] Non Autres noms d'extension requis
min_version chaîne Non Version minimale de Stentor requise
license chaîne Non Identifiant de licence SPDX
repository chaîne Non URL du code source
tags chaîne[] Non Beacons de catégorie pour la recherche

Chaque commande du tableau commands :

Champ Type Obligatoire Description
name chaîne Oui Nom de la commande Shell (par exemple, "nanodump")
description chaîne Oui Texte d'aide
usage chaîne Oui Syntaxe d'utilisation (par exemple, "nanodump [pid] [--fork]")
help_text chaîne Non Aide étendue

Exemple de manifeste :

{
  "name": "nanodump",
  "version": "1.3.0",
  "author": "helpsystems",
  "description": "MiniDumpWriteDump via syscalls for LSASS credential extraction",
  "type": "bof",
  "platforms": ["windows/x64"],
  "entry_point": "go",
  "commands": [
    {
      "name": "nanodump",
      "description": "Dump LSASS credentials using NtReadVirtualMemory syscalls",
      "usage": "nanodump [--pid <pid>] [--fork] [--dup] [--write C:\\path]"
    }
  ],
  "min_version": "3.0.0",
  "license": "MIT",
  "tags": ["credentials", "lsass", "bof"]
}

Référence API

Tous les points de terminaison d'extension nécessitent une authentification JWT.

Chemin de base : /api/v1/extensions

Liste des extensions installées

GET /api/v1/extensions

Renvoie toutes les extensions installées, classées par nom. Les champs data et signature sont exclus pour des raisons d'efficacité ; la réponse inclut à la place un champ size calculé.

curl -s https://stentor.app/api/v1/extensions \
  -H "Authorization: Bearer $TOKEN"

Réponse (200 OK) :

[
  {
    "id": "d4e5f6a7-b8c9-0123-4567-890abcdef012",
    "name": "nanodump",
    "version": "1.3.0",
    "author": "helpsystems",
    "description": "MiniDumpWriteDump via syscalls for LSASS credential extraction",
    "type": "bof",
    "platforms": ["windows/x64"],
    "entry_point": "go",
    "manifest": { ... },
    "enabled": true,
    "size": 45056,
    "installed_at": "2026-02-20T14:30:00Z"
  }
]

Obtenir une extension

GET /api/v1/extensions/:id

Renvoie une seule extension par ID (inclut le manifeste complet).

curl -s https://stentor.app/api/v1/extensions/$EXTENSION_ID \
  -H "Authorization: Bearer $TOKEN"

Parcourir le catalogue

GET /api/v1/extensions/catalog

Récupère la liste des extensions disponibles à partir du référentiel distant configuré. Les résultats sont mis en cache côté serveur pendant 5 minutes.

curl -s https://stentor.app/api/v1/extensions/catalog \
  -H "Authorization: Bearer $TOKEN"

Réponse (200 OK) :

[
  {
    "name": "nanodump",
    "version": "1.3.0",
    "author": "helpsystems",
    "description": "MiniDumpWriteDump via syscalls for LSASS credential extraction",
    "type": "bof",
    "platforms": ["windows/x64"],
    "entry_point": "go",
    "commands": [
      {
        "name": "nanodump",
        "description": "Dump LSASS credentials using NtReadVirtualMemory syscalls",
        "usage": "nanodump [--pid <pid>] [--fork] [--dup] [--write C:\\path]"
      }
    ]
  }
]

Configuration du catalogue

L'URL du catalogue est configurée via la variable d'environnement du serveur EXTENSION_REPO_URL. S’il n’est pas défini, le point de terminaison du catalogue renvoie un tableau vide.


Installer l'extension

POST /api/v1/extensions/install

Télécharge et installe une extension à partir du référentiel distant. Le serveur récupère le package (tar.gz), télécharge et vérifie la signature Ed25519, extrait le manifeste intégré et stocke le tout dans la base de données.

Corps de la demande :

Champ Type Obligatoire Description
name chaîne Oui Nom de l'extension (doit correspondre à une entrée de catalogue)
version chaîne Non Version spécifique à installer. Omettez ou "latest" pour la version la plus récente.
curl -s -X POST https://stentor.app/api/v1/extensions/install \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "nanodump"}'

Réponse (201 créées) :

{
  "id": "d4e5f6a7-b8c9-0123-4567-890abcdef012",
  "name": "nanodump",
  "version": "1.3.0",
  "author": "helpsystems",
  "description": "MiniDumpWriteDump via syscalls for LSASS credential extraction",
  "type": "bof",
  "platforms": ["windows/x64"],
  "entry_point": "go",
  "manifest": { ... },
  "enabled": true,
  "size": 45056,
  "installed_at": "2026-02-21T10:00:00Z"
}
curl -s -X POST https://stentor.app/api/v1/extensions/install \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "nanodump", "version": "1.2.0"}'

Réponses aux erreurs :

Statut Corps Parce que
400 {"error": "..."} Demande invalide ou échec de la vérification de la signature
404 {"error": "extension \"xyz\" not found in catalog"} Nom pas dans le catalogue
409 {"error": "extension \"nanodump\" already installed"} Nom en double

Télécharger l'extension (manuel)

POST /api/v1/extensions/upload

Installez une extension à partir de fichiers locaux à l'aide du téléchargement de formulaire en plusieurs parties. Il s’agit du chemin d’installation hors ligne pour les environnements isolés.

Champs du formulaire en plusieurs parties :

Champ Type Obligatoire Description
manifest fichier Oui Le fichier manifest.json
data fichier Oui Le binaire d'extension (BOF .o, assembly .NET, DLL ou script)
signature fichier Non Fichier de signature Ed25519 (.sig). S'il est fourni, il est vérifié par rapport aux données.
curl -s -X POST https://stentor.app/api/v1/extensions/upload \
  -H "Authorization: Bearer $TOKEN" \
  -F "[email protected]" \
  -F "[email protected]" \
  -F "[email protected]"

Réponse (201 créées) : Identique à la réponse d'installation.

Vérification de la signature lors du téléchargement

Si un fichier de signature est fourni, le serveur le vérifie par rapport aux octets de données à l'aide de la clé publique Ed25519 configurée. Si aucune clé publique n'est configurée (mode développement), la vérification est ignorée avec un journal d'avertissement.


Supprimer l'extension

DELETE /api/v1/extensions/:id

Désinstalle une extension. Ses commandes shell ne seront plus disponibles dans la console beacon.

curl -s -X DELETE https://stentor.app/api/v1/extensions/$EXTENSION_ID \
  -H "Authorization: Bearer $TOKEN"

Réponse : 204 No Content


Basculer l'extension

POST /api/v1/extensions/:id/toggle

Activez ou désactivez une extension sans la supprimer. Les extensions désactivées restent installées mais leurs commandes ne sont pas résolues dans le shell du beacon.

Corps de la demande :

Champ Type Obligatoire Description
enabled booléen Oui true pour activer, false pour désactiver
curl -s -X POST https://stentor.app/api/v1/extensions/$EXTENSION_ID/toggle \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}'

Réponse (200 OK) : Renvoie l'objet d'extension mis à jour.


Mettre à jour l'extension

POST /api/v1/extensions/:id/update

Met à jour une extension installée vers la dernière version à partir du catalogue distant. Le serveur compare la version installée au catalogue, télécharge le nouveau package si une version plus récente existe, vérifie la signature et remplace les données stockées.

curl -s -X POST https://stentor.app/api/v1/extensions/$EXTENSION_ID/update \
  -H "Authorization: Bearer $TOKEN"

Réponse (200 OK) :

Si une mise à jour a été appliquée, renvoie l'objet d'extension mis à jour. Si déjà à jour :

{
  "message": "already up to date",
  "extension": { ... }
}

Vérification des signatures

Les packages d'extension sont signés avec Ed25519 pour garantir l'intégrité et l'authenticité. Le flux de vérification fonctionne comme suit :

sequenceDiagram
    participant Operator
    participant Server
    participant Repository
    Operator->>Server: POST /extensions/install
    Server->>Repository: GET /packages/{name}/{version}.tar.gz
    Repository-->>Server: Package data
    Server->>Repository: GET /packages/{name}/{version}.sig
    Repository-->>Server: Ed25519 signature (64 bytes)
    Server->>Server: Verify signature against data
    alt Signature valid
        Server->>Server: Extract manifest.json from tar.gz
        Server->>Server: Store extension in database
        Server-->>Operator: 201 Created
    else Signature invalid
        Server-->>Operator: 400 Bad Request
    end

Configuration :

La clé publique Ed25519 est configurée via la variable d'environnement du serveur EXTENSION_PUBLIC_KEY (codée en hexadécimal). S'il n'est pas défini, le serveur s'exécute en mode développement et ignore la vérification de la signature avec un journal d'avertissement.

Déploiement de production

Configurez toujours EXTENSION_PUBLIC_KEY en production pour empêcher l’installation de packages d’extension falsifiés. Sans celui-ci, tout colis sera accepté quelle que soit sa signature.

Extensions de signature (pour les auteurs de packages) :

Les fonctions GenerateKeyPair() et SignExtension() du service d'extension peuvent être utilisées pour créer des paires de clés et signer des packages :

  1. Générer une paire de clés Ed25519
  2. Signez l'extension tar.gz avec la clé privée
  3. Distribuez le fichier .sig avec le package
  4. Configurer la clé publique sur tous les serveurs Stentor

Objet de réponse d’extension

Toutes les réponses de l'API (à l'exception de la suppression) renvoient le format ExtensionResponse, qui exclut les données binaires brutes et les octets de signature pour des raisons d'efficacité.

Champ Type Description
id chaîne (UUID) ID de poste
name chaîne Nom du poste
version chaîne Version installée
author chaîne Auteur
description chaîne Description
type chaîne Type d'extension (bof, assembly, dll, script, alias)
platforms chaîne[] Plateformes prises en charge
entry_point chaîne Point d'entrée d'exécution
manifest objet JSON manifeste complet
enabled booléen Si l'extension est active
size entier Taille des données d'extension en octets
installed_at chaîne (ISO 8601) Horodatage d'installation

Format du package de référentiel

Les packages d'extension dans le référentiel de catalogue suivent cette structure :

/catalog.json                          # Array of ExtensionManifest objects
/packages/{name}/{version}.tar.gz      # Gzipped tar archive containing:
                                       #   manifest.json
                                       #   <extension binary>
/packages/{name}/{version}.sig         # Ed25519 signature of the .tar.gz

Le manifest.json peut apparaître à n'importe quelle profondeur dans l'archive tar.gz : l'extracteur recherche tout fichier se terminant par manifest.json.


Intégration de l'interface utilisateur

La page Extensions (/extensions) comprend trois sections :

  • Extensions installées : vue Tableau avec des colonnes pour le nom, la version, le type, l'auteur, les plates-formes, les commandes, la taille et la bascule activée. Chaque ligne comporte des boutons de mise à jour et de suppression.
  • Catalogue d'extension - Panneau pliable qui récupère le catalogue distant à la demande. Affiche les extensions disponibles avec des boutons d'installation. Les extensions déjà installées affichent un badge « Installé ».
  • Téléchargement manuel : formulaire pliable permettant de télécharger des fichiers de manifeste local, de données et de signatures facultatives.

Références croisées

  • Référence de l'API REST -- Les points de terminaison des extensions sont répertoriés dans la section Extensions.
  • Commandes Beacon -- Les extensions s'enregistrent en tant que commandes shell de beacon supplémentaires
  • Scripting -- Les extensions de script CNA utilisent le type script