»webknocking«
der etwas andere weg
15.02.2008
Webknocking ist eine Wortschöpfung, die, wie könnte es anders sein, von portknocking abgeleitet ist.
(Den Download gibt es weiter
unten.)
Hintergrund:
2003 laß ich zum ersten mal etwas über
portknocking(10.05.2006).
Nachdem ich mich etwas eingehender damit auseinandergesetzt hatte waren mir ein paar Dinge aufgefallen, die mich störten:
- Durch sniffen kann die Klopfsequence ausgespäht werden
- Zum Absenden der Sequence wird ein spezieller Client benötigt
- Es muss ein weiterer Dienst auf dem betreffenden Rechner laufen, der eine permanente Systemlast erzeugt
- ... und dem man vertrauen muss.
Ich habe mich zum damaligen Zeitpunkt daher entschlossen, das ganze nicht einzusetzen.
Da mich das Konzept aber nie so richtig losgelassen hat, kam mir ca. ein Jahr später eine Idee, wie sich zunächst die letzten drei Probleme aus der Welt schaffen lassen.
Grundidee:
Der Grundgedanke bei webknocking besteht darin, statt Ports Webseiten zu verwenden.
Dabei wird davon ausgegangen, dass auf dem betreffenden Server ein Webserver (Apache) läuft.
Mit der Webbrowser der Wahl wird eine zuvor definierte Sequenz von Webseiten (Webknockingsequenz)
vom betreffenden Server abgerufen. Der Webserver ist so konfiguriert,
dass jeder Zugriff protokolliert wird (Standardeinstellung bei Apache).
Die letzte Seite jeder Sequenz ist fix. Ihr Aufruf startet eine Analyse des Webserverlogfiles.
Wird die Knockingsequenz gefunden, so wird ein Skript ausgeführt, dass beispielsweise
den Port 22 für den Knocker öffnet.
Problem Sniffen:
Im einleitenden Teil habe ich bereits das Problem des Ausspähens der Sequence durch Sniffen
des Netzverkehrs angesprochen. Davor schützt natürlich auch webknocking nicht.
Diesem Angriff kann man mit einer dynamischen Knockingsequenz entgegenwirken.
Dabei gibt es zwei mögliche Ansätze:
-
Die gesamte Sequenz ist dynamisch und wird in regelmäßigen
Abständen (sinnvollerweise nach jedem Aufruf) komplett geändert
(im Falle von webknocking bestenfalls auch die letzte, auslösende Seite).
-
Die Sequenz besteht aus einem statischen und einem dynamischen Anteil.
Eine völlig dynamische Sequenz biete dabei den optimalen Schutz, da ein Sniffer keinerlei
Schema erkennen kann. Dieser Ansatz hat aber den großen Nachteil, dass der Nutzer immer
genau wissen muss, welche Sequenz gerade aktiv ist.
Eine teilweise statische Sequenz lässt sich leichter einprägen. Allerdings kann die
Sequenz durch den statischen Anteil bei einem Angriff erkannt werden, sodass der Angreifer zumindest
von ihrer Existenz erfährt.
Der dynamische Anteil kann beispielsweise durch ein Frage-Anwort-Spiel realisiert werden.
Dabei sendet der Webserver nach Erkennen der Sequenz eine Frage, auf die er mit dem nächsten
Aufruf die passende Antwort erwartet. Frage und Antwort können algorithmisch
(z. B.: "Was ergibt 6 mal 7?") oder durch einen individuellen Sinnzusammenhang
(z. B.: "Wo wurdest du geboren?") miteinander verbunden sein.
Implementierung:
Aktuell existiert eine Implementierung auf Basis von php, die den zweiten Ansatz umsetzt.
Nach Absenden der Knockingsequenz innerhalb einer festgelegten Zeit wird das Skript webknocking.php aufgerufen.
Das Skript durchsucht das Apache-Logfile nach dem Auftreten der Sequenz innerhalb der entsprechenden Zeitperiode.
Wurde die Sequenz erkannt, wird je nach Configuration entweder sofort ein Shellscript (wk-s_open.sh) zum Öffnen des Ports 22
für den Knocker ausgeführt, oder eine Frage ausgeliefert. Die Frage wird ggf. durch den Aufruf
"webknocking.php?value=<antwort>" an den Server übermittelt. Auch die Zeit vom Ausliefern der Frage bis zum Erwarten
der Antwort durch den Server kann festgelegt werden.
Falls gewünscht führt das webknocking-Skript beim erneuten Aufruf ein anderes Shellskript (wk-s_close.sh),
z. B.: zum Schließen des Ports 22, aus.
Alle Einstellungen werden durch Editieren der Datei wk-config.php vorgenommen.
Installation:
Webknocking ist schnell installiert. Nach dem Entpacken des Archievs werden alle Dateien in ein gemeinsames Verzeichniss in einem
Webpfad copiert, das Skript install.sh ausgeführt und die Configuration vorgenommen. Alle in wk-config.php zu setzenden
Parameter sind durch Kommentare entsprechend erläutert. Ggf. sind noch die beiden Shellskripte (wk-s_close.sh und wk-s_open.sh)
anzupassen.
Pläne
Da ich gerade an meiner
Diplomarbeit schreibe bleibt momentan wenig
Zeit für die Weiterentwicklung. Ab und zu rappelt es mich aber ;) ...
Folgendes ist geplant:
- vollständig dynamische Webknockingsequenz (damit Verzicht auf das Frage-Antwort-Spiel)
- Unterstützung von Proxies und Anonymisierungsdiensten
- diverse Kleinigkeiten (Code aufräumen, 404 senden bei nicht erkannter Knockingsequenz, ...)
- ganz ganz eventuell ein Webinterface für die Konfiguration (ich bezweifle, dass ich dazu Lust habe :-))
Für Anregungen und Vorschläge bin ich dankbar!
[update] Ich habe die Entwicklung an dieser Implementierung mangels Zeit und Interesse abgebrochen.