Aller au contenu

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 Windows
  • microsoft.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 :

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 :

  1. Clone chaque modèle dans une VM complète avec un VMID, une IP, un CPU et une RAM attribués.
  2. Configure les interfaces réseau sur le pont vmbr0 avec des adresses IP statiques.
  3. Génère ansible/inventory/hosts.yml à partir des sorties Terraform pour un transfert transparent vers l'étape 3.

Commandes clavier :

# Provision all VMs
make provision

# View current Terraform state
make status

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.

# Run all Ansible playbooks
make configure

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

# Run C2 integration
make integrate

Ce qu'il fait :

  1. Enregistre le relais dans la base de données Stentor (s'il n'est pas déjà présent).
  2. Crée et démarre un listener HTTPS sur le relais.
  3. Déploie l'implant sur WS01 (ou un VMID personnalisé).
  4. 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 :

PROXMOX_URL=https://<proxmox-ip>:8006/api2/json
PROXMOX_NODE=proxmox
PROXMOX_USERNAME=root@pam
PROXMOX_PASSWORD=your-password
PROXMOX_URL=https://<proxmox-ip>:8006/api2/json
PROXMOX_NODE=proxmox
PROXMOX_API_TOKEN=root@pam!stentor-lab
PROXMOX_API_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

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

NETWORK_BRIDGE=vmbr0
NETWORK_GATEWAY=10.10.10.1
NETWORK_SUBNET=24
STORAGE_POOL=local-lvm

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

  1. Déployer le serveur : exécutez ./update-stentor.sh pour déployer Stentor sur la VM 103 via Docker.

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

  3. 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;"
    

  4. Redémarrer le service de relais :

    ssh root@<proxmox-ip> 'sshpass -p "<relay-password>" ssh [email protected] \
      "systemctl restart stentor-relay"'
    

  5. 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"
    

  6. 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"'
    

  7. Vérifier le beacon :

    curl -s https://stentor.app/api/v1/c2/beacons \
      -H "Authorization: Bearer $TOKEN" | jq
    

Problèmes courants

Pièges de la configuration manuelle

  • Confirmation du déploiement : update-stentor.sh nécessite la saisie de "yes" (et non de "y", et non de yes |).
  • Champ de réponse de connexion : le jeton se trouve dans access_token, et non dans token.
  • 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.