Eine komplette Online-Schulungsumgebung einrichten

Schulung zur Netzwerksicherheit mit Kali-Linux-Containern im Browser

Eine komplette Online-Schulungsumgebung einrichten

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