
Déployez automatiquement un petit domaine Windows intentionnellement non sécurisé et vulnérable pour un honeypot RDP.
Déployer un petit domaine Windows vulnérable et intentionnellement non sécurisé pour un honeypot RDP, entièrement automatiquement.
Fonctionne sur une virtualisation auto-hébergée utilisant libvirt avec QEMU/KVM (mais peut être facilement personnalisé pour des solutions Cloud).
Utilisé pour configurer sans douleur un petit domaine Windows à partir de zéro automatiquement (sans interaction utilisateur) dans le but de tester un honeypot RDP.
Comprend un contrôleur de domaine, un ordinateur de bureau et un serveur Graylog configuré pour journaliser les actions des attaquants.
Packer : télécharger les médias d'installation nécessaires et configurer les images de machines virtuelles de base automatisées sans intervention.
Terraform : provisionner l'infrastructure de virtualisation libvirt (réseau + machines virtuelles) en utilisant les images de machines virtuelles préparées par Packer.
Ansible : configurer l'infrastructure (DC, Poste de travail, Graylog) automatiquement, sans interaction utilisateur.
Après avoir suivi le pipeline Packer+Terraform+Ansible, le domaine Windows configuré devrait être opérationnel, vous pouvez exposer le service RDP du poste de travail sur Internet public, et surveiller les événements via Graylog.
Les fonctionnalités du système en fonctionnement sont :
La virtualisation nécessite de la puissance de votre système hôte :
Testé sur un hôte Ubuntu 18.04 LTS.
Tout d'abord, clonez le dépôt :
git clone https://github.com/tothi/ad-honeypot-autodeploy
cd ad-honeypot-autodeploy
Avant de commencer avec Packer, définissez les mots de passe initiaux (attention aux exigences de complexité) :
./init_passwords.sh
Maintenant, construisez les images initiales.
cd packer
Les médias d'installation de Windows Server 2016 et Ubuntu doivent être téléchargés par le script Packer. VirtIO doit être téléchargé par le script get-virtio.sh fourni :
./get-virtio.sh
Windows 10 doit être téléchargé manuellement en obtenant un lien de téléchargement temporaire et en l'enregistrant dans le dossier ISO. Le lien de téléchargement peut être obtenu ici. Sélectionnez la version anglaise (Internationale), 64 bits et enregistrez l'ISO dans ISO/Win10_21H2_EnglishInternational_x64.iso.
Pour le mappage des emplacements IP sur une carte mondiale dans Graylog, la base de données GeoIP MaxMind est nécessaire. Malheureusement, en raison des termes de licence, elle ne peut pas être redistribuée, vous devez donc la télécharger manuellement (après inscription) depuis le site MaxMind. La version gratuite GeoLite2 devrait fonctionner, obtenez la base de données "GeoLite2 City" au format MMDB (téléchargez le GZIP et décompressez) et placez-la dans resources/GeoLite2-City.mmdb.
Si vous n'avez pas Packer, obtenez la dernière version depuis le site packer.io (téléchargez le binaire pré-compilé) ou essayez d'ajouter le dépôt Hashicorp à votre système de gestion de paquets (utile aussi pour Terraform).
Si vous reconstruisez les images, n'oubliez pas de nettoyer les constructions précédentes :
rm -fr output_*
Si vous souhaitez re-télécharger les images, supprimez packer_cache :
rm -fr packer_cache
Après ces étapes de préparation, lancez les constructions Packer en parallèle :
./packer-build-all.sh

