image

James Forshaw ist ein renommierter Computer-Sicherheits-Experte beim Google-Project Zero und der Entwickler des Netzwerk-Analyse-Tools Canape. Seine Entdeckung von komplexen Designproblemen in Microsoft Windows brachte ihm die »Top-Bug-Prämie« von 100.000 US-Dollar ein und an die Spitze der veröffentlichten Liste des Microsoft Security Response Centers (MSRC). Er wurde eingeladen, seine Ergebnisse auf globalen Sicherheitskonferenzen wie BlackHat, CanSecWest und dem Chaos Computer Congress vorzustellen.

image

Zu diesem Buch – sowie zu vielen weiteren dpunkt.büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei dpunkt.plus+:

www.dpunkt.plus

James Forshaw

Netzwerkprotokolle hacken

Sicherheitslücken verstehen, analysieren und schützen

Übersetzung aus dem Amerikanischen von Peter Klicman

image

James Forshaw

Lektorat: Dr. Michael Barabas

Übersetzung: Peter Klicman

Copy-Editing: Ursula Zimpfer, Herrenberg

Satz: Birgit Bäuerlein

Herstellung: Stefanie Weidner

Umschlaggestaltung: Helmut Kraus, www.exclam.de

Druck und Bindung: M.P. Media-Print Informationstechnologie GmbH, 33100 Paderborn

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Print978-3-86490-569-8

PDF978-3-96088-473-6

ePub978-3-96088-474-3

mobi978-3-96088-475-0

1. Auflage 2018

Copyright © 2018 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

Copyright © 2017 by James Forshaw. Title of the English-language original: Attacking Network Protocols: A Hacker’s Guide to Capture, Analysis and Exploitation, ISBN 978-1-59327-750-5, published by No Starch Press. German-language edition copyright © 2018 by dpunkt.verlag GmbH. All rights reserved.

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.

Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.

5 4 3 2 1 0

Inhaltsübersicht

Vorwort

Danksagungen

Einführung

Inhaltsverzeichnis

1Netzwerk-Grundlagen

2Capturing von Anwendungsverkehr

3Strukturen von Netzwerk-Protokollen

4Fortgeschrittenes Capturing von Anwendungsverkehr

5Analyse auf der Datenleitung

6Reverse Engineering einer Anwendung

7Sicherheit von Netzwerkprotokollen

8Implementierung des Netzwerkprotokolls

9Die Hauptursachen für Sicherheitslücken

10Sicherheitslücken aufspüren und ausnutzen

Anhang

AToolkit für die Netzwerkprotokoll-Analyse

Index

Vorwort

Als ich James Forshaw zum ersten Mal traf, arbeitete ich in einem Job, den Popular Science 2007 in die Top Ten der miesesten Jobs in der Wissenschaft aufgenommen hatte: als »Sicherheitsknecht bei Microsoft« (»Microsoft Security Grunt«). Das war die recht weit gefasste Bezeichnung, die das Magazin für jeden verwendete, der im Microsoft Security Response Center (MSRC) arbeitete. Was unsere Jobs auf dieser Liste schlimmer als »Walfäkalien-Forscher«, aber doch etwas besser als »Elefanten-Sterilisator« erscheinen ließ, war die enorm hohe Frequenz, mit der Reports über Sicherheitsprobleme in Microsoft-Produkten eingingen. (Die Liste war bei uns in Redmont so bekannt, dass wir uns T-Shirts machen ließen.)

Es geschah hier am MSRC, dass James mit seinem scharfen und kreativen Auge für das Ungewöhnliche und Unbeachtete das erste Mal meine Aufmerksamkeit als Sicherheitsstratege erregte. James war der Autor von einigen der interessantesten Sicherheits-Bug-Reports. Das war durchaus eine Leistung, wenn man bedenkt, dass das MSRC pro Jahr über 200 000 Sicherheits-Bug-Reports von Sicherheitsforschern erhielt. James fand nicht einfach irgendwelche Bugs – er hatte sich das .NET-Framework angesehen und Probleme auf Architekturebene erkannt. Auch wenn diese Bugs auf Architekturebene mit einem einfachen Patch wesentlich schwieriger zu lösen waren, so waren sie doch für Microsoft und seine Kunden sehr wertvoll.

Kommen wir gleich zu Microsofts erstem Bug-Prämien-Programm, das ich im Unternehmen im Juni 2013 einführte. Bei diesem ersten Paket von Bug-Prämien gab es drei Programme. Diese Programme versprachen Sicherheitsforschern wie James Geld für die Meldung schwerwiegender Bugs an Microsoft. Ich wusste, dass qualitativ hochwertige Sicherheits-Bugs eingereicht werden mussten, um die Effizienz des Programms nachzuweisen.

Als wir es auflegten, gab es keine Garantie, dass die Bug-Sucher zu uns kommen würden. Wir wussten, dass wir um einige der höchstqualifizierten Bug-Jäger auf der Welt konkurrierten. Es gab zahlreiche andere Geldprämienprogramme und nicht alle Marktplätze für Bugs dienten der Verteidigung. Nationalstaaten und Kriminelle betrieben etablierte, auf Angriffe ausgerichtete Märkte für Bugs und Exploits, und Microsoft war auf diejenigen Bug-Sucher angewiesen, die kostenlos über 200 000 Bug-Reports pro Jahr einreichten. Die Prämien sollten die Aufmerksamkeit dieser netten, altruistischen Bug-Jäger auf die Probleme richten, bei deren Lösung Microsoft die meiste Hilfe benötigte.

Also rief ich James und eine Handvoll anderer Leute an, weil ich darauf zählte, dass sie die fehlerbehafteten Produkte aufspüren würden. Bei diesen ersten Microsoft Bug-Prämien wünschten wir Sicherheitsknechte am MSRC uns das Aufdecken von Sicherheitslücken für den Internet Explorer (IE) 11 Beta, und wir wollten etwas, wofür ein Softwarehersteller noch nie eine Bug-Prämie ausgelobt hatte: Wir wollten Informationen über neue Exploit-Techniken erfahren. Diese Fangprämie war als »Mitigation Bypass Bounty« bekannt und damals 100 000 Dollar wert.

Ich erinnere mich daran, wie ich mit James in London bei einem Bier zusammensaß und ihn zu überzeugen versuchte, nach IE-Bugs zu suchen. Er erklärte mir, dass er sich noch nie mit der Sicherheit von Browsern beschäftigt hatte und dass ich nicht zu viel von ihm erwarten sollte.

Dennoch reichte James vier verschiedene Sandbox-Escapes für IE 11 Beta ein.

Vier!

Diese Sandbox-Escapes lagen alle in Bereichen des IE-Codes, die unsere internen Teams und externen, privaten Pentester übersehen hatten. Mithilfe von Sandbox-Escapes können andere Bugs zuverlässiger ausgenutzt werden. James erhielt vom IE-Team selbst Prämien für alle vier Bugs sowie einen zusätzlichen Bonus von 5 000 Dollar aus meinem Prämienbudget. Zurückblickend hätte ich ihm wohl 50 000 Dollar geben sollen. Wow, nicht schlecht für jemanden, der sich vorher noch nie mit der Sicherheit von Webbrowsern beschäftigt hatte.

Nur einige Monate später stand ich vor einer Microsoft-Cafeteria und rief völlig atemlos James an einem stürmischen Herbsttag an, um ihm zu berichten, dass er gerade Geschichte geschrieben hatte. Ich konnte es gar nicht abwarten, ihm zu erzählen, dass sein Beitrag für eines der anderen Bug-Prämien-Programme von Microsoft – das Mitigation Bypass Bounty für 100 000 Dollar – akzeptiert worden war. James Forshaw hatte eine neuartige Möglichkeit gefunden, alle Plattform-Verteidigungslinien zu umgehen, indem er architektonische Sicherheitslücken des neuesten Betriebssystems ausnutzte. Er gewann damit die allererste 100 000-Dollar-Prämie von Microsoft.

Soweit ich mich erinnere, stellte er sich bei diesem Telefongespräch vor, wie ich ihm bei der Microsoft-internen BlueHat-Konferenz auf der Bühne einen witzigen, riesigen Scheck überreiche. Ich schickte nach dem Telefonat eine Notiz an die Marketingabteilung und im Handumdrehen wurde »James und der Riesenscheck« für immer Teil der Microsoft- und Internet-Geschichte.

image

Ich bin mir sicher, dass der Leser aus den folgenden Seiten einen Teil von James’ unvergleichlicher Brillanz mitnehmen kann – die gleiche Brillanz, die ich vor vielen Jahren in einem Bug-Report (oder vier) sah. Es gibt nur wenige Sicherheitsforscher, die Bugs in einer fortgeschrittenen Technologie finden können, und noch weniger, die sie durchgängig in mehr als einer finden. Und dann gibt es Menschen wie James Forshaw, die sich mit der Präzision eines Chirurgen auf tieferliegende architektonische Aspekte konzentrieren. Ich hoffe, dass die Leser dieses Buches (und aller Bücher, die James noch schreiben wird) es als Praxisleitfaden nutzen, um die gleiche Brillanz und Kreativität in ihrer eigenen Arbeit zu erzielen.

In einem Bug-Prämien-Meeting bei Microsoft, wo die Mitglieder des IE-Teams den Kopf schüttelten und sich fragten, wie sie einige von James gemeldeten Bugs hatten übersehen können, erklärte ich einfach: »James kann die Frau in Rot sehen sowie den Code, der sie in der Matrix gerendert hat.« Alle am Tisch akzeptierten diese Erklärung für den in James arbeitenden Geist. Er kann so ziemlich jeden Löffel verbiegen und wenn Sie seine Arbeit studieren (und einen offenen Geist haben), können Sie das vielleicht auch.

Für alle Bug-Jäger auf der Welt liegt hier die Messlatte und sie ist hoch. Und all den ungenannten Sicherheitsknechten auf der ganzen Welt wünsche ich, dass ihre Bug-Reports ebenso interessant und wertvoll sind wie die von James Forshaw.

Katie Moussouris
Gründerin und CEO, Luta Security
Oktober 2017

Danksagungen

Vielen Dank, dass Sie dieses Buch lesen. Ich hoffe, Sie finden es aufschlussreich und von praktischem Nutzen. Viele verschiedene Menschen haben dazu beigetragen, worüber ich dankbar bin.

Ich muss mit einem Dank an meine Frau Huayi beginnen, die dafür sorgte, dass ich beim Schreiben blieb, auch wenn ich es nicht wollte. Dank ihrer Unterstützung ist es in nur vier Jahren fertig geworden. Ohne sie hätte ich es vielleicht in zwei Jahren schaffen können, doch es hätte nicht so viel Spaß gemacht.

Natürlich wäre ich ohne meine wunderbaren Eltern heute nicht hier. Ihre Liebe und Unterstützung hat dazu geführt, dass ich ein weithin anerkannter Sicherheitsforscher und Autor bin. Als ich jung war, kauften sie für die Familie einen Computer – einen Atari 400 –, und sie waren es, die mein Interesse für Computer und die Softwareentwicklung geweckt haben. Ich kann ihnen nicht genug dafür danken, mir all diese Möglichkeiten gegeben zu haben.

Der große Kontrapunkt zu meinem Leben als Computer-Nerd war mein ältester Freund Sam Shearon. Er war immer der Selbstbewusstere und Kontaktfreudigere und darüber hinaus ein begnadeter Künstler, der mir eine andere Seite des Lebens zeigte.

Im Verlauf meiner Karriere gab es viele Kollegen und Freunde, die wesentlich zu meinen Erfolgen beigetragen haben. Unter ihnen muss ich Richard Neal hervorheben, einen guten Freund und manchmal Vorgesetzten, der mir die Gelegenheit gab, mich für Computersicherheit zu interessieren. Die erforderlichen Fähigkeiten kamen meiner Mentalität entgegen.

Ich darf auch Mike Jordon nicht vergessen, der mich überzeugte, für Context Information Security in Großbritannien zu arbeiten. Zusammen mit den Inhabern Alex Church und Mark Raeburn gab er mir die Zeit, eindrucksvolle Sicherheitsforschung zu betreiben, mein Wissen um die Analyse von Netzwerkprotokollen zu erweitern und Werkzeuge wie Canape zu entwickeln. Diese Erfahrung, reale und üblicherweise vollständig maßgeschneiderte Netzwerkprotokolle anzugreifen, bildet den größten Teil des Inhalts dieses Buches.

Ich muss Katie Moussouris danken, die mich überredet hat, am Microsoft Mitigation Bypass Bounty teilzunehmen, was mein Ansehen in der Welt der Informationssicherheit deutlich steigerte und mir für meine Mühen auch einen Scheck über 100 000 Dollar einbrachte.

Mein gestiegenes Ansehen war auch von Nutzen, als das Team für Google Project Zero – eine Gruppe weltweit führender Sicherheitsforscher mit dem Ziel, die Plattformen, von denen wir alle abhängig sind, sicherer zu machen – aufgebaut wurde. Will Harris erwähnte meinen Namen gegenüber Chris Evans, dem aktuellen Chef des Teams, der mich zu einem Interview einlud, und plötzlich war ich ein Googler. Mitglied eines solch exzellenten Teams zu sein macht mich stolz.

Zum Schluss muss ich Bill, Laurel und Liz von No Starch Press danken, die die Geduld hatten, mich dieses Buch fertig schreiben zu lassen, und mir Ratschläge gaben, wie ich es angehen sollte. Ich hoffe, dass sie – und die Leser – mit dem Ergebnis zufrieden sind.

Einführung

Bei ihrer Einführung stand die Technik, die es Geräten erlaubte, sich zu einem Netzwerk zu verbinden, nur großen Unternehmen und Regierungen zur Verfügung. Heutzutage tragen die meisten Menschen ein voll vernetztes Gerät mit sich herum und mit dem Aufkommen des Internets der Dinge (Internet of Things, IoT) können Sie Ihren Kühlschrank und die heimische Alarmanlage an diese vernetzte Welt anbinden. Die Sicherheit dieser vernetzten Geräte wird daher immer wichtiger. Möglicherweise kümmert es Sie nicht sonderlich, wenn jemand weiß, welchen Joghurt Sie kaufen, doch wenn Ihr Smartphone über das gleiche Netzwerk wie Ihr Kühlschrank kompromittiert wird, könnten all Ihre persönlichen und finanziellen Daten in die Hände böser Hacker gelangen.

Dieses Buch heißt Netzwerkprotokolle hacken, weil Sie sich in die Gedankenwelt eines Angreifers hineinversetzen müssen, um Sicherheitslücken bei einem vernetzten Gerät aufzuspüren. Netzwerkprotokolle kommunizieren mit anderen Geräten über ein (öffentliches) Netzwerk. Sie durchlaufen häufig nicht die Prüfungen wie die anderen Komponenten des Gerätes und sind daher ein nahe liegendes Angriffsziel.

Warum sollten Sie dieses Buch lesen?

Viele Bücher behandeln das Erfassen (Capturing) von Netzwerkverkehr für Diagnosezwecke und eine grundlegende Netzwerkanalyse, kümmern sich aber nicht um die Sicherheitsaspekte der abgefangenen Protokolle. Im Gegensatz dazu konzentriert sich dieses Buch darauf, Protokolle auf ihre Sicherheitslücken hin zu analysieren.

Dieses Buch richtet sich an alle, die Netzwerkprotokolle analysieren und angreifen wollen, aber nicht wissen, wo sie anfangen sollen. Die Kapitel vermitteln Ihnen Techniken zum Erfassen von Netzwerkverkehr, zur Analyse der Protokolle und zur Aufdeckung und dem Exploit von Sicherheitslücken. Das Buch bietet Hintergrundinformationen zur Vernetzung und zur Sicherheit von Netzwerken, aber auch praktische Beispiel für zu analysierende Protokolle.

Ob Sie nun Netzwerkprotokolle angreifen wollen, um Sicherheitslücken an den Hersteller einer Anwendung zu melden, oder ob Sie nur wissen wollen, wie Ihr neuestes IoT-Gerät kommuniziert, Sie werden verschiedene interessante Themen entdecken.

Was finden Sie in diesem Buch?

Dieses Buch umfasst eine Mischung aus theoretischen und praktischen Kapiteln. Für die praktischen Kapitel habe ich eine Netzwerkbibliothek namens Canape Core entwickelt und zur Verfügung gestellt, mit der Sie eigene Tools zur Protokollanalyse und für Exploits schreiben können. Ich stelle auch eine beispielhafte Netzwerkanwendung namens SuperFunkyChat bereit, die ein benutzerdefiniertes Chat-Protokoll implementiert. Während Sie der Diskussion in den Kapiteln folgen, können Sie die Beispielanwendung nutzen, um die Protokollanalyse zu erlernen und die Beispielprotokolle anzugreifen. Hier eine kurze Beschreibung der jeweiligen Kapitel:

Wie Sie dieses Buch nutzen

Wenn Sie Ihr Grundlagenwissen in Sachen Vernetzung auffrischen wollen, lesen Sie zuerst Kapitel 1. Wenn Sie mit den Grundlagen vertraut sind, können Sie mit den Kapiteln 2 und 3 weitermachen sowie in Kapitel 5 praktische Erfahrungen mit dem Aufzeichnen von Netzwerkverkehr und dem Analyseprozess sammeln.

Mit dem Wissen um die Grundlagen des Erfassens und der Analyse können Sie mit den Kapiteln 7 bis 10 weitermachen. Darin finden Sie praxisorientierte Hinweise, wie man Sicherheitslücken dieser Protokolle aufspürt und ausnutzt. Die Kapitel 4 und 6 enthalten weiterführende Informationen zu zusätzlichen Capturing-Techniken und dem Reverse Engineering von Anwendungen. Wenn Sie wollen, können Sie diese lesen, nachdem Sie die anderen Kapitel durchgelesen haben.

Für die praktischen Beispiele müssen Sie .NET Core (https://www.microsoft.com/net/core/) installieren. Das ist die plattformübergreifende Version der .NET-Runtime von Microsoft, die unter Windows, Linux und macOS läuft. Sie können Versionen von Canape Core über https://github.com/tyranid/CANAPE.Core/releases/ und SuperFunkyChat über https://github.com/tyranid/Example-ChatApplication/releases/ herunterladen. Beide nutzen .NET Core als Runtime. Links zu diesen Websites finden Sie in den Ressourcen zu diesem Buch auf https://www.dpunkt.de/netze_hacken.

Um die Canape-Core-Beispielskripten auszuführen, müssen Sie CANAPE.Cli nutzen, das im Releasepaket enthalten ist, das Sie aus dem Github-Repository zu Canape Core heruntergeladen haben. Führen Sie das Skript mit der folgenden Kommandozeile aus und ersetzen Sie dabei script.csx durch den Namen des Skripts, das Sie ausführen wollen.

dotnet exec CANAPE.Cli.dll script.csx

Alle Beispiel-Listings aus den praktischen Kapiteln sowie die Paket-Captures (erfassten Pakete) stehen auf der Webseite zu diesem Buch unter https://www.dpunkt.de/netze_hacken zur Verfügung. Bevor Sie anfangen, sollten Sie sich diese Beispiele herunterladen, damit Sie den praktischen Kapiteln folgen können, ohne eine große Menge Quellcode von Hand eingeben zu müssen.

Kontakt

Ich bin immer an positivem wie negativem Feedback zu meiner Arbeit interessiert und dieses Buch bildet da keine Ausnahme. Sie erreichen mich per E-Mail unter attacking.network.protocols@gmail.com.

Sie können mir auch auf Twitter unter @tiraniddo folgen oder meinen Blog unter https://tyranidslair.blogspot.com/ abonnieren, wo ich über meine neuesten Forschungen zur IT-Sicherheit schreibe.

Inhaltsverzeichnis

1Netzwerk-Grundlagen

1.1Netzwerkarchitekturen und -protokolle

1.2Die Internet-Protokoll-Suite

1.3Datenkapselung

1.3.1Header, Footer und Adressen

1.3.2Datenübertragung

1.4Netzwerk-Routing

1.5Mein Modell für die Analyse von Netzwerkprotokollen

1.6Am Ende dieses Kapitels

2Capturing von Anwendungsverkehr

2.1Passives Capturing von Netzwerkverkehr

2.2Eine kurze Einführung in Wireshark

2.3Alternative passive Capturing-Techniken

2.3.1Tracing von Systemaufrufen

2.3.2Das strace-Utility unter Linux

2.3.3Netzwerkverbindungen mit DTrace verfolgen

2.3.4Process Monitor unter Windows

2.4Vor- und Nachteile passiven Capturings

2.5Aktives Capturing von Netzwerkverkehr

2.6Netzwerk-Proxys

2.6.1Port-Forwarding-Proxy

2.6.2SOCKS-Proxy

2.6.3HTTP-Proxys

2.6.4Forwarding eines HTTP-Proxys

2.6.5HTTP-Reverse-Proxy

2.7Am Ende dieses Kapitels

3Strukturen von Netzwerk-Protokollen

3.1Binäre Protokollstrukturen

3.1.1Numerische Daten

3.1.2Boolesche Werte

3.1.3Bit-Flags

3.1.4Binäre Bytereihenfolge (Endianness)

3.1.5Text und menschenlesbare Daten

3.1.6Binärdaten variabler Länge

3.2Datum und Uhrzeit

3.2.1POSIX/Unix-Zeit

3.2.2Windows FILETIME

3.3TLV-Muster

3.4Multiplexing und Fragmentierung

3.5Netzwerk-Adressinformationen

3.6Strukturierte Binärformate

3.7Strukturen textbasierter Protokolle

3.7.1Numerische Daten

3.7.2Boolesche Werte in Textform

3.7.3Datum und Uhrzeit

3.7.4Daten variabler Länge

3.7.5Formate für strukturierten Text

3.8Codierung binärer Daten

3.8.1Hex-Codierung

3.8.2Base64

3.9Am Ende dieses Kapitels

4Fortgeschrittenes Capturing von Anwendungsverkehr

4.1Rerouting von Verkehr

4.1.1Traceroute nutzen

4.1.2Routing-Tabellen

4.2Konfiguration eines Routers

4.2.1Routing unter Windows aktivieren

4.2.2Routing unter *nix aktivieren

4.3Network Address Translation

4.3.1SNAT aktivieren

4.3.2SNAT unter Linux konfigurieren

4.3.3DNAT aktivieren

4.4Verkehr an ein Gateway weiterleiten

4.4.1DHCP-Spoofing

4.4.2ARP-Poisoning

4.5Am Ende dieses Kapitels

5Analyse auf der Datenleitung

5.1Die Verkehr produzierende Anwendung: SuperFunkyChat

5.1.1Den Server starten

5.1.2Clients starten

5.1.3Kommunikation zwischen Clients

5.2Ein Crashkurs zur Analyse mit Wireshark

5.2.1Netzwerkverkehr generieren und Pakete erfassen

5.2.2Grundlegende Analyse

5.2.3Inhalte einer TCP-Session lesen

5.3Die Paketstruktur mit Hex Dump identifizieren

5.3.1Einzelne Pakete betrachten

5.3.2Die Protokollstruktur ermitteln

5.3.3Unsere Annahmen überprüfen

5.3.4Das Protokoll mit Python sezieren

5.4Einen Wireshark-Dissector in Lua entwickeln

5.4.1Den Dissector entwickeln

5.4.2Sezieren mit Lua

5.4.3Parsen eines Nachrichtenpakets

5.5Einen Proxy zur aktiven Verkehrsanalyse nutzen

5.5.1Den Proxy einrichten

5.5.2Protokollanalyse mittels Proxy

5.5.3Grundlegendes Parsen von Protokollen hinzufügen

5.5.4Das Protokollverhalten ändern

5.6Am Ende dieses Kapitels

6Reverse Engineering einer Anwendung

6.1Compiler, Interpreter und Assembler

6.1.1Interpretierte Sprachen

6.1.2Kompilierte Sprachen

6.1.3Statisches und dynamisches Linking

6.2Die x86-Architektur

6.2.1Instruction Set Architecture

6.2.2CPU-Register

6.2.3Ablaufsteuerung

6.3Betriebssystem-Grundlagen

6.3.1Dateiformate für Executables

6.3.2Abschnitte

6.3.3Prozesse und Threads

6.3.4Netzwerkschnittstelle des Betriebssystems

6.3.5Application Binary Interface

6.4Statisches Reverse Engineering

6.4.1Kurzanleitung für die Nutzung der IDA Pro Free Edition

6.4.2Stackvariablen und Argumente analysieren

6.4.3Schlüsselfunktionalitäten identifizieren

6.5Dynamisches Reverse Engineering

6.5.1Breakpunkte setzen

6.5.2Debugger-Fenster

6.5.3Wo setzt man Breakpunkte?

6.6Reverse Engineering von Managed Code

6.6.1.NET-Anwendungen

6.6.2ILSpy nutzen

6.6.3Java-Anwendungen

6.6.4Mit Verschleierungstaktiken umgehen

6.7Reverse-Engineering-Ressourcen

6.8Am Ende dieses Kapitels

7Sicherheit von Netzwerkprotokollen

7.1Verschlüsselungsalgorithmen

7.1.1Substitutionschiffre

7.1.2XOR-Verschlüsselung

7.2Zufallszahlengeneratoren

7.3Symmetrische Verschlüsselung

7.3.1Blockchiffre

7.3.2Blockchiffre-Modi

7.3.3Blockchiffre-Padding

7.3.4Padding Oracle Attack

7.3.5Stromchiffre

7.4Asymmetrische Verschlüsselung

7.4.1RSA-Algorithmus

7.4.2RSA-Padding

7.4.3Schlüsselaustausch nach Diffie-Hellman

7.5Signaturalgorithmen

7.5.1Kryptografische Hash-Algorithmen

7.5.2Asymmetrische Signaturalgorithmen

7.5.3Message Authentication Codes

7.6Public-Key-Infrastruktur

7.6.1X.509-Zertifikate

7.6.2Verifikation einer Zertifikatskette

7.7Fallbeispiel: Transport Layer Security

7.7.1Der TLS-Handshake

7.7.2Initiale Aushandlungen

7.7.3Endpunkt-Authentifizierung

7.7.4Die Verschlüsselung aufbauen

7.7.5Sicherheitsanforderungen erfüllen

7.8Am Ende dieses Kapitels

8Implementierung des Netzwerkprotokolls

8.1Replay von erfasstem Netzwerkverkehr

8.1.1Verkehr mit Netcat erfassen

8.1.2Replay von UDP-Verkehr mittels Python

8.1.3Unseren Analyse-Proxy wiederverwenden

8.2Ausführbaren Code wiederverwenden

8.2.1Code in .NET-Anwendungen wiederverwenden

8.2.2Code in Java-Anwendungen wiederverwenden

8.2.3Unmanaged Executables

8.3Verschlüsselung und der Umgang mit TLS

8.3.1Die verwendete Verschlüsselung ermitteln

8.3.2TLS-Verkehr entschlüsseln

8.4Am Ende dieses Kapitels

9Die Hauptursachen für Sicherheitslücken

9.1Vulnerabilitätsklassen

9.1.1Remote Code Execution

9.1.2Denial-of-Service

9.1.3Offenlegung von Informationen

9.1.4Authentifizierung umgehen

9.1.5Autorisierung umgehen

9.2Verfälschung des Speichers

9.2.1Speichersichere und speicherunsichere Programmiersprachen

9.2.2Pufferüberlauf

9.2.3Out-of-Bounds-Indexierung

9.2.4Datenexpansion

9.2.5Fehler bei der dynamischen Speicherallozierung

9.3Voreingestellte oder festcodierte Anmeldedaten

9.4Offenlegung von Benutzernamen

9.5Fehlerhafter Zugriff auf Ressourcen

9.5.1Kanonisierung

9.5.2Fehlermeldungen mit zu viel Information

9.6Speicherüberlastung

9.7Massenspeicherüberlastung

9.8CPU-Überlastung

9.8.1Algorithmische Komplexität

9.8.2Konfigurierbare Kryptografie

9.9Formatstrings

9.10Befehlsinjektion

9.11SQL-Injektion

9.12Zeichenersetzung bei Textcodierung

9.13Am Ende dieses Kapitels

10Sicherheitslücken aufspüren und ausnutzen

10.1Fuzzing

10.1.1Der einfachste Fuzzing-Test

10.1.2Mutations-Fuzzer

10.1.3Testdatensätze generieren

10.2Sicherheitslücken untersuchen

10.2.1Debugging von Anwendungen

10.2.2Die Chancen erhöhen, um die Hauptursache für einen Absturz zu ermitteln

10.3Gängige Sicherheitslücken ausnutzen

10.3.1Exploit von Speicherlücken

10.3.2Willkürliche Schreiboperationen

10.4Shell-Code entwickeln

10.4.1Erste Schritte

10.4.2Einfache Debugging-Technik

10.4.3Systemaufrufe ausführen

10.4.4Andere Programme ausführen

10.4.5Shell-Code mit Metasploit generieren

10.5Maßnahmen gegen Speicherlücken

10.5.1Data Execution Prevention

10.5.2Return-Oriented Programming

10.5.3Address Space Layout Randomization (ASLR)

10.5.4Stacküberläufe durch Canaries erkennen

10.6Am Ende dieses Kapitels

Anhang

AToolkit für die Netzwerkprotokoll-Analyse

A.1Tools zum passiven Capturing und zur Analyse von Netzwerkprotokollen

A.1.1Microsoft Message Analyzer

A.1.2TCPDump und LibPCAP

A.1.3Wireshark

A.2Aktives Netzwerk-Capturing und Analyse

A.2.1Canape

A.2.2Canape Core

A.2.3Mallory

A.3Netzwerkkonnektivität und Protokolltests

A.3.1Hping

A.3.2Netcat

A.3.3Nmap

A.4Webanwendungen testen

A.4.1Burp Suite

A.4.2Zed Attack Proxy (ZAP)

A.4.3Mitmproxy

A.5Frameworks zum Fuzzing, zur Paketgenerierung und zur Entwicklung von Exploits

A.5.1American Fuzzy Lop (AFL)

A.5.2Kali Linux

A.5.3Metasploit-Framework

A.5.4Scapy

A.5.5Sulley

A.6Netzwerk-Spoofing und -Umleitung

A.6.1DNSMasq

A.6.2Ettercap

A.7Reverse Engineering von Executables

A.7.1Java Decompiler (JD)

A.7.2IDA Pro

A.7.3Hopper

A.7.4ILSpy

A.7.5.NET Reflector

Index

1

Netzwerk-Grundlagen

Um Netzwerkprotokolle angreifen zu können, müssen Sie die Grundlagen der Vernetzung von Computern kennen. Je besser Sie verstehen, wie gängige Netzwerke aufgebaut sind und funktionieren, desto einfacher können Sie dieses Wissen nutzen, um neue Protokolle zu erfassen, zu analysieren und auszunutzen.

Im Verlauf dieses Kapitels werde ich grundlegende Konzepte vorstellen, die Ihnen bei der Analyse von Netzwerkprotokollen tagtäglich begegnen. Außerdem schaffe ich auch die Voraussetzung für eine bestimmte Art des Denkens über Netzwerkprotokolle, die es einfacher macht, bisher unbekannte Sicherheitslücken während der Analyse zu entdecken.

1.1Netzwerkarchitekturen und -protokolle

Wir wollen zuerst einige grundlegende Netzwerkbegriffe besprechen und uns die fundamentale Frage stellen: Was ist ein Netzwerk? EinNetzwerk ist eine Gruppe von zwei oder mehr Computern, die miteinander verbunden sind, um Informationen zu teilen. Jedes mit dem Netzwerk verbundene Gerät wird gewöhnlich als Knoten (engl. Node) bezeichnet, um die Beschreibung auf eine größere Palette von Geräten anwenden zu können. Abbildung 1–1 zeigt ein sehr einfaches Beispiel.

image

Abb. 1–1Einfaches Netzwerk mit drei Knoten

Die Abbildung zeigt drei Knoten, die über ein gängiges Netzwerk miteinander verbunden sind. Jeder Knoten kann ein anderes Betriebssystem oder eine andere Hardware verwenden. Doch solange jeder Knoten einer Reihe von Regeln folgt, dem Netzwerkprotokoll, können sie mit jedem anderen Knoten des Netzwerks kommunizieren. Um sauber miteinander kommunizieren zu können, müssen alle Knoten im Netzwerk das gleiche Netzwerkprotokoll verstehen.

Ein Netzwerkprotokoll übernimmt viele Funktionen, dazu gehören eine oder mehrere der folgenden:

1.2Die Internet-Protokoll-Suite

TCP/IP ist der von modernen Netzwerken verwendete De-facto-Protokollstandard. Obwohl Sie sich TCP/IP als ein Protokoll vorstellen können, ist es tatsächlich die Kombination von zwei Protokollen: dem Transmission Control Protocol (TCP) und dem Internet Protocol (IP). Diese beiden Protokolle sind Teil der Internet Protocol Suite (IPS), eines konzeptionellen Modells, das angibt, wie Netzwerkprotokolle Daten über das Internet senden. Es teilt die Netzwerkkomunikation, wie in Abbildung 1–2 zu sehen, in vier Schichten (Layer) auf.

image

Abb. 1–2Schichten der Internet-Protokoll-Suite

Diese vier Schichten bilden einen Protokollstack. Die folgende Liste erläutert jede Schicht der IPS:

Jede Schicht interagiert nur mit der direkt über oder unter ihr liegenden Schicht, doch es muss auch externe Interaktionen mit dem Stack geben. Abbildung 1–2 zeigt zwei externe Verbindungen. Die Netzzugangsschicht interagiert mit einer physikalischen Netzwerkverbindung und überträgt Daten in ein physikalisches Medium wie Strom- oder Lichtimpulse. Die Anwendungsschicht interagiert mit der Anwendung: Eine Anwendung ist eine Sammlung zusammengehöriger Funktionalitäten, die dem Benutzer einen Dienst zur Verfügung stellen. Abbildung 1–3 zeigt beispielhaft eine Anwendung zur Verarbeitung von E-Mails. Der Dienst, der von der E-Mail-Anwendung angeboten wird, ist das Senden und Empfangen von Nachrichten über ein Netzwerk.

image

Abb. 1–3Beispielhafte E-Mail-Anwendung

Typischerweise umfassen Anwendungen die folgenden Komponenten:

Beachten Sie, dass der Benutzer, der mit der UI interagiert, kein Mensch sein muss. Es kann sich auch um eine andere Anwendung handeln, die das Senden und Empfangen von E-Mails (z. B. über ein Kommandozeilen-Tool) automatisiert.

1.3Datenkapselung

Jede Schicht der IPS baut auf der darunterliegenden Schicht auf und jede Schicht ist in der Lage, Daten der darüberliegenden Schicht zu kapseln, sodass sie zwischen den Schichten bewegt werden können. Die von jeder Schicht übertragenen Daten werden Protocol Data Unit (PDU) genannt.

1.3.1Header, Footer und Adressen

Die PDU jeder Schicht enthält die zu übertragenden Nutzdaten. Üblicherweise stellt man den Nutzdaten einen Header voran, der für die Übertragung der Nutzdaten benötigte Informationen enthält, wie z. B. die Adressen der Quell- und Zielknoten. Manchmal besitzt eine PDU auch einen Footer, der an die Nutzdaten angehängt wird und Werte enthält, die eine korrekte Übertragung sicherstellen, etwa Prüfsummen. Abbildung 1–4 zeigt, wie die PDUs der IPS ausgelegt sind.

image

Abb. 1–4IPS-Datenkapselung

Der TCP-Header enthält den Quell- und Zielport image. Diese Portnummern erlauben es einem einzelnen Knoten, mehrere Netzverbindungen aufzubauen. Die Portnummern für TCP (und UDP) reichen von 0 bis 65535. Die meisten Portnummern werden neuen Verbindungen nach Bedarf zugewiesen, doch einigen Nummern wurden bestimmte Dienste zugeordnet, wie etwa Port 80 für HTTP. (Eine aktuelle Liste der zugewiesenen Portnummern finden Sie bei den meisten unixoiden Betriebssystemen in der Datei /etc/services.) Die TCP-Nutzdaten und den Header nennt man üblicherweise ein Segment, während UDP-Nutzdaten und -Header als Datagramm bezeichnet werden.

Das IP-Protokoll verwendet eine Quell- und eine Zieladresse image. Die Zieladresse erlaubt das Senden der Daten an einen bestimmten Knoten im Netzwerk. Über die Quelladresse weiß der Empfänger, welcher Knoten ihm Daten gesendet hat, was es ihm ermöglicht, dem Sender zu antworten.

IPv4 verwendet 32-Bit-Adressen, die üblicherweise als vier durch Punkte getrennte Zahlen wie z. B. 192.168.10.1 dargestellt werden. IPv6 nutzt 128-Bit-Adressen, weil 32-Bit-Adressen für die Anzahl der Knoten in modernen Netzwerken nicht mehr ausreichen. IPv6-Adressen werden üblicherweise als durch Doppelpunkte getrennte Hexadezimalzahlen wie z. B. fe80:0000:0000:0000:897b:581e: 44b0:2057 geschrieben. Lange Folgen von 0000-Werten werden durch zwei Doppelpunkte ersetzt, d. h., die obige IPv6-Adresse kann auch als fe80::897b:581e: 44b0:2057 geschrieben werden. IP-Nutzdaten und -Header werden üblicherweise als Paket (packet) bezeichnet.

Ethernet enthält ebenfalls Quell- und Zieladressen image. Ethernet verwendet einen als MAC-Adresse (Media Access Control) bezeichneten 64-Bit-Wert, der normalerweise bei der Produktion des Ethernet-Adapters festgelegt wird. MAC-Adressen werden üblicherweise als Folge von durch Minuszeichen oder Doppelpunkte getrennten Hexadezimalzahlen wie 0A-00-27-00-00-0E dargestellt. Die Ethernet-Nutzdaten, zusammen mit dem Header und dem Footer, werden üblicherweise als Frame bezeichnet.

1.3.2 Datenübertragung

Sehen wir uns kurz an, wie beim IPS-Modell der Datenkapselung Daten von einem Knoten zum anderen übertragen werden. Abbildung 1–5 zeigt ein einfaches Ethernet-Netzwerk mit drei Knoten.

image

Abb. 1–5Einfaches Ethernet-Netzwerk

In diesem Beispiel möchte der Knoten image mit der IP-Adresse 192.1.1.101 Daten per IP-Protokoll an den Knoten image mit der IP-Adresse 192.1.1.50 senden. (Der Switch image leitet Ethernet-Frames zwischen allen Netzwerkknoten weiter. (Der Switch benötigt keine IP-Adresse, da er nur auf der Netzzugangsschicht arbeitet.) Wenn Daten zwischen den beiden Knoten gesendet werden sollen, passiert Folgendes:

  1. 1. Der Netzwerkstack des Betriebssystems image kapselt die Daten der Anwendungsund der Transportschicht und erzeugt ein IP-Paket mit der Quelladresse 192.1.1.101 und der Zieladresse 192.1.1.50.
  2. 2. An diesem Punkt kann das Betriebssystem die IP-Daten in einem Ethernet-Frame kapseln, kennt möglicherweise aber nicht die MAC-Adresse des Zielknotens. Es kann die MAC-Adresse für eine bestimmte IP-Adresse über das Address Resolution Protocol (ARP) anfordern, das einen Request an alle Knoten im Netzwerk sendet, um die MAC-Adresse für die IP-Adresse des Ziels zu ermitteln.
  3. 3. Sobald der Knoten an image die ARP-Antwort erhält, kann er den Frame erzeugen, wobei die Quelladresse mit der lokalen MAC-Adresse 00-11-22-33-44-55 und die Zieladresse mit 66-77-88-99-AA-BB angegeben wird. Der neue Frame wird in das Netzwerk übertragen und vom Switch image empfangen.
  4. 4. Der Switch leitet den Frame an den Zielknoten weiter, der das IP-Paket entpackt und prüft, ob die Ziel-IP-Adresse stimmt. Dann werden die IP-Nutzdaten entpackt und im Stack weitergeleitet, um von der wartenden Anwendung empfangen zu werden.

1.4Netzwerk-Routing

geroutedAbb. 1–6