170 likes | 303 Views
Fuzzer Seminar Internet-Technologie Fachgebiet Praktische Informatik. Referent: Mirko Schäfer, FB 16 Informatik. Gliederung. Ideen und Motivation Kategorisierung für Softwaretests Begriffsdefinition Historisches Fuzzing Techniken Aktuelle Implementierungen Praxisbeispiele
E N D
FuzzerSeminar Internet-TechnologieFachgebiet Praktische Informatik Referent: Mirko Schäfer, FB 16 Informatik
Gliederung • Ideen und Motivation • Kategorisierung für Softwaretests • Begriffsdefinition • Historisches • Fuzzing Techniken • Aktuelle Implementierungen • Praxisbeispiele • Fuzzing einer FTP Server Implementierung • Fuzzing Framework Peach • Fazit und Ausblick • Fragen • Literatur #
Ideen und Motivation Einfache Bedienung Verlässliche Fehlererkennung Plattform unabhängig Suche nach ALLEN Fehlermöglichkeiten Für jeden Softwaretyp einsetzbar Erstellung eines möglichst einfachen, objektiven und universellen Testverfahren , um Schwachstellen zu finden, die sonst niemand aufdecken würde. #
Kategorisierung für Softwaretests • Zugriff auf Programmquellcode und Binarys • z.B. Open Source Software (Linux Kernel) • Zugriff auf Binarys • z.B. Closed Source SW (Internet Explorer…) • Kein Zugriff auf Binarys oder Quellcode(Black Box Fuzzing) • z.B Webserver, FTP Server, SMTP…. #
ZIEL Begriffsdefinition Robustheitstest für Software / Softwaredienste in Bezug auf Manipulation der Eingabedaten Überprüfung des Programmcodes durch Provokation eines Programmabsturzes oder fehlerhafte Datenverarbeitung #
Historisches • Geburtstag als „fuzz“ Unix-Kommando 1990 in einer Forschungsgruppe um Barton Miller[2] • Tool zum Testen von gängigen Unix Kommandos mit Random Eingabedaten variabler Länge • Abstürze u.A. bei emacs, ftp, ident • medienwirksames Beispiel der Fuzzing Technik: IFrame-Lücke im IE 2005[3] • Resultat: MyDoom Wurm[4] #
ZIEL Fuzzing Technik • Generation von möglichst effektiven Testdaten • Testdaten müssen zum zu testenden Programm passen • Zu beachten: • bei Kapselung (OSI-Layer) • Erwartung eines definierten Formates (Bilddateien…) • Prüfsummen (CRC) Reduktion durch Optimierung der gültigen Eingabedaten (Eingaberaum) #
Fuzzing Techniken Vergleich der gängigen Ansätze Eingabedatenanalyse Datenmutation gezieltes Suchen und Testen von möglichen Schwachstellen Wahllose Datenmutation in Inhalt und Länge + sehr kleiner Eingaberaum + Test auf alle Möglichkeiten + schnell einsetzbar • übersehen von Fehlern - langwierige Programmanalyse - riesiger Eingaberaum #
Aktuelle Implementierungen Programmbezogene Fuzzer Fuzzing Frameworks -hohe Spezialisierung auf Einsatzgebiet #
Programmabsturz Praxisbeispiel 1FTP Server Fuzzing – FTP Stress [6] • Testumgebung: • FTP Server Golden FTPd Server auf lokalem Recher • FTP Stress Fuzzer[5] Getestet werden alle FTP Kommandos mit Übergabeparametern variabler Länge und Textinhalt „A“ Programm terminiert nach Ausführung des CWD/CDUP Kommandos mit einem Übergabeparameter einer bestimmten Länge #
Praxisbeispiel 1FTP Server Fuzzing – FTP Stress Einsatz eines Programm Debuggers • EIP Register Inhalt entspricht Testtext • Ungültiges Sprungadressziel Durch Anpassung der Länge des Übergabewertes ist Manipulation des Sprungzieles möglich! Buffer Overflow Problem #
Praxisbeispiel 2Einsatz eines Fuzzing Frameworks – PEACH[7] • Scriptsprache Python • Objekt Orientierter Programmansatz • beinhaltet Generatoren für Vielzahl von Datenpaketen und Inhalten • MS .net und Eclipse Plugins verfügbar • Plattformunabhängig • Integration von „Selbsttest- Routinen“ DAS Beispiel: gen = Static('Hello world') print gen.getValue() Hello World #
Praxisbeispiel 2 Einsatz eines Fuzzing Frameworks - PEACH gen = www.http(*,/dev/stdout); gen = Block([ Static('GET / HTTP/1.0rn'), Static(‚Host: http://'), Repeater(group, Static('A'), 1, 4), Static('rn'),]) while True: print gen.getValue() group.next(); GET / HTTP/1.0 Host: http://A GET / HTTP/1.0 Host: http://AA GET / HTTP/1.0 Host: http://AAA GET / HTTP/1.0 Host: http://AAAA #
Praxisbeispiel 2 Einsatz eines Fuzzing Frameworks - PEACH gen = www.http(*,/dev/stdout); gen = Block([ Static('GET / HTTP/1.0rn'), Static(‚Host: http://'), Repeater(group, Static('A'), 1, 4), Static(‘/input.php?value=‘), Repeater(group, Static(‚b'), 1, 4), Static('rn'),]) while True: print gen.getValue() group.next(); GET / HTTP/1.0 Host: http://A/input.php?value=b GET / HTTP/1.0 Host: http://AA/input.php?value=bb GET / HTTP/1.0 Host: http://AAA/input.php?value=bbb GET / HTTP/1.0 Host: http://AAAA/input.php?value=bbbb #
Fazit und Ausblick • Starke Zunahme der verfügbaren Tools und Plattformen • durch Frameworks wenig Fachwissen nötig • „Script-kiddies“ • Überschwemmung der Entwickler mit Fehlern • Priorisierung und Kategorisierung der Fehler schwierig Zukunftsträchtige Technik mit jedoch hohem Forschungs- bzw. Optimierungsbedarf #
Literaturverzeichnis Vielen Dank für eure Aufmerksamkeit ! • [1] Heise Verlag / Ct Ausgabe 18,2006 Artikel S.201ff • Wikipedia dt, en Version • [2]ftp://ftp.cs.wisc.edu/paradyn/technical_papers/fuzz.pdf UNIX-fuzz Kommando • [3]MS Internet Explorer I-Frame Lücke http://www.heise.de/newsticker/meldung/53841 • [4]My-Doom Würmer http://www.heise.de/security/news/meldung/53052 • [5]FTP-Stress Tool http://www.infigo.hr/files/ftpfuzz.zip • [6]FTP-Fuzzing mit dem FTP-Stress Tool http://www.infigo.hr/files/INFIGO-TD-2006-04-01-Fuzzing-eng.pdf • [7] PEACH Fuzzing Framework http://peachfuzz.sourceforge.net/
Meinungsbild • Wer hat : • Von Fuzzing / Fuzzern noch nie etwas gehört? • Den Begriff schon gehört, aber nicht im konkreten Zusammenhang mit Software Testing Tools? • Schonmal einen Fuzzing Tool benutzt um Software zu testen? • Schonmal einen Fuzzer selber erstellt um Software zu testen?