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 :
namedoit être alphanumérique avec des tirets/traits de soulignement (regex :^[a-zA-Z0-9][a-zA-Z0-9_-]*$)versiondoit être au format semver (par exemple,1.2.0,1.0.0-beta.1)typedoit ê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é.
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).
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.
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"
}
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 :
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 :
- Générer une paire de clés Ed25519
- Signez l'extension
tar.gzavec la clé privée - Distribuez le fichier
.sigavec le package - 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