Les images devraient être prêtes dans un délai raisonnable (~20-30 minutes selon la puissance de votre matériel hôte).
Maintenant, l'infrastructure peut être déployée en utilisant Terraform.
Obtenez Terraform (>=0.13) si vous ne l'avez pas (consultez les méthodes d'installation pour Packer, ci-dessus).
Le fournisseur Terraform pour libvirt doit être téléchargé automatiquement depuis le Registre Terraform pendant la phase d'application.
Entrez dans le dossier Terraform :
cd ../terraform
Initialisez le répertoire de travail (nécessaire uniquement pour la première utilisation) :
terraform init
Construisez et lancez l'infrastructure ("appliquez les modifications") :
terraform apply
Notez que si l'utilisateur exécutant terraform apply n'est pas root, les privilèges sudo pour exécuter /usr/sbin/iptables sont nécessaires (sans mot de passe).

Après un court laps de temps (~2-3 minutes), le réseau et les machines virtuelles sont opérationnels. En cas d'échec, terraform destroy peut ne pas suffire, une suppression manuelle des ressources peut être nécessaire.
ATTENTION : Vous devez prendre soin de protéger votre réseau privé. La configuration Terraform (main.tf) fournie ici contient simplement une règle de pare-feu personnalisée pour mon propre environnement de test (blocage du trafic destiné à 192.168.0.0/16 depuis le réseau honeypot 192.168.3.0/24).
Vient ensuite la phase de configuration.
Placez-vous dans le dossier ansible :
cd ../ansible
La méthode d'installation recommandée est d'installer la dernière version d'Ansible avec quelques dépendances supplémentaires requises dans un environnement virtuel Python venv :
python3 -m venv venv
. ./venv/bin/activate
pip3 install -r requirements.txt
Pour une utilisation ultérieure, activez simplement le venv par
. ./venv/bin/activate
Et faites deactivate si vous n'en avez plus besoin dans votre session en cours.
Vous devez placer une clé publique SSH avec le nom de fichier id.pub (utilisez ssh-keygen) dans le dossier ansible pour accéder à la machine Ubuntu Graylog avec l'utilisateur ubuntu (ansible l'ajoutera à ~ubuntu/.ssh/authorized_keys).
Le fichier wordlist.txt contient quelques mots de passe (intentionnellement faibles) pour les utilisateurs du domaine peuplé, qui peuvent être personnalisés.
Exécutez la phase de configuration :
ansible-playbook -i hosts setup-domain.yml -v

Après 20-25 minutes, tout est prêt.
Selon la configuration réseau libvirt (NAT), les hôtes peuvent accéder à Internet public (si votre système hôte le permet).
L'accès aux hôtes est possible via le système hôte. Pratiquement, l'utilisation d'un tunnel SSH socks et de proxychains pour l'accès RDP ou WinRM est très confortable.
Par exemple, si l'IP de votre hôte libvirt est 192.168.0.10,
créez un tunnel socks écoutant sur localhost:5000 avec
ssh 192.168.0.10 -D5000 -NTv
Et accédez au poste de travail Windows 10 (en utilisant un /etc/proxychains.conf approprié configuré pour le tunnel :5000) :
proxychains xfreerdp /v:192.168.3.112 /u:administrator
Ou, accédez à l'interface web Graylog écoutant sur :9000 localement sur le serveur Ubuntu Graylog via SSH ProxyJump et un tunnel direct personnalisé :
ssh -J 192.168.0.10 [email protected] -NTv -L9000:127.0.0.1:9000
Puis ouvrez l'URL http://localhost:9000 et vous atteignez l'interface web Graylog.
Pour activer le honeypot RDP, autorisez simplement l'accès public à 192.168.3.112:3389 (par exemple avec une configuration de redirection de ports sur votre routeur et des règles iptables sur la machine hôte ; mon script d'aide est rdp_public.sh) et continuez à surveiller Graylog. ;)
| hôte | adresse IP | système d'exploitation | rôle |
|---|
| dc1 | 192.168.3.100 | Windows Server 2016 | Contrôleur de domaine |
| desktop12 | 192.168.3.112 | Windows 10 (version 2004) | Poste de travail membre |
| graylog | 192.168.3.191 | Ubuntu 18.04 LTS | Serveur Graylog |
| kali | 192.168.3.192 | Kali Rolling (2022.3) | Opérations offensives |