Facebook
Twitter
Google+
Kommentare
0

Testet eure Apache Server auf die neue 0-Day DOS-Lücke

Ich möchte wenig Zeit verlieren: Heute wurde ein sehr leichter Angriff bekannt, mit dem man viele voll gepatchte Apache 2.2 Server ziemlich einfach abschießen kann. Details dazu finden sich sowohl bei Heise als auch bei Golem.

Es geht also um den HTTP Range-Header. Eigentlich dazu gedacht, Downloads zu pausieren und zu resumen, ist der Apache anfällig wenn man ihm sehr viele Ranges hinwirft, er verbraucht dann unheimlich viel RAM, geht dann an den Swap-Speicher, und dann beginnt Linux damit Prozesse zu beenden weil der Arbeitsspeicher total überlastet ist. Wenn man Pech hat kommt man nicht mal mehr via SSH drauf.

Es gibt einen Exploit, der in Perl geschrieben ist, und der einen Server erst darauf testet ob er anfällig ist, und wenn er es ist, beginnt er damit viele Requests loszuschicken mit vielen Range-Headern. Nach wenigen Sekunden ist der Server nicht mehr erreichbar. Dieser Exploit wird von Heise und Golem verlinkt, also nahezu jeder Script-Kiddy wird nun loslaufen und es benutzen, es wird nur Perl und das Perl-Modul Parallel::ForkManager benötigt.

Achso, das Apache Team hat versprochen innerhalb von 48 Stunden einen Patch zu liefern. Bis dahin bleiben einem nur wenige Möglichkeiten: Range-Support ganz ausschalten, oder via .htaccess zumindestens einschränken. Wie das geht findet ihr auch in den Artikeln bei Heise und Golem. Oder einen Reverse-Proxy nutzen der nicht anfällig ist.

Hier habe ich ein kleines Script in PHP, das einen Webserver auf Anfälligkeit testet (Zend Framework wird benötigt in diesem Fall, ich arbeite noch an einer kurzen Version ohne Zend Framework):

<?php

require_once 'Zend/Http/Client.php';
$client = new Zend_Http_Client();
$client->setHeaders('Range', 'bytes=0-4');
$client->setMethod(Zend_Http_Client::HEAD);
$client->setUri('http://www.phpgangsta.de');

$response = $client->request();

if (strpos($response->getMessage(), 'Partial') !== false) {
    echo "wahrscheinlich anfällig: ".$response->getMessage()."\n\n";
} else {
    echo "wahrscheinlich nicht anfällig: ".$response->getMessage()."\n\n";
}

Es wird also ein Request abgeschickt mit der Bitte um eine Range, und wenn der Server mit einem “Partial Content” reagiert ist er vielleicht angreifbar, wenn es ein Apache-Server ist.

php head.php
wahrscheinlich anfällig: Partial Content

HTTP/1.1 206 Partial Content
Date: Wed, 24 Aug 2011 18:56:31 GMT
Server: Apache
X-powered-by: PHP/5.2.4-2ubuntu5.17
Set-cookie: PHPSESSID=143dfef48a6275aa726bc03af0901b5f; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-encoding: gzip
Content-range: bytes 0-4/20
Content-length: 5
Connection: close
Content-type: text/html; charset=UTF-8

Wer dann ganz sicher gehen will ob er anfällig ist probiert den oben erwähnten Perl-Exploit aus, der wie gesagt viele Requests verschickt mit großen Ranges, und dann den Webserver zum Erliegen bringt. Man sollte aber sicherstellen dass man nicht eine URL probiert die keine Weiterleitung enthält (301, 302), denn das Perl-Script folgt der Weiterleitung nicht. Es muss ein URL zu einer gültigen existierenden Datei sein.

flattr this!

Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen