Fuzzing - Informatik

Transcription

Fuzzing - Informatik
1
Faath Michael, Schäffler Florian - Fuzzing
Fuzzing – Was kann im Netz angewandtes Fuzzing erreichen?
Was ist Fuzzing?
Fuzzing ist eine Software-Testing
Testing-Technik,
Technik, welche eine automatische Suche nach Fehlern ermöglicht.
Viele in den letzten Jahren entdeckte
entdeck Fehler sind mithilfe dieser
ser Technik zutage gekommen.
Dafür werden zufällige bzw. semi-zufällige
semi zufällige Daten genutzt, um z.B. ein Programm zum Absturz zu
bringen. Mit semi- oder auch halbzufälligen Daten ist folgendes gemeint:
"good enough
ugh so it'll look like valid data, bad enough so it might break stuff"
Quelle: 22c3: Fuzzing Fuzzing - Breaking software in an automated fashion (2006),
http://events.ccc.de/congress/2006/Fahrplan/events/1758.en.html
Fuzzing ist eine Blackbox-Testing
Testing-Technik,
nik, dies bedeutet, es wird ohne zusätzliche Informationen wie
z.B. den Quellcode eines Programmes oder die Konfiguration, getestet. Man konzentriert sich auf die
fertige Anwendung.
Was bringt Fuzzing?
Primär kann Fuzzing dazu genutzt werden, seine eigenen
eigenen Programme auf Fehler zu überprüfen. Aber
auch das lahmlegen von fremden Programmen und Diensten ist eine Anwendungsmöglichkeit. Durch
genauere Analyse der gefundenen Fehlfunktionen kann es auch möglich werden, Code
einzuschleusen.
Ein kurzer geschichtlicher
icher Abriss
Fuzzing wurde von Professor Barton Miller zusammen mit Studenten an der Universität von
Winsconsin-Madison
Madison im Jahre 1989 entwickelt. Sie testeten verschiedene UNIX-Programme,
UNIX Programme, indem
sie automatisiert zufällige Parameter übergaben. Ein Drittel aller getesteten Programme stürzten
dabei ab.
Was kann man alles Fuzzen?
Weit verbreitet ist die Meinung, man könne nur HTTP fuzzen. Doch ist dies schlicht und ergreifend
falsch, es können so gut wie alle Dinge gefuzzed werden, die in irgendeiner Art Eingaben erwarten.
Sei es durch Argumente, Umgebungsvariablen, die Standardeingabe
Standardein
(stdin) etc.
Hier eine kleine Auflistung, was gefuzzed werden kann:
•
•
•
•
Netzwerkprotokolle / Netzwerkanwendungen
Argumente, Umgebungsvariablen, stdin, file-descriptors
file
APIS (syscalls, library calls)
Dateien
Es lassen sich also neben Webanwendungen auch
auch Netzwerkprotokolle aber auch lokale Programme
mithilfe der Konsole oder über von Ihnen geöffnete Dateien fuzzen.
Fuzzer-Typen
Prinzipiell kann man zwischen zwei Arten von Fuzzern unterscheiden:
•
•
Solche die speziell für einen Zweck, also ein Protokoll oder eine Anwendung, geschrieben
wurden
Fuzzing-Frameworks,
Frameworks, welche Funktionen zum Bau eines eigenen Fuzzers beinhalten
2
Faath Michael, Schäffler Florian - Fuzzing
Wie funktioniert Fuzzing?
Es werden zufällige Daten (z.B. an eine Anwendung) gesendet, hier gibt es zwei Möglichkeiten, wie
bereits erwähnt:
1. Es werden völlig zufällige Daten gesendet
So ist es möglich, eine Vielzahl von Fehlern aufzudecken. Jedoch braucht man dafür viel Zeit,
da der komplette Raum von möglichen Eingaben durchgegangen wird. Dies kann im Prinzip
unendlich lange gemacht werden, so dass man Glück benötigt, frühzeitig einen Treffer zu
landen.
2. Vorherige Analyse der möglichen Eingabe-Daten
Eingabe
Man begrenzt den Eingaberaum, indem man sich z.B. die Anwendung oder das Protokoll
genauer anschaut. Viele Anwendungen/Protokolle filtern direkt Eingaben, welche nicht in ein
bestimmtes Schema
hema passen. Bei dieser Methode werden also zufällig generierte Daten in ein
bestimmtes Schema eingebettet, so dass diese das Programm annimmt. Hierbei können
jedoch Fehler übersehen werden, da wir nicht alle Möglichkeiten durchgehen.
Außerdem unterscheidet
et man in 3 Methoden, mit welchen Fuzzing betrieben werden kann:
1. Manuelles Fuzzen
Jede Eingabe wird manuell generiert und abgesendet, dadurch hat der Benutzer die
größtmögliche Kontrolle und kann alle Reaktionen selbst analysieren. Diese Methode ist sehr
gründlich, erfordert jedoch viel Zeit und Kenntnisse von der Materie.
2. Automatisches Fuzzen
Der Fuzzer generiert hier im Gegensatz zum manuellen Fuzzen die Eingaben selbst und
sendet diese auch selbstständig an das Programm. Danach muss er analysieren, ob sich die
zu testende Anwendung weiterhin normal verhält. Stellt er eine Abweichung fest, wird die
Abarbeitung beendet und dem Benutzer das Ergebnis mitgeteilt. Mit dieser Methode lassen
sich große Mengen an Eingaben ausprobieren, jedoch können Fehler übersehen
übers
werden, falls
der Fuzzer diese nicht richtig erkennt und einfach weiter arbeitet.
3. Halbautomatisches Fuzzen
Dies stellt einen Mittelweg zwischen dem manuellen und dem automatischen Fuzzen dar. Die
Eingaben werden automatisch generiert, die Auswertung übernimmt jedoch der Benutzer. So
werden beide Vorteile der ersten Methoden vereint, die Kontrolle bleibt beim Benutzer und
es kann schneller gearbeitet werden. Die Geschwindigkeit eines automatischen Fuzzers kann
aber bei weitem nicht erreicht werden.
Wann ist das Ziel erreicht?
Ein Fuzzer hat sein Ziel erreicht, wenn das Programm z.B. hängen bleibt, komplett crasht (also sich
ungeplant beendet), der Zielrechner einen Reboot ausführt oder eine übermäßige Speichernutzung
festgestellt werden kann. Dann kann der Fehler genauer analysiert werden, ggf. kann so auch Code in
das Hostsystem eingeschleust werden.
3
Faath Michael, Schäffler Florian - Fuzzing
PROTOS (http://www.ee.oulu.fi/research/ouspg/protos):
PROTOS ist kein Programm im eigentlichen Sinne, sondern viel mehr eine ganze Sammlung von
Programmen
ammen die unter dem Namen PROTOS zusammengefasst und entwickelt werden. Entwickelt
wird diese Anwendung an der finnischen Universität Oulu vom Computer Engineering Laboratory seit
1999. Dieses Projekt wird seit Beginn von mehreren Unternehmen unterstütz. 1999
1999 waren diese
Unterstützung 90.000 Euro und 2001 schon 140.000 Euro.
Das PROTOS Projekt ist in einzelne Test-Suites
Test Suites unterteilt, welche jeweils für verschiedene Protokolle
und Anwendungen zuständig sind. Was diese Test-Suites
Test Suites von anderen Fuzzern unterscheidet
unters
ist
nicht nur die Funktionsweise, sondern auch dass allesamt in Java geschrieben sind, weil viele andere
Fuzzer entweder in Skript-Sprachen
Sprachen oder C geschrieben sind. Des Weiteren ist der Quelltext frei
erhältlich und von den einzelnen Test-Suite
Test
Seiten
iten herunterladbar. Zu diesen Test-Suites
Test
gehören
c04-wap-wsp-request, c05-wap-wmlc,
wmlc, c05-http-reply,
c05
c06-ldapv3, c06-snmpv1,
snmpv1, c07-sip,
c07
c07-h2250v4,
c09-isakmp, c09-dns und c10-archive.
archive.
Jeder Fehler der bei Tests mit einer Test-Suite
Test
aus PROTOS auftritt kann
n theoretisch mindestens als
Denial of Services ausgebaut werden. Diese Denial of Services können natürlich auch auf gleiche
Funktionen abzielen und somit die gleiche Ursache haben. Es handelt sich also nicht nur um
unterschiedliche Fehlerquellen. In mehreren
mehreren Fällen ist auch ein Buffer Overflow Exploit möglich.
Einblick c05-http-reply:
Die Ausführung des Fuzzers verhält sich ziemlich einfach. Ohne vorherige Konfiguration muss nur die
Java-Anwendung
Anwendung aufgerufen werden um den Fuzzer zu starten. Dies geschieht mit
java -jar c05-http-reply-r1.jar
Es wird nun ein kleiner Webserver auf Port 8000 gestartet, welcher HTTP-Anfragen
HTTP Anfragen beantwortet, die
aus wirklichen HTTP-Daten
Daten und zufällig generierten Daten bestehen. Es wird speziell darauf geachtet,
dass kritische Informationen
ormationen miteinander verknüpft werden, da somit Fehler wahrscheinlicher
werden. Obwohl die Entwicklung des co5-http-reply
co5
reply schon vor einigen Jahren beendet wurde, wird
es noch immer eingesetzt um Browser zu testen.
Einblick c06-snmpv1:
reply verhält es sich auch mit dieser Test-Suite
Test Suite bezüglich der Einfachheit. Um
Ähnlich wie c05-http-reply
ein SNMP-fähiges
fähiges Gerät zu testen muss man sich nur entscheiden, ob Requests oder Traps fuzzen
möchte. Um beispielsweise Requests zu fuzzen wird einfach die Test-Suite
Test
c06-snmp
snmpv1 gestartet
werden. Dies geschieht mittels
java -jar c06-snmpv1-req-app.jar
app.jar -host <HOSTNAME>
Nun werden halbzulässige Pakete an gesetzten Hostnamen geschickt, welche darauf abzielen zu
testen wo in der jeweiligen SNMP-Implementierung
SNMP
sich Schwachstellen
len befinden. Diese Test-Suite
Test
dürfte wohl die bekannteste aus dem PROTOS Paket darstellen, da es mit Hilfe dieses Fuzzer
gelungen ist schwerwiegende Fehler im SMNPv1 nachzuweisen. Es wurde zum Beispiel eine
Möglichkeit entdeckt jedes Gerät, welches SNMPv1
SNMPv1 abstürzen zu lassen und bei manchen
Implementierungen sogar Code einzuschleusen. Obwohl diese Schwachstelle schon seit geraumer
Zeit bekannt ist wird bei vielen Geräten noch immer SNMPv1 benutzt, obwohl SNMPv3 unter
Anderem auch dieses strukturelle Problem
Probl
behebt.
Einblick c07-sip-r2:
Wie der Name schon sagt handelt es sich hier um die Test-Suite
Test Suite welche versucht das SIP Protokoll für
VoIP zu fuzzen. Als Ansatz-Punkt
Punkt wird hier die INVITE-Funktion,
INVITE Funktion, welche beim Aufbau einer SIPSIP
Verbindung benutzt wird, verwendet.
verwendet. Es werden immer wieder abgeänderte INVITE-Nachrichten
INVITE
an
4
Faath Michael, Schäffler Florian - Fuzzing
den Server verschickt. Genauso wie bei der Veröffentlichung der snmpv1 Test-Suite
Test Suite hatte diese
Anwendung auch verheerende Auswirkungen. Es konnte unter Anderem gezeigt werden, dass ein
Großteil der Systeme durch die gefuzzten INVITE-Anfragen
INVITE Anfragen abstürzte und somit Ansatzpunkt für
Sicherheitslöcher ermöglichte. Im weiteren Verlauf wurden, ausgehend von diesen Ergebnissen,
mehrere Proof-of-Concept
Concept Buffer Overflow Exploits oder Denial of Services-Explo
Service Exploits entwickelt.
Durch PROTOS gefundene Schwachstellen in folgender Software:
• Cisco IP Phone Model 7940/7960 running SIP images prior to 4.2
• Cisco Routers running Cisco IOS 12.2T and 12.2 'X' trains
• Cisco PIX Firewall running software versions with SIP support, beginning with version 5.2(1)
• Ingate Firewall < 3.1.3
• All versions of SIP Express Router up to 0.8.9
• Mediatrix VoIP Access Devices and Gateways firmware < SIPv2.4
• Mozilla Firefox IBM SecureWay V3.2.1 running under Solaris and Windows 2000
• Lotus Domino
mino R5 Servers (Enterprise, Application, and Mail), prior to 5.0.7a
• Microsoft Exchange 5.5 prior to Q303448 and Exchange 2000 prior to Q303450
• Network Associates PGP Keyserver 7.0, prior to Hotfix 2
• Oracle Internet Directory, versions 2.1.1.x and 3.0.1
• OpenLDAP,
enLDAP, 1.x prior to 1.2.12 and 2.x prior to 2.0.8
• ...
Mengleme (http://freshmeat.net/projects/mangleme) :
Bei mengleme handelt es sich um einen reinen HTTP-Fuzzer,
HTTP Fuzzer, welcher in der Programmiersprache C
geschrieben ist. Auf Grund dessen, dass mengleme so effektiv
effektiv arbeitet ist es mittels dieses Fuzzer
gelungen jeden der bekannten und viele kleinere weniger bekannte Browser zum Absturz zu bringen.
Funktionsweise Mengleme:
Es wird mittels eines CGI-Skripts
Skripts eine Seite aus mehreren zufällig zusammengestellten HTML-Tags,
H
Extremwerte innerhalb dieser HTML-Tags
HTML Tags und zusätzlichen variierenden Informationen erstellt. Diese
Seite wird nun immer wieder von einem Browser aufgerufen. Sollte nun der Browser beim Aufrufen
dieser mittels CGI generierten Webseite abstürzen, so
so war der Fuzzer erfolgreich. Um später eine
Suche nach der Ursache für den Absturz zu machen ist es vernünftig die generierten Seiten auf dem
Server zu speichern, bevor sie an den Browser geschickt werden.
HTMLer („ it finds IE bugs after roughly 2.5 -> 3 hours“)
Dies ist eine Portierung von C in Python mit kleineren Modifikationen. Somit bleibt die
Funktionsweise ähnlich verglichen mit der mengleme, außer dass nun keine CGI sonder einen Python
generierte Seite aufgerufen wird.
Mittels dieses Fuzzer wurde
de 2004 der IFrame Bug beim Microsoft Internet Explorer entdeckt. Diese
Schwachstelle machte sich der Bofra-Wurm
Bofra Wurm zu nutze. Die Konsequenz war, dass Microsoft rund ein
Monat nachdem der IFrame Bug entdeckt wurde 5 Tage vor einem Patching Tuesday ein Fix für
dieses Problem herausbrachte.
Durch mengleme/HTMLer gefundene Schwachstellen in folgender Software:
• Microsoft Internet Explorer: u.A. IFrame Bug
• Netscape Navigator / Mozilla Firefox
• Links
• Lynx
• Opera
• Safari
• …
5
Faath Michael, Schäffler Florian - Fuzzing
Fuzzing Tools und Frameworks
Tools für Webbrowser
Axman
Active X
COMbust
Common Object Model
CSS-Die
Stylesheet-Unterstützung
DOM-Hanoi
Data Object Model
Hamachi
DHTML-Code
jsparsefuzz
JavaScript
MangleMe
HTML-Tags
Tools für Betriebssysteme
ISIC
IP-Stacks
Sfuzz
Unix-Sockets
Stress2
FreeBSD-Kernel
Sysfuzz
syscall()-Funktionen
Tools für Netzwerkdienste
DHCPfuzz
DHCP-Clients
FTPStress
FTP-Server
Fuzzball2
TCP/IP-Header
IRCfuzz
IRC-Clients
Protos
Tool-Sammlung
Sammlung für SIP, SNMP, DNS und andere
SSHredder
Sammlung mutierter SSH-Pakete
Sonstige Tools
Mangle
mutiert Datei-Header
Bugger
mutiert Daten im Speicher laufender Programme
CFG9000
intelligente Mutation unbekannter Eingabedaten
Frameworks
Autodafe
Netzwerkprotokolle, mit Laufzeitanalyse
Bed
Netzwerkprotokolle, Sprache: Perl
Peach
universell einsetzbar, Sprache: Python
Smudge
Netzwerkprotokolle
Spike
Netzwerkprotokolle, Sprache: C
Spikefile
Dateiformate, Sprache: C
Quelle: http://www.heise.de/security/Schwachstellensuche-mit-Fuzzing--/artikel/100167/3
http://www.heise.de/security/Schwachstellensuche
6
Faath Michael, Schäffler Florian - Fuzzing
Quellen:
•
Heise: Schwachstellensuche mit Fuzzing,
http://www.heise.de/security/Schwachstellensuche
http://www.heise.de/security/Schwachstellensuche-mit-Fuzzing--/artikel/100167/
/artikel/100167/
•
Heise: Die Axt im Walde
http://www.heise.de/security/Die
http://www.heise.de/security/Die-Axt-im-Walde--/artikel/76512
•
22c3 - Ilja van Sprundel: Fuzzing - Breaking software in an automated fashion
http://events.ccc.de/congress/2005/fahrplan/events/537.de.html
•
23c3 - Dan Kaminsky: Black Ops 2006 Viz Edition - Pixel Fuzzing and the Bioinformatic
Bindiff
cc.de/23c3_m4v_1713.html
http://chaosradio.ccc.de/23c3_m4v_1713.html
•
23c3 - Gadi Evron: Fuzzing in the corporate world
http://chaosradio.ccc.de/23c3_m4v_1758.html
•
Ziegler, Paul S. (2007): Fuzzing – Teil 1 und 2, Bonn: Hakin9 – Hard Core Security Magazine
•
Miller, Barton P.: Fuzz Testing of Application
Applic
Reliability
http://pages.cs.wisc.edu/~bart/fuzz/

Similar documents