
Vollautomatische Bereitstellung einer kleinen, absichtlich unsicheren, angreifbaren Windows-Domäne für einen RDP-Honeypot.
Stelle eine kleine, absichtlich unsichere, verwundbare Windows-Domäne für RDP-Honeypot vollautomatisch bereit.
Läuft auf selbstgehosteter Virtualisierung mit libvirt mit QEMU/KVM (kann aber leicht für Cloud-basierte Lösungen angepasst werden).
Wird verwendet, um mühelos eine kleine Windows-Domäne von Grund auf automatisch (ohne Benutzereingriff) für RDP-Honeypot-Tests einzurichten.
Enthält einen Domänencontroller, einen Desktop-Computer und einen konfigurierten Graylog-Server zur Protokollierung der Aktionen der Bösewichte.
Packer: Lade die erforderlichen Installationsmedien herunter und richte die automatisierten Basis-VM-Images unbeaufsichtigt ein.
Terraform: Stelle die libvirt-Virtualisierungsinfrastruktur (Netzwerk + virtuelle Maschinen) mit den von Packer vorbereiteten VM-Images bereit.
Ansible: Konfiguriere die Infrastruktur (DC, Desktop, Graylog) automatisch, ohne Benutzereingriff.
Nach Durchlaufen der Packer+Terraform+Ansible-Pipeline, sollte die konfigurierte Windows-Domäne betriebsbereit sein. Du kannst den RDP-Dienst des Desktops mit dem öffentlichen Internet verbinden und die Ereignisse über Graylog überwachen.
Funktionen des laufenden Systems sind:
Virtualisierung benötigt etwas Leistung von Ihrem Hostsystem:
Getestet auf Ubuntu 18.04 LTS-Host.
Zuerst das Repository klonen:
git clone https://github.com/tothi/ad-honeypot-autodeploy
cd ad-honeypot-autodeploy
Vor dem Start mit Packer die anfänglichen Passwörter einrichten (auf Komplexitätsanforderungen achten):
./init_passwords.sh
Jetzt die anfänglichen Images erstellen.
cd packer
Windows Server 2016 und Ubuntu-Installationsmedien sollten vom Packer-Skript heruntergeladen werden. VirtIO muss mit dem beigefügten get-virtio.sh-Skript heruntergeladen werden:
./get-virtio.sh
Windows 10 sollte manuell heruntergeladen werden, indem ein temporärer Download-Link abgerufen und im ISO-Ordner gespeichert wird. Der Download-Link kann von hier bezogen werden. Wählen Sie die englische (internationale) 64-Bit-Version und speichern Sie die ISO unter ISO/Win10_21H2_EnglishInternational_x64.iso.
Für die Zuordnung von IP-Standorten auf einer Weltkarte in Graylog wird die MaxMind-GeoIP-Datenbank benötigt. Leider kann sie aufgrund von Lizenzbestimmungen nicht weitergegeben werden, daher muss sie manuell (nach Registrierung) von der MaxMind-Seite heruntergeladen werden. Die kostenlose GeoLite2-Version sollte funktionieren. Laden Sie die „GeoLite2 City“-Datenbank im MMDB-Format herunter (GZIP herunterladen und entpacken) und legen Sie sie unter resources/GeoLite2-City.mmdb ab.
Wenn Sie Packer nicht haben, holen Sie die neueste Version von der packer.io-Website (herunterladen der vorkompilierten Binärdatei) oder versuchen Sie, das Hashicorp-Repository zu Ihrem Paketsystem hinzuzufügen (auch für Terraform nützlich).
Wenn Sie die Images neu erstellen, vergessen Sie nicht, vorherige Builds zu bereinigen:
rm -fr output_*
Wenn Sie die Images erneut herunterladen möchten, entfernen Sie packer_cache:
rm -fr packer_cache
Nach diesen vorbereitenden Schritten führen Sie die Packer-Builds parallel aus:
./packer-build-all.sh

Die Images sollten in angemessener Zeit (~20-30 Minuten, abhängig von der Leistung Ihres Host-Hardware) bereit sein.
Jetzt kann die Infrastruktur mit Terraform bereitgestellt werden.
Holen Sie sich Terraform (>=0.13), falls Sie es nicht haben (siehe Installationsmethoden bei Packer oben).
Terraform-Provider für libvirt sollte während der Apply-Phase automatisch aus der Terraform Registry heruntergeladen werden.
Terraform-Ordner betreten:
cd ../terraform
Arbeitsverzeichnis initialisieren (nur bei erster Verwendung erforderlich):
terraform init
Infrastruktur erstellen und starten („apply the changes“):
terraform apply
Beachten Sie, dass der Benutzer, der terraform apply ausführt, wenn er nicht root ist, sudo-Berechtigungen zum Ausführen von /usr/sbin/iptables benötigt (ohne Passwort).

Nach kurzer Zeit (~2-3 Minuten) sind das Netzwerk und die virtuellen Maschinen betriebsbereit. Bei Fehlern reicht terraform destroy möglicherweise nicht aus, ein manuelles Aufheben der Ressourcendefinitionen kann erforderlich sein.
WARNUNG: Sie sollten darauf achten, Ihr privates Netzwerk zu schützen. Die hier bereitgestellte Terraform-Konfiguration (main.tf) enthält nur eine benutzerdefinierte Firewall-Regel für meine eigene Testumgebung (Blockierung des Zielverkehrs von 192.168.0.0/16 aus dem Honeypot-Netz 192.168.3.0/24).
Als nächstes folgt die Konfigurationsphase.
In den Ansible-Ordner wechseln:
cd ../ansible
Die empfohlene Installationsmethode ist die Installation der neuesten Ansible-Version mit einigen erforderlichen zusätzlichen Abhängigkeiten in einer Python-Venv-virtualisierten Umgebung:
python3 -m venv venv
. ./venv/bin/activate
pip3 install -r requirements.txt
Für die spätere Verwendung aktivieren Sie einfach die venv mit
. ./venv/bin/activate
Und einfach deactivate, wenn es in Ihrer aktuellen Sitzung nicht mehr benötigt wird.
Sie sollten einen SSH-öffentlichen Schlüssel mit dem Dateinamen id.pub (mit ssh-keygen erstellen) in den Ansible-Ordner legen, um auf die Ubuntu-Graylog-Maschine mit dem Benutzer ubuntu zuzugreifen (Ansible wird ihn zu ~ubuntu/.ssh/authorized_keys hinzufügen).
Die Datei wordlist.txt enthält einige (absichtlich schwache) Passwörter für die befüllten Domänenbenutzer, die angepasst werden können.
Konfigurationsphase ausführen:
ansible-playbook -i hosts setup-domain.yml -v

Nach 20-25 Minuten ist alles bereit.
Gemäß der libvirt-Netzwerkkonfiguration (NAT) können die Hosts auf das öffentliche Internet zugreifen (wenn Ihr Hostsystem dies zulässt).
Der Zugriff auf die Hosts ist über das Hostsystem möglich. Praktisch ist die Verwendung eines SSH-Socks-Tunnels und von Proxychains für den RDP- oder WinRM-Zugriff sehr komfortabel.
Wenn Ihre libvirt-Host-IP z.B. 192.168.0.10 ist, erstellen Sie einen Socks-Tunnel, der auf localhost:5000 lauscht, mit
ssh 192.168.0.10 -D5000 -NTv
Und greifen Sie auf den Windows 10 Desktop zu (mit einer entsprechenden /etc/proxychains.conf, die für den :5000-Tunnel konfiguriert ist):
proxychains xfreerdp /v:192.168.3.112 /u:administrator
Oder greifen Sie auf die Graylog-Weboberfläche zu, die lokal auf :9000 auf dem Graylog-Ubuntu-Server lauscht, mit SSH ProxyJump und einem benutzerdefinierten Weiterleitungstunnel:
ssh -J 192.168.0.10 [email protected] -NTv -L9000:127.0.0.1:9000
Öffnen Sie dann die URL http://localhost:9000 und Sie erreichen die Graylog-Weboberfläche.
Zum Aktivieren des RDP-Honeypots erlauben Sie einfach öffentlichen Zugriff auf 192.168.3.112:3389 (z.B. mit einer Portweiterleitungskonfiguration auf Ihrem Router und iptables-Regeln auf der Hostmaschine; mein Hilfsskript ist rdp_public.sh) und beobachten Sie Graylog weiter. ;)
| hostname | ip address | operating system | role |
|---|
| dc1 | 192.168.3.100 | Windows Server 2016 | Domänencontroller |
| desktop12 | 192.168.3.112 | Windows 10 (Version 2004) | Arbeitsstation (Domänenmitglied) |
| graylog | 192.168.3.191 | Ubuntu 18.04 LTS | Graylog-Server |
| kali | 192.168.3.192 | Kali Rolling (2022.3) | Offensive Operationen |