ADMIN
2024
09
2024-08-29T12:00:00
Collaboration
PRAXIS
058
Security-Tipp
Sicherheit
Denial-of-Service
Denial-of-Service mit Slowloris
Ausbremsen
von Dr. Matthias Wübbeling
Veröffentlicht in Ausgabe 09/2024 - PRAXIS
Denial-of-Service-Angriffe sind auch heute noch ein beliebtes Mittel von Kriminellen, um die Verfügbarkeit ausgewählter Webdienste einzuschränken. Als Betreiber möchten Sie solche Attacken natürlich abwehren und sollten daher genau wissen, wie Ihre Gegner vorgehen können. In diesem Monat stellen wir Ihnen mit Slowloris ein Tool zur Sicherung Ihrer Webserver gegen DoS-Angriffe vor.
Das HyperText Transfer Protocol (HTTP) bildest das Fundament für die Kommunikation zwischen Webbrowsern und Webservern. Slowloris [1] folgt zunächst dem üblichen Ablauf einer HTTP-Verbindung. Allerdings stört der Angreifer die Bearbeitung der Anfrage, indem er die HTTP-Anfrage unvollständig und langsam sendet:
1. Verbindungsaufbau: Slowloris baut als Client eine TCP-Verbindung zum Zielserver auf.
2. (Unvollständige) HTTP-Anfrage: Statt direkt eine vollständige HTTP-Anfrage an den Server zu senden, beginnt Slowloris mit einer Anfrage und fügt kontinuierlich, aber sehr langsam, zusätzliche Header-Zeilen hinzu, ohne dabei die Anfrage jemals abzuschließen.
Das HyperText Transfer Protocol (HTTP) bildest das Fundament für die Kommunikation zwischen Webbrowsern und Webservern. Slowloris [1] folgt zunächst dem üblichen Ablauf einer HTTP-Verbindung. Allerdings stört der Angreifer die Bearbeitung der Anfrage, indem er die HTTP-Anfrage unvollständig und langsam sendet:
1. Verbindungsaufbau: Slowloris baut als Client eine TCP-Verbindung zum Zielserver auf.
2. (Unvollständige) HTTP-Anfrage: Statt direkt eine vollständige HTTP-Anfrage an den Server zu senden, beginnt Slowloris mit einer Anfrage und fügt kontinuierlich, aber sehr langsam, zusätzliche Header-Zeilen hinzu, ohne dabei die Anfrage jemals abzuschließen.
3. Aufrechterhalten der Verbindung: Der Server nimmt alle Header-Daten entgegen und wartet darauf, dass die Anfrage vollständig eingeht.
4. Ressourcenverknappung: Da der Server nur eine begrenzte Anzahl gleichzeitiger Verbindungen verarbeiten kann, führen viele solcher langsamen Verbindungen dazu, dass der Server keine mehr von weiteren Clients akzeptieren kann.
Manche Server von Haus aus immun
Nicht alle modernen Webserver sind anfällig für Slowloris-Angriffe. Der am häufigsten eingesetzte Webserver Nginx ist in der Standardkonfiguration im Grunde immun gegen Slowloris-Angriffe. Das liegt neben den Einstellungen auch an der Architektur des Servers. Es handelt sich um eine ereignisorientierte asynchrone Architektur, die vor allem nicht für jede aufgebaute Verbindung einen einzelnen Thread für die Bearbeitung vorhält und auch nur wenig Speicher für jede Verbindung vorhalten muss.
Mit den Konfigurationsoptionen "client_ header_timeout" und "client_body_timeout" können Sie Nginx entsprechende Intervalle mitteilen, in denen nach einem Verbindungsaufbau Daten vom Client gesendet werden müssen. Andernfalls wird ein Timeout-Fehler mit dem HTTP-Fehlercode 408 zurückgegeben. Das bedeutet aber auch, dass Sie bei schlechter Konfiguration eines Nginx-Servers die Anfälligkeit wieder erhöhen könnten.
Der wohl bekannteste Webserver neben dem Internet Information Server (IIS) von Microsoft (der mit einem Marktanteil unter fünf Prozent eher selten im Einsatz ist) ist der Apache HTTP-Daemon. In der Standardkonfiguration hält Apache aufgebaute Verbindungen für eine lange Zeit offen und verwaltet für jede Anfrage einen eigenen Prozess beziehungsweise einen eigenen Thread. Während die Konfigurationsoption mit dem Namen "headerWaitTimeout" des ISS die Wartezeit auf Header-Daten ausgehend vom Verbindungsaufbau konfiguriert, betrachtet Apache mit der "TimeOut"-Direktive den Zeitwert seit dem letzten empfangenen Paket [2].
Modulare Erweiterungen für Apache
Mit der Erweiterung "mod_reqtimeout" bietet Apache seit Version 2.2 die Konfigurationsoption "RequestReadTimeout" an. Damit stellen Sie serverweit oder für einzelne virtuelle Hosts unterschiedliche anfragespezifische Timeouts ein. Mit der folgenden Zeile erlauben Sie Apache maximal zehn Sekunden Wartezeit zum Empfang von Header-Daten, die sich jedoch pro empfangener 500 Bytes um jeweils eine Sekunde verlängert. Dabei darf ein Maximalwert von 30 Sekunden nicht überschritten werden:
RequestReadTimeout header=10-30, MinRate=500
Verwenden Sie die Apache-Erweiterung "mod_security", etwa weil Sie diese aus unseren anderen Artikeln kennen, können Sie ebenfalls verbindungsspezifische Parameter konfigurieren.
Eigene Webserver pentesten
Wenn Sie selbst einen Webserver betreiben oder den Betrieb in Ihrem Unternehmen verantworten, möchten Sie natürlich wissen, wie sich dieser bei den entsprechenden Angriffen verhält. Bevor Sie Slowloris nun einsetzen, stellen Sie sicher, dass Sie die Erlaubnis haben, Tests gegen den Zielserver durchzuführen. Bestenfalls kann Ihnen die IT-Abteilung - oder Sie selbst - einen nicht produktiven Schattenserver für erste Versuche bereitstellen. Geht das nicht, setzen Sie auf Ihrem lokalen Host einfach mit Docker den ein oder anderen Webserver für Testzwecke auf.
Installieren Sie die Python-Implementierung von Slowloris mit dem folgenden Kommando auf Ihrem System:
pip3 install slowloris
Sollte die Installation nicht möglich sein, etwa weil Sie das Paket nicht systemweit aufspielen können, oder möchten Sie vor dem Einsatz noch einen Blick in den Code werfen, klonen Sie einfach das Repository von Slowloris mit
git clone https://github.com/gkbrk/slowloris.git
Anschließend wechseln Sie in das Verzeichnis und können von hier aus Slowloris ausführen.
Feuer frei
Um einen ersten Test mit Slowloris durchzuführen, verwenden Sie den Befehl
python3 slowloris.py example.com
Vergessen Sie dabei nicht, die Domain "example.com" an Ihre eigene Umgebung anzupassen. Natürlich können Sie Slowloris über einige Parameter anpassen, etwa im Hinblick auf die Testintensität und -art des Angriffs. Beispielsweise lassen sich die Anzahl der geöffneten Verbindungen oder die Dauer zwischen den einzelnen Header-Sendungen und andere Faktoren modifizieren. Sie erkennen schon, damit können Sie dann selbst die Maßnahmen der Server wieder ein Stück abschwächen - vorausgesetzt, Sie kennen die auf den Servern gesetzten Werte.
Möchten Sie zum Beispiel einen Angriff mit 5000 Verbindungen starten, rufen Sie Slowloris mit dem Parameter "-s" auf. Der folgende Aufruf startet einen Durchlauf gegen den mit TLS geschützten Server an Port 443:
python3 slowloris.py example.com -s 5000 --https -p 8443
Möglicherweise sehen Sie an dieser Stelle einen bemerkenswerten Effekt der Apache-Konfiguration: Haben Sie dort keine Einstellungen geändert, sollte es nicht möglich sein, 1000 gleichzeitige Verbindungen aufzubauen. Bereits vor Erreichen dieser Grenze ist die Anzahl der verfügbaren Prozesse/Threads und damit der verfügbaren Verbindungen aufgebraucht. Eine Verbindung zum Webserver für legitime Benutzer ist dann nicht mehr zuverlässig möglich, bis Sie den obigen Befehl beenden.
Fazit
Das Beispiel Slowloris zeigt, wie einfach Denial-of-Service-Angriffe durchführbar sind und wie Sie sich und Ihre Webserver davor schützen können. Stellen Sie eine Verwundbarkeit eines Ihrer Webserver fest, und sei die Auswirkung auf den ersten Blick auch noch so klein, sollten Sie mögliche Gegenmaßnahme diskutieren und ausrollen.
Bekannte Denial-of-Service-Angriffe
Art des Angriffs |
Beschreibung |
Verbrauchte Ressourcen |
DoS/DDoS |
Volumenbasierte Angriffe | Fluten des Netzwerks mit Datenverkehr, um die Bandbreite zu überlasten. | Netzwerkbandbreite | DDoS |
UDP-/ICMP-Flooding | Senden einer großen Anzahl von UDP-/ICMPPaketen, um das Zielsystem zu überlasten. | Netzwerkbandbreite, CPU | DDoS |
SYN-Flooding | Senden einer großen Anzahl von SYN-Anfragen ohne Abschluss des Handshakes, um Verbindungen zu blockieren. | Netzwerkressourcen, Speicher | DDoS |
Ping of Death | Senden von zu großen oder fragmentierten Ping-Paketen, die das Zielsystem zum Absturz bringen. | Netzwerkbandbreite, Speicher | DoS |
Slowloris | Halten von HTTP-Verbindungen durch langsame Übermittlung von Header-Daten, um die maximale Verbindungskapazität zu erreichen. | Serververbindungen, Speicher | DoS |
HTTP Slow POST / RUDY (R-U-Dead-Yet) | Senden von sehr langsamen POST-Daten, um die Serverressourcen zu binden. | Serververbindungen, CPU, RAM | DoS |
Reflection | Senden von Anfragen an Drittserver mit gefälschter Absenderadresse, sodass die Antworten das Opfer überfluten. | Netzwerkbandbreite | DDoS |
Amplification | Ausnutzung von offenen Servern (DNS, NTP, SSDP), um die Bandbreite des Opfers mit großen Mengen von Daten zu überfluten. | Netzwerkbandbreite | DDoS |
(dr)