Test: Googles Skipfish

Googles neuer, kostenloser Scanner Skipfish soll nach Einschätzung des Autors Michal Zalewski bei der automatischen Suche nach Schwachstellen in Webanwendungen gleich in der Oberliga mitspielen. Wir haben uns angeschaut, ob der Scanner diese selbstbewussten Versprechen halten kann.

Lesezeit: 12 Min.
In Pocket speichern
vorlesen Druckansicht
Von
  • Felix "FX" Lindner
Inhaltsverzeichnis

Bei Sicherheitsuntersuchungen von Web-Applikationen nutzt man automatische Scanner, um eine Grundlage zu schaffen und die dann durch manuelle Tests auszubauen. Je nach Anforderung und Kenntnis des Anwenders kommen dabei minimalistische Basiswerkzeuge wie Nikto oder umfangreiche kommerzielle Tools wie Rational AppScan zum Einsatz. Ziel dieser Scans ist es vor allem, Konfigurations- und Implementierungsfehler im Zusammenspiel von Webserver, Applikationsserver, Applikationslogik und anderen Komponenten aufzudecken, die eine moderne Web-Applikation ausmachen. Zu den typischerweise gefundenen Schwachstellen gehören unter anderem SQL-Injection, Cross Site Scripting, Cross Site Request Forgery und Code Injection.

Skipfish unterstützt alle Funktionen, die man sich für eine generische Untersuchung einer Web-Seite wünscht: Er kann mit Cookies umgehen, Authentifizierungsinformationen und Werte für HTML-Formular-Variablen verarbeiten, oder sogar nur ein Sitzungs-Token verwenden, um sich als authentifizierter Nutzer auf der Zielseite zu bewegen. Eine der Spezialitäten von Skipfish ist das brutale Ausprobieren von möglichen Datei- und Verzeichnisnamen, um beispielsweise vom Admin vergessene Backupversionen von Scripten, gepackte Archive ganzer Web-Applikationen oder versehentlich hinterlassene Konfigurationsdateien von SSH oder Subversion ausfindig zu machen. Da sich solche Fundstücke nur durch Ausprobieren aufspüren lassen, verknüpft der Scanner verschiedene bekannte Endungen mit allen möglichen Dateinamen, welche er über die normalen Links auf der Web Seite findet.

Darüber hinaus probiert er einige handverlesene Schlüsselwörter als Verzeichnis- und Dateinamen durch, die er vermutlich aus dem Google Suchindex extrahiert. Zu beachten ist hierbei, dass Skipfish tatsächlich alles mit allem kombiniert und ausprobiert. Das heißt in der Praxis wird jedes Schlüsselwort mit jeder Endung und jeder tatsächlich auf dem Webserver gefundenen Datei kombiniert und das Ergebnis sowohl als Datei- und Verzeichnisname als auch als Argument einer HTTP-POST-Anfrage verwendet. Dieses Vorgehen hat eine kombinatorische Explosion zur Folge, welche sich schnell bemerkbar macht. Zum Glück bringt Skipfish vordefinierte Wörterbücher unterschiedlichen Umfangs mit, so dass man das Ausmaß der Anfrageflut selbst bestimmen kann. Doch auch das von Zalewski als Einstieg empfohlene minimale Wörterbuch hat 2007 Einträge verursacht noch rund 42000 Anfragen pro getestetem Verzeichnis.

Um einen Eindruck von Skipfish zu erhalten, haben wir ein paar typische Szenarien kurz untersucht: ein Microsoft Internet Information Server 7.5 auf Windows 7 mit einem Screwturn Wiki 3.0.2 für ASP.NET stellte die typische interaktive Web-Applikation dar. Ein Linux basierter Apache-2.2.3-Server mit klassischen, in Perl geschriebenen CGI-Scripten repräsentierte den eher altbackenen Ansatz. Als typischer Produzent für Fehlalarme und Probleme beim Scannen kam ein alter HP-LaserJet-Drucker mit ChaiServer 3.0 zum Einsatz.

Skipfish liegt nur im Quellcode vor und muss zunächst für die Zielplattform übersetzt werden. Das setzt die Installation von libidn voraus, einer freien Bibliothek zum Codieren und Decodieren von Internationalized Domain Names (IDN) – unter Ubuntu 9.10 ist dies beispielsweise mit sudo apt-get install libidn11-dev schnell erledigt. Nach dem erfolgreichen Übersetzen gilt es, im Unterverzeichnis Dictionary eine Wörterbuchdatei auszuwählen und unter dem Namen skipfish.wl in das Verzeichnis zu kopieren, in dem das Skipfish-Binary liegt. Alternativ kann man den Pfad auch als Option angeben. Beachten sollte man, dass Skipfish die angegebene Datei automatisch erweitert, man sollte also immer mit einer Kopie arbeiten.

Mit ./skipfish -o example-log http://www.example.com/ startet man den Scan des Servers, nach dessen Ende der Report im Verzeichnis example-log liegt. Um nur das Unterverzeichnis blog auf dem Server zu untersuchen, gibt man "-I /blog -o blog-report http://www.example.com/blog" an.

Skipfish liefert nach dem Start eine Netzwerkstatisitk. die für den Anwender aber keinen konkreten Nutzen hat.

Skipfish produziert eine enorme Menge von Anfragen, die er gleichzeitig und in beeindruckender Geschwindigkeit absetzt. Beim ersten Lauf in einem lokalen Gigabit-Ethernet-Segment gegen ein ausreichend skaliertes System erreichte er 2796 HTTP-Anfragen pro Sekunde. Dies trieb die Last eines CPU-Kerns des scannenden Systems sofort auf 100 Prozent. Der TCP/IP-Stack von Linux kann zwar mit der Last umgehen, muss allerdings sämtliche dafür vorgesehenen Mittel nutzen, wie ein Blick auf die netstat-Ausgaben schnell zeigt.

Nach dem Start bekommt man Zweifel, ob Skipfish tatsächlich in absehbarer Zeit mit der Untersuchung fertig wird. Eine Abschätzung, wie lange der Test wohl noch dauert, ist unmöglich. Es dauerte dann auch tatsächlich über vier Stunden bis der Scanner den benachbarten IIS 7.5 mit dem Screwturn-Wiki untersucht hatte. Hierfür hat er 68 GB Daten transferiert um 40 Millionen HTTP-Anfragen abzusetzen. Auf dem Scanner-System wurde nahezu den gesamten Zeitraum ein CPU-Kern komplett ausgelastet und für die Kombinationen der übersichtlichen Anzahl von 1195 Dateien in 43 Verzeichnissen des Wiki wurden seitens Skipfish 140 MB Arbeitsspeicher benötigt. Der IIS lastete in der Zeit zwei Intel XEON 2.5 GHz Kerne vollständig aus, verbrauchte zwischen 100 MB bis 500 MB zusätzlichen Arbeitsspeicher und produzierte in seiner Standardeinstellung 1,5 GB in der Log-Datei.