Wie ihr sicher mitbekommen habt, gibt es ein weniger nettes 0-Day Exploit, das den Apache lahm legen kann. Das Exploit wurde auf golem und heise verlinkt und somit werden wir die nächsten Tage noch viel „Spaß“ haben. Der PHPGangsta hat eine Implementierung eines Checkers vorgestellt, die auf dem Zend Framework aufbaut. Da dies auch ohne Zend geht, habe ich mal schnell auf Basis des Exploits einen Checker gebastelt.
Der Code ist hier zu finden:
<?php if (count($argv)==1) { echo "Usage: " . $argv[0] . " host <port>\n"; die(); } $host = $argv[1]; $port = (isset($argv[2])) ? $argv[2] : 80; echo "Checking $host:$port... \n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { die("could not create socket\n"); } else { $result = socket_connect($socket, $host, $port); } $p = "HEAD / HTTP/1.1\r\nHost: $host\r\nRange:bytes=0-4\r\nAccept-Encoding: gzip\r\nConnection: close\r\n\r\n"; socket_write($socket, $p, strlen($p)); while ($out = socket_read($socket, 2048)) { if (stripos($out, "partial")!==false) { echo "[!!] possibly vulnerable\n"; exit(); } } echo "[*] possibly _not_ vulnerable \o/ \n"; ?>
Das Skript baut eine TCP Verbindung zu einem angegebenen Server und Port auf und sendet die Testanfrage des Exploits. Die Antwort wird auf das Schlüsselwort „Partial“ untersucht. Wird dieses gefunden ist der Server vermutlich anfällig für das Exploit, wenn nicht – dann nicht 😉
Da es ein 5-Minuten Skript ist und sobald ein Patch für den Apache existiert nicht mehr relevant sein wird, ist es nicht sonderlich sauber geschrieben.