Eine komplette Online-Schulungsumgebung einrichten
Schulung zur Netzwerksicherheit mit Kali-Linux-Containern im Browser
Man stelle sich vor, man soll eine Schulung halten, bei der es um Netzwerke und Schwachstellen-Demonstrationen geht. Man benötigt Befehle wie ip
, host
, dig
, nmap
, tcpdump
vielleicht auch ein nessus
etc.
Doch leider findet man am Veranstaltungsort nur Windows-PCs vor. Ich hätte natürlich 15 Laptops mitbringen können, und zusätzlich die Server, die den Demo-Traffic generieren sollen und die absichtlich schlecht konfigurierten Services. Schließlich wollen die Teilnehmer ja auch Erfolgserlebnisse beim Scannen nach Schwachstellen haben.
Da ich das Aufsetzen der PCs per USB-Stick einkalkuliert hatte, dann aber mitgeteilt bekam, dass ich die Rechner nicht verändern dürfte, musste ich schnell Abhilfe schaffen. Folgendes habe ich auf die Schnelle gebaut...
Die Idee
Ich stelle die Schulungsumgebung einfach im Browser zur Verfügung. Dann müssen die Teilnehmer nur die URL aufrufen und F11
drücken, damit der Inhalt den gesamten Bildschirm ausfüllt. Und wenn jemand seinen virtuellen Rechner kaputt konfiguriert, kann ich diesen einfach per docker restart kaliXX
wieder in den alten Zustand versetzen.
Die Vorbereitung
Also schnell 15 Kali-Linux Container gebaut:
for i in $(seq 1 15); do
cat <<EOF >> docker-compose.yml
kali$i:
image: lscr.io/linuxserver/kali-linux
container_name: kali$i
stdin_open: true
volumes:
# Keine persistenten Volumes, damit ich die Container leichter resetten kann
# - ./data/kali$i:/data # Falls doch: Separate Volumes für jeden Teilnehmer
restart: unless-stopped
security_opt:
- no-new-privileges:true
environment:
- DEBIAN_FRONTEND=noninteractive
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
networks:
- web
- training
EOF
done
Ein simples docker-compose up -d
startet alle neuen Kali-Linux Instanzen. Diese hängen im Netz web
hinter dem Reverse-Proxy und zusätzlich im Netz training
, um an die schlecht konfigurierten Servercontainer zu kommen.
Für die schlecht konfigurierten Server habe ich die folgenden Containerimages im Netz training
verwendet:
- OWASP Juice Shop
- Beschreibung: Unsichere Webanwendung zum Demonstrieren von Sicherheitsanfälligkeiten.
- Image:
bkimminich/juice-shop
- Metasploitable
- Beschreibung: Absichtlich unsichere Linux-Distribution für Testzwecke.
- Image:
t0mmy0/Metasploitable
- DVWA (Damn Vulnerable Web Application)
- Beschreibung: PHP/MySQL-Webanwendung, die viele Sicherheitsanfälligkeiten enthält.
- Image:
owasp/dvwa
- bWAPP (Buggy Web Application)
- Beschreibung: PHP-Webanwendung mit zahlreichen Sicherheitsanfälligkeiten.
- Image:
mariobehling/bwapp
- WebGoat
- Beschreibung: OWASP-Projekt zur Schulung in Web-Sicherheit.
- Image:
owasp/webgo
Die Umgebung ins Internet stellen
Da die Umgebung ja bereits läuft, muss ich sie lediglich noch auf dem nginx-proxy-manager
eintragen. Dafür ist mir auf die Schnelle kein Automatismus eingefallen, und ich habe jeden Container einzeln online gestellt.
Wichtig: Auf keinen Fall vergessen Websocket-Support zu enablen, da KASM sonst nicht funktioniert:
Auf meinem Nameserver ist ein CNAME Eintrag für *.trainings.meine-domain.de
vorhanden, und so kann ich auf dem NPM einfach die Hosts anlegen:
student1.trainings.meine-domain.de
➡️kali1
student2.trainings.meine-domain.de
➡️kali2
...
student15.trainings.meine-domain.de
➡️kali15
Ein Trainingsplatz sah dann für einen Teilnehmer so aus:
Jetzt noch der Klick auf Vollbild, und man hat das Gefühl, man arbeitet an einem lokalen Rechner:
Fazit
Mit etwas Erfahrung im Bereich der Virtualisierung lassen sich recht schnell beeindruckende Ergebnisse erzielen. Um diese Schulungsumgebung aufzubauen habe ich etwas mehr als eine Stunde benötigt. Dabei habe ich die meiste Zeit dadurch verbraucht, dass ich unter Windows so viel herum klicken musste und darauf warten musste, bis der nächste Bildschirm aufgebaut war, um meine Eingaben machen zu dürfen. Naja. Ich bin eben ein Konsolentyp und bewege die Maus nur ungern 😀.