Dieses Praktikum ist eine Einführung in eines der wichtigsten Werkzeuge im Netzwerkbereich zur Analyse von Protokollen, Paketen und Vorgängen im Netz: Wireshark. Wireshark wird uns im Laufe der Vorlesung begleiten, daher ist es wichtig sich gleich am Anfang mit diesem Werkzeug vertraut zu machen.

Mit Wireshark kann man Paketen live zuschauen, wie diese bei einer Netzwerkschnittstelle ankommen und versendet werden. Dies ist nützlich bei der Analyse des Netzwerks aber auch beim Entwickeln und Debuggen von Netzwerkanwendung und vieles mehr. Wireshark ist hier sowas wie ein Industriestandard und wird auch im professionellen Umfeld häufig eingesetzt. Des Weiteren werden wir in diesem Praktikum HTTP besser kennenlernen, eines der wohl wichtigsten Protokolle der Anwendungsschicht. Gerade weil HTTP so zentral ist, ist es wichtig sich damit gut auszukennen und damit ist HTTP auch ein guter Anwendungsfall für die Einführung in Wireshark.

Wireshark selbst ist eine Anwendung, die auf allen gängigen Betriebssystemen lauffähig ist. Für dieses Praktikum kann/sollte Wireshark auf dem eigenen Rechner installiert werden, denn es kann im Laufe der Vorlesung auch als praktische Lernhilfe verwendet werden, denn man kann damit jederzeit Paketverläufe nachvollziehen, Steuerinformationen in den Paketköpfen anschauen und so ein besseres Gespür für das Erlernte entwickeln und dieses verfestigen.

Download Wireshark

Der Startbildschirm

Wireshark ist ein relativ vielseitiges Werkzeug von dem wir in diesem Praktikum nur die absoluten Grundlagen behandeln. Aber selbst nur mit diesen Grundlagen ausgestattet, kann man komplexe Fragestellungen mithilfe von Wireshark beantworten. Nachdem Wireshark gestartet wurde, sollte folgender Startbildschirm erscheinen (je nach Plattform gibt es evtl. leichte Unterschiede):

Wireshark Startbildschirm

Die in der Abbildung nummerierten Boxen zeigen:

  1. Im zentralen Feld der Oberfläche sieht man eine Aufzählung der auf dem Rechner befindlichen Schnittstellen. Dabei zeigt rechts neben dem Namen ein kleiner, fortlaufender Graph Aktivität auf der Netzwerkschnittstelle an. In der Abbildung sieht man z.B., dass die WiFi-Schnittstelle en0 ganz oben Aktivität aufzeigt, d.h. es werden Pakete empfangen/gesendet. Die Schnittstelle gleich darunter zeigt z.B. keinerlei Aktivität. Ein Doppelklick auf eine dieser Schnittstellen würde die Paketaufzeichnung auf eben dieser starten.
  2. Der Haiflossen-Button startet ebenfalls die Aufzeichnung auf der in 1. ausgewählten Schnittstelle.
  3. Diese Schaltfläche führt zu weiteren Einstellungen. Von hier aus kann man ebenfalls eine Schnittstelle auswählen und die Aufzeichnung starten. Man kann aber auch andere Dinge tun, wie z.B. einen Dateinamen angeben in dem die Aufzeichnung gespeichert werden soll oder das Verhalten von Wireshark während der Aufzeichnung einstellen.
  4. Wie schon erwähnt kann man die Aufzeichnungen von Wireshark auch abspeichern. Über diese Schaltfläche kann man eine solche Datei öffnen, anstelle live von einer Netzwerkschnittstelle zu lesen.
  5. Hier werden verschiedene Quellen angezeigt, die Hilfe bereitstellen. Beim anklicken öffnen sich diese im Browser.
  6. Der Vollständigkeit halber sei gesagt, dass Wireshark alles aufzeichnet, was an Paketen ankommt und versendet wird. Das kann sehr viel sein und oft sind ein Großteil der Pakete uninteressant. Man kann Wireshark aber auch mit einem Capture-Filter dazu bringen nur die Pakete aufzuzeichnen, an denen man wirklich interessiert ist. Diese nutzen wir hier nicht, weil wir dafür später sogenannte Display-Filter verwenden. Damit werden auch nur die Pakete angezeigt, die wir sehen wollen, aber dennoch werden alle Pakete aufgezeichnet. Sollte man feststellen, dass man vielleicht doch noch etwas anderes sehen möchte ist dies dann immer noch möglich. Die Syntax von Capture-Filtern und die von Display-Filtern sind grundsätzlich unterschiedlich und inkompatibel.

Paketaufzeichnung

Starten Sie die Paketaufzeichnung auf ihrer Hauptnetzwerkschnittstelle (wahrscheinlich die, die die meiste Aktivität zeigt). Die Oberfläche sollte sich ändern und Sie sollten in etwa dies hier sehen:

Wireshark Capture-Bildschirm

Die in der Abbildung nummerierten Boxen zeigen:

  1. Kontrollelemente um die Aufzeichnung zu starten, zu stoppen und neu zu starten.
  2. Die Display-Filter-Zeile. Hier können Display-Filter eingegeben werden, die aus der Flut der Pakete nur noch die anzeigt, die auf den Filterausdruck passen (mehr dazu später). Dies ist die wohl wichtigste Einstellmöglichkeit von Wireshark und das primäre Augenmerk dieses Praktikums. Um sinnvolle Filterausdrücke schreiben zu können, muss man sich aber mit den jeweiligen Protokollen und wie ein Paket aufgebaut ist ein wenig auskennen. Ein Glück, dass es in dieser Vorlesung primär um Protokolle des Internets geht.
  3. In dieser Liste werden die eingehenden und ausgehenden Pakete dargestellt. Jede Zeile entspricht dabei einem Paket. In der Standardeinstellung werden die Pakete chronologisch sortiert, aber die Ansicht lässt sich auch nach den anderen Spalten sortieren, indem man die jeweilige Spaltenüberschrift anklickt. Spalten können auch entfernt, oder hinzugefügt werden und neue Spalten können definiert werden. Wir arbeiten aber mit den Standardeinstellungen. Hier sollte es Spalten geben für:
    • eine von Wireshark generierte, einfache, streng monoton steigende Rahmennummer,
    • die Empfangs- bzw. Sendezeit (ab Beginn der Aufzeichnung),
    • Quell- und Ziel-IP-Adresse,
    • das höchste im Paket identifizierte Protokoll,
    • die Länge des Pakets und
    • eine Infospalte, die die gängigsten Informationen zusammenfasst.
  4. Klickt man in der Paketliste (3) auf eines der Pakete, dann wird dieses hier im Detail dargestellt. Die im Paket befindlichen Steuerinformationen der Protokolle werden hier - sortiert nach Protokoll - visuell aufbereitet und strukturiert dargestellt. Wer genau hinschaut erkennt den behandelten Protokollstapel, allerdings in umgekehrter Reihenfolge. Bei vielen Protokollen ist hier auch die Antwort bzw. Anfrage verlinkt, d.h. man kann dem Link durch klicken folgen und bekommt diese angezeigt.
  5. Wer die Paketdaten lieber so sieht, wie sie tatsächlich versendet wurden, der findet das Paket als Hexdump hier. Klickt man in der Paketdetailansicht (4) auf ein Feld, dann wird es hier auch hervorgehoben. Hier im Beispiel wurde das TTL-Feld des IPv4-Protokoll-Headers angeklickt und der Hexwert (0x40) wird hier hervorgehoben. Rechts neben der Hex-Ansicht wird das Paket auch in ASCII dekodiert. Bei vielen Paketdaten stehen hier nicht druckbare Symbole (durch Punkte dargestellt). So kann man aber leicht erkennen, ob ASCII-Text im Paket vorkommt, was bei vielen Protokollen der Anwendungsschicht z.B. der Fall ist.
  6. Die Statuszeile wird oft übersehen, aber in Ihr befinden sich viele wertvolle Informationen. So wird z.B. links angezeigt wie große das aktuell ausgewählte Protokollfeld ist (hier das ein Byte große TTL-Feld) und mit welchem Display-Filterausdruck man dieses Feld referenzieren kann (hier: ip.ttl). Auch rechts stehen interessante Informationen. Hier wird angezeigt wieviele Pakete aufgezeichnet wurden und wieviele davon angezeigt werden. Das ist in diesem Fall identisch, da noch kein Display-Filter gesetzt wurde.

Display-Filterausdrücke

Wie schon erwähnt reduzieren Display-Filter die angezeigten Pakete in der Paketliste auf die Pakete, die auf den Filterausdruck passen. Der wahrscheinlich einfachste Audruck ist ein Protokollname. Protokollnamen werden dabei klein geschrieben, also z.B. dns und nicht DNS oder ip und nicht IP! Es werden dann nur noch Pakete angezeigt, die zu diesem Protokoll passen.

Wireshark Protokoll-Display-Filter

Im der Abbildung oben sieht man was passiert, wenn ein Filter angewendet wird. Hier wurde der eben erwähnte dns Protokollfilter genutzt. Dabei fallen folgende Dinge auf:

Nach Protokollen filtern zu können ist schon sehr hilfreich, aber wäre es natürlich wünschenswert, wenn man nach mehr als nur dem Protokoll filtern könnte, z.B. nach bestimmten Protokolleigenschaften und Header-Werten. Mit Wireshark ist dies möglich. Eigenschaften bzw. Header-Felder eines Protokolls werden mit einem Punkt vom Protokoll getrennt im Filterausdruck angegeben. Dies hatten wir oben schon mit ip.ttl gesehen. Nur ip.ttl als Ausdruck zu nutzen wäre aber wenig sinnvoll, denn damit werden alle IP-Pakete, die ein TTL-Feld enthalten angezeigt und das sind alle IP-Pakete. Was man möchte, ist auf den Wert von gewissen Feldern filtern. Hier kommen logische Ausdrücke und Vergleichsoperatoren zum Einsatz. Vergleichsoperatoren haben eine Variante, welche der Englischen Sprache entstammen und eine Variante, die an C-Syntax erinnert. Man kann nach belieben zwischen diesen Varianten wählen.

Vergleichsoperatoren

Englisch

C-Syntax

Beschreibung

Beispiel

eq

==

Gleich

ip.src==10.0.0.5

ne

!=

Ungleich

ip.src!=10.0.0.5

gt

>

Größer als

frame.len > 10

lt

<

Kleiner als

frame.len < 128

ge

>=

Größer oder gleich

frame.len ge 0x100

le

<=

Kleiner oder gleich

frame.len <= 0x20

contains

Protokoll oder Protokollfeld beinhaltet eine Wert

sip.To contains "a1762"

matches

~

Protokoll oder Text matched eine Perl-kompatible Regex

http.host matches "acme.(org|com|net)"

bitwise_and

&

Bitweise Und-Verknüpfung

tcp.flags & 0x02

Die meisten der oben angegeben Vergleichsoperatoren bedürfen wahrscheinlich keiner großen Erklärung. Als Vergleichswerte gibt es (signed) Integer (auch als Octal- oder Hexadezimalzahl (0123, 0xA3F)), True und False sind als 1 und 0 kodiert (hilfreich um zu überprüfen, ob Protokoll-Flags gesetzt sind, z.B. tcp.flags.syn == 1), Ethernet-Adressen (z.B. FF:FF:FF:FF:FF:FF, die Ethernet-Broadcast-Adresse), IP-Adressen (z.B. 192.168.0.1 (v4) oder ::1 (v6)) und Strings (z.B. "User-Agent"). Zu den IP-Adressen sollte nicht unerwähnt bleiben, dass auch IP-Präfixe (Adressbereiche) in CIDR-Notation angegeben werden können (z.B. 192.168.0.0/16). Vieles davon wird aber in diesem Praktikum noch nicht benötigt.

Auch wenn Vergleichsoperatoren schon viel genauere Ausdrücke erlauben als es ein einfacher Protokollfilert zulässt, ist es auch nur mit hilfe dieser Ausdrücke unmögliche komplexe Filterausdrücke zu schreiben. So kann man z.B. nicht alle TCP Pakete anzeigen lassen, die von einer bestimmten IP Adresse aus gesendet wurden. Dazu braucht man zusätzlich logische Operatoren um Vergleichsoperationen zu verknüfen. Die folgende Tabelle zeigt die in Wiresharks Filtersprache enthaltenen logischen Operatoren. Auch hier kann man wieder zwischen der Englischen under C-artigen Variante frei wählen und kombinieren.

Englisch

C-Syntax

Beschreibung

Beispiel

and

&&

logische Und-Verknüpfung

ip.src==10.0.0.5 and tcp.flags.fin

or

||

logische Oder-Verknüpfung

ip.scr==10.0.0.5 or ip.src==192.1.1.1

xor

^^

logisches Entweder-Oder

tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29

not

!

logische Negation

not llc

[...​]

Untersequenz

Details in der offiziellen Dokumentation

in

Auf Vorhandensein in einem Set prüfen

http.request.method in {"HEAD" "GET"}

Bewaffnet mit Vergleichsoperatoren und logischen Operatoren kann man sehr komplexe Filterausdrücke schreiben um wirklich nur noch die Pakete angezeigt zu bekommen, die man sehen möchte.

Es gibt zusätzlich noch einen kleinen Satz an Funktionen, die man auf Protokollfelder anwenden kann, so z.B. Text in Zahlen umwandeln, oder Groß- in Kleinschreibung umwandeln und umgekehrt. Für Details wird hier aber auf die offizielle Dokumentation verwiesen.

Ganz zum Schluss noch ein paar Worte zu den letzten beiden Zeilen in der Tabelle der logischen Operatoren: den Untersequenzen und der Prüfung auf Vorhandensein in einem Set. Diese werden wir kaum nutzen, sind aber der Vollständigkeit halber hier aufgeführt. Es gibt auch hier eine Reihe an Syntax-Varianten. Für die komplette Liste und Beschreibung wird an dieser Stelle aber auf die offizielle Dokumentation verwiesen.

Filterausdrücke generieren

Mit dem Wissen aus dem vorherigen Abschnitt sollte man jetzt in der Lage sein händisch in der Display-Filterzeile Filterausdrücke zu formulieren. Dazu muss man sich natürlich mit den zu untersuchenden Protokollen auskennen. Ohne dieses Wissen lassen sich keine sinnvollen Audrücke erstellen. Zusätzlich muss man auch die Namen der Protokollfelder in Wireshark kennen, die nicht immer 1:1 dem Namen entsprechen, den der Protokollstandard verwendet. Auswendig muss das aber keiner lernen, denn Wireshark hat diverse Möglichkeiten beim Bauen eines Filterausdrucks zu helfen.

Fangen wir mit der Display-Filterzeile selbst an. Wer hier anfängt zu tippen bekommt Hilfe durch ein Kontextmenü. Gibt man z.B. nur ein h ein, öffnet sich eine Liste aller Protokolle, die mit h beginnen. Tippt man fleissig weiter und beendet mit z.B. http, dann kann man durch einen Punkt die Protokolleigenschaften vom http-Filter im Kontextmenü einsehen. Auch alte Filterausdrücke, die man schon einmal verwendet hat werden im Kontextmenü angezeigt (siehe Abbildung unten, das Kontextmenü ist rot eingerahmt).

Wireshark Filter-Kontextmenü

Man sieht im Kontextmenü auch, dass ein Protokollfeld evtl. weitere, untergeordnete Informationen enthält. So kann bei http zum Beispiel auf Antworten gefiltert werden mit http.response. Dort kann dann wiederum der response code als Ausdruck gefunden werden mit http.response.code.

Eine andere Art einen Filterausdruck zu erstellen findet man, wenn man in der Filterzeile rechtsklickt und Display Filter Expression wählt (oder über Analyze im Hauptmenü). Hier öffnet sich ein selbsterklärender Dialog den man nutzen kann um einen Ausdruck zu generieren.

Wireshark Filter-Dialog

Der Dialog ist etwas umständlicher zu benutzten als die Filterzeile selbst, aber man kann hier wunderbar durch die Protokolle navigieren. Wer sich mit Filtern nicht so gut ausgekennt ist hier vielleicht besser aufgehoben.

Letztlich kann man auch aus den Paketdaten heraus Filter generieren. Wenn man in der Paketliste oder in der Paketdetailansicht auf ein Protokollfeld rechtsklickt, und in dem erscheinenden Menü Apply as Filter oder Prepare as Filter auswählt, dann kann man so aus den Paketdaten heraus schnell Filter generieren. Das hat den praktischen Vorteil, dass sich so keine Typos einschleichen, allerdings muss man auch schon ein Paket gefunden haben, dass einen interessiert. Der Filter, der generiert wird ist leicht ausgegraut im Menü zu sehen.

Pakete markieren

Manchmal ist es interessant, wie lange Anfrage und Antwort auseinanderliegen. Die in Wireshark angezeigten Zeiten sind Zeitstempel, die die Zeit seit dem Start der Aufzeichung angeben. Wenn man die Pakete zwischen denen man die Zeit ermitteln möchte gefunden hat, dann kann man beide Werte voneinander abziehen, um die Zeit, die zwischen diesen beiden Pakete vergangen ist zu berechnen. Das ist allerdings recht umständlich und Wireshark bietet eine einfachere Methode an. Wenn Sie in der Paketliste via Rechtsklick das Kontextmenü öffen, werden Ihnen ein paar hilfreiche Funktionen angeboten. Eine davon ist setzen und löschen der Zeitreferenz (siehe Abbildung unten). Man kann bei beliebigen Paketen zeitlich wieder bei 0 anfangen. D.h. wenn man bei einer Anfrage die Zeitreferenz wieder auf 0 setzt, dann kann man die Zeit, die vergangen ist einfach bei der Antwort ablesen. Auch kann man Pakete markieren. Diese sind dann farblich hervorgehoben und sie verschwinden auch nicht, wenn ein Filter gesetzt wird, auf den das markierte Paket nicht passt. Indem man Pakete ignoriert, kann man diese auch "ausblenden". Die Pakete sind zwar noch dargestellt, aber die Paketdetails werden ausgeblendet. Auch werden diese Pakete bei Filtern nicht mehr angezeigt, auch, wenn der Filter greifen würde. Mehrere Pakete kann man übrigens auf einmal ignorieren oder markieren. Das gilt aber nur für alle aktuell angzeigten und geschieht über das Edit-Menü im Hauptmenü. Filter auf markierten Paketen erfolgt mit frame.marked == 1.

Wireshark Paketmarkierung

Erweiterte Statistiken

Wireshark kann Vieles, aber gewisse Dinge sind durch Filterausdrücke nicht zu erreichen, denn die Filtern reduzieren die Anzahl an angezeigten Pakten, aber man kann z.B. keine besonderen Statistiken durch Filter auf den noch verbleibenden Paketen ausführen. Man kann sich z.B. alle HTTP-Antworten anzeigen lassen, aber nicht die Anzahl an verschiedenen darin befindlichen Status-Codes zählen lassen, denn die Antwort wäre eine Zahl und nicht eine Liste an Paketen. Für einige Protokolle gibt es solche erweiterte Statistiken, die mit Display-Filtern nicht generiert werden können. Diese befinden sich im Hauptmenü unter Statistics. Für HTTP und HTTP2 z.B. werden erweiterte Statistiken angeboten. Schauen Sie mal rein!

Gotchas

Es gibt ein paar Fehler, die man insbesondere als Wireshark-Newbie macht.

Es gibt Filterausdrücke wie ip.addr oder tcp.port die für mehr als ein Feld in einem Protokoll stehen. ip.addr z.B. steht für die Sender-IP-Adresse und die Empfänger-IP-Adresse! D.h. ein Ausdruck wie dieser hier: ip.addr != 192.168.0.1 wird Pakete anzeigen, die 192.168.0.1 als Adresses beinhalten, denn die zweite Adresse in einem Paket wird eine andere sein. Wer z.B. nur die Sender-IP-Adresse ansprechen will sollte diesen Filter benutzen: ip.src != 192.168.0.1 Wer wirklich ausschliessen möchte, dass die IP-Adresse weder als Sender noch als Empfänger vorkommt könnte z.B. diesen Ausdruck verwenden: ! ( ip.addr == 192.168.0.1 )

Eine weitere mögliche Quelle der Verzweiflung ist, dass Paketinhalte manchmal vermeintlich nicht richtig dargestellt werden. So kann es z.B. passieren, das eine HTTP-Antwort komprimiert wird und man diese komprimierte Antwort ja nicht lesen kann, man bei HTTP aber lesbaren ASCII-Text erwartet. Wireshark bietet aber typischerweise alle Darstellungsweisen an, wenn Sie denn darstellbar sind. Das sieht man als Reiter in der Hex-Ansicht der Pakete wie in folgender Abbildung im unteren roten Kasten hervorgehoben.

Wireshark Paketdarstellungen

Was man hier auch gut sieht ist, dass die HTTP-Antwort so groß war, dass sie über viele TCP-Segmente verteilt gesendet werden musste (in der Detailpaketansicht sieht man, dass es insgesamt 35 Segemente waren). Das letzte dieser Segmente wird als HTTP-Paket dargestellt. Die darin befindlichen Daten sieht man, wenn man den ersten Reiter wählt. Wenn man alle 35 Segmente zusammengefügt, und damit die komplette HTTP-Nachricht sehen möchte, dann muss man den zweiten Reiter wählen. Dies wird in der Abbildung gezeigt und man sieht deutlich, dass kein ASCII-Text zu sehen ist. Der Grund ist, dass die Daten in der Antworte komprimiert wurden (der HTTP-Header übrigens nicht!). Wenn man die unkomprimierten Daten sehen möchte, dann muss man den letzten Reiter wählen.

Jetzt sollten Sie in der Lage sein...

Spielen Sie ein bisschen mit Wireshark herum, um die Bedienung und das erstellen von Display-Filtern zu üben. Bezgl. HTTP sei noch gesagt, je nachdem an welcher HTTP-Version man interessiert ist, gibt es zwei verschiedene Protokollfilter. Für die Versionen 1.x gibt es den Protokollausdruck http, für Version 2 wird http2 verwendet. Wie man beide Protokollversionen herausfiltert sollte für Sie kein Problem mehr darstellen. Beim testen zu Hause seien Sie gewarnt, es könnte sein, dass Sie relativ wenig sehen werden, aber das ist normal und wird im Praktikum korrigiert! www.example.com aber z.B. sollte funktionieren.

Viel Erfolg!

Kommen wir zur ersten Aufgabe. Heute dreht sich alles um HTTP 1.x. Laden Sie folgende Paketaufzeichnung heruntern und öffnen Sie diese in Wireshark. Mit Ihren neu erworbenen Fähigkeiten, beantworten Sie bitte folgende Fragen bezüglich der HTTP/1.x-Pakete in der Paketaufzeichnung. Diese Aufgabe dient dazu, dass Sie zum einen mit Wireshark warm werden, aber auch, um zu üben grundlegende Eigenschaften und Abläufe von HTTP mit Wireshark nachvollziehen zu können.

  1. Wieviele Objekte werden insgesamt angefordert (GET)? Hint
  2. Wie groß ist der HTTP-Header des größten HTTP-Requests? Was ist das größte Header-Feld darin? Hint
  3. Wieviele verschiedene Status-Codes werden in den HTTP Antworten insgesamt versandt? Hint
  4. Finden Sie den HTTP GET Request im Frame 929 im Packet-Trace. Wieviel Zeit ist vergangen zwischen dem Request und der Antwort, die die angefragte Seite auch wirklich enthält (auf 3 Nachkommastellen genau)? Hint
  5. Einer der gefundenen Status-Codes ist 304 (not modified). Finden Sie die Anfrage dazu und finden Sie heraus, wie alt das Objekt ist, das angefragt wurde. Woher kommt dieser Wert ursprünglich? Hint
  6. In wievielen Anfragen werden Cookies versandt? Versuchen Sie die Syntax von Cookies herauszufinden. Schauen Sie sich dazu auch an, wie die Cookies von den Servern gesetzt werden. Hint
  7. Gibt es Requests mit einem Referer-Feld? Was bedeutet dieser wohl? Finden Sie eine Anfrage an den Host, der im Referer genannt wird? Hint

Zum Schluss vielleicht doch noch ein paar HTTP2 Fingerübungen. In HTTP2 ist ja alles ein wenig anders. Am interessantesten für uns sind aber die Header-Informationen, die im HEADERS-Frame zu finden sind. Insgesamt sind in HTTP2 die Filter nach Frames sortiert. Probieren Sie mal folgendes:

  1. Wieviele Objekte werden über HTTP2 angefordert (GET)? Hint
  2. Werden auch hier Cookies verwendet? Schauen Sie wie die Cookies kodiert werden und wie groß diese wirklich sind. Schauen Sie auch, ob die Cookies die angezeigt werden, auch wirklich immer im Paket sind (in der Hexansicht des Pakets). Hint

HTTP lässt sich heutzutage nicht mehr so einfach aufzeichnen. Warum und wie man es dann doch wieder schafft lernen Sie jetzt. Auch schauen wir uns ein Browser-Feature an, dass Web-Developer häufig einsetzen.

Beginnen Sie Pakete von Ihrer Hauptnetzwerkschnittstelle aufzuzeichnen. Besuchen Sie mit dem Chrome Browser die Webseite der Hochschule (www.hs-augsburg.de). Wenn Sie fertig sind, stoppen Sie die Aufzeichnung mit Wireshark und versuchen Sie Anfragen an den Spiegel zu finden. Wundern Sie sich nicht, wenn sie nicht fündig werden! (Hinweis: wenn sie etwas finden, dann sollte das maximal eine Weiterleitung sein)

Der Grund warum Sie nichts gefunden haben ist, dass viele Webseiten Ihre Daten mittlerweile verschlüsseln. Heißt das, Wireshark kann nicht mehr genutzt werden? Nicht ganz. Man muss Wireshark nur mitteilen, wo die Sitzungsschlüssel liegen. Die großen Browser (Firefox und Chrome) z.B. können diese loggen und Wireshark kann diese dann lesen. Auch Python Developer z.B. können dieses Feature nutzen, um den Netzwerkverkehr ihrer Anwendungen zu debuggen. Dazu muss man die Umgebungsvariable SSLKEYLOGFILE setzen und Firefox neu starten. Dabei geht man wie folgt vor:

  1. Schließen Sie alle Fenster von Firefox!!! (wirklich alle, sonst funktioniert es nicht)
  2. Öffnen Sie eine Shell und setzen Sie die Umgebungsvariable mit:
export SSLKEYLOGFILE=/home/student/keylog.log
  1. Öffnen Sie Firefox in der gleichen Shell mit:
firefox &
  1. In Wireshark, geben Sie den Pfad zum Logfile unter Bearbeiten/Einstellungen/Protocols/TLS (in älteren Versionen von Wireshark könnte letzteres auch noch SSL heißen) in der Eingabemaske unter (Pre)-Master-Secret Log filename ein.
  2. Jetzt browsen Sie doch bitte in Firefox zu www.hs-augsburg.de, Sie sollten wie gewohnt HTTP und/oder HTTP2 in Wireshark sehen.

Vielleicht haben Sie schon mal gesehen, dass Brower Private Windows oder Incognito Windows anbieten. Aber was passiert eigentlich, wenn solche Fenster benutzt werden? Das können Sie ja jetzt einfach herausfinden.

  1. Jetzt, wo sie entschlüsseln können, gehen Sie doch nochmal zu www.spiegel.de. Besuchen Sie bitte einen Artikel beim Spiegel, um sicher zu gehen, dass auch ein Cookie gesetzt wird, sollte noch keiner vorhanden sein. Exportieren Sie den ersten HTTP-Request mit Cookie an den Spiegel als pcapng-Datei auf die Festplatte, aber nur diesen. (Klicken Sie auf das zu exportierende Paket. Dann unter File/Export Specified Packets, dort selected packets only wählen und abspeichern)
  2. Öffnen Sie ein Private Window in Firefox (in der Instanz, in der Sie entschlüsseln können) und starten sie das Aufzeichnen mit Wireshark erneut. Besuchen Sie die Webseite des Spiegels nochmal, diesmal aber im Private Window. Finden Sie die erste Anfrage an den Spiegel und speichern Sie diesen. Schliessen Sie die Aufzeichung, öffnen Sie eine Datei und dann über das Menü File/Merge die andere Datei in die Paketaufzeichnung einfügen. Wie unterscheiden Sie die beiden Anfragen?

Der Browser übernimmt viel Arbeit, allerdings kann man die Arbeit des Browsers selbst übernehmen, denn HTTP, wie viele andere Protokolle auch, ist ein US ASCII codiertes Protokoll. Gehen Sie in die Shell und verbinden Sie sich mit dem Hochschul-Webserver via telnet:

  1. In der Shell:
telnet www.hs-augsburg.de 80
  1. Sie sind jetzt mit dem Webserver verbunden. Nun können Sie den HTTP Paketkopf eingeben. Probieren Sie es! Sie werden feststellen, dass der Webserver Sie an die sichere Seite unter HTTPS://... weiterleiten möchte. Leider können wir als Mensch die Verschlüsselung nicht händisch bewerkstelligen. Daher brauchen wir nun ein anderes Tool: gnutls-cli
  2. Verbinden Sie sich mit dem Webserver der Hochschule via gnutls-cli:
gnutls-cli www.hs-augsburg.de
  1. Laden Sie die Inhalte der Webseite mit gnutls-cli

In der Vorlesung haben wir ein paar, aber bei weitem nicht alle HTTP Paketkopffelder besprochen. Recherchieren Sie die Aufgabe der folgenden Felder:

Stellen Sie sicher, dass Sie die Funktion der Felder verstanden haben.

Mit dem Browser, den Sie für Ihr tägliches Browsen benutzen, vergleichen Sie mal, ob es Unterschiede gibt, wenn Sie gewisse Webseiten mit diesem Browser einmal ganz normal und einmal in Private Window besuchen. Hier ein paar Vorschläge:

  1. Verlgeichen Sie die Suchergebnisse auf google.com
  2. Vergleichen Sie die Produkte, die Ihnen auf E-Commerce-Seiten angeboten werden, die Sie nutzen (z.B. Amazon)

Probieren Sie mal das Private Window von Chrome aus. Schickt Chrome auch den DNT Header? Vermuten Sie mal, warum Chrome sich so verhält.

Ich würde mich über Ihre Kritik und Verbesserungsvorschläge freuen. Auch Lob, klar. Eine kurze Umfrage finden Sie hier.