HTTP2 und TLS

Click start to access the case study

HTTP2 und TLS

Öffnen Sie die Datei HTTPs-NYTimes.pcapng

  • Welche TCP Verbindungen verwenden HTTP/2?

Datei verkleinern

Es wird schnell auffallen, dass die Datei etwas länger zum Laden benötigt. Der Grund ist schnell ersichtlich, wenn man einen Blick in die Verbindungsstatistiken wirft. Ein Download, der über die gesamte Zeit geht, überträgt 184 MB.

Wir filtern auf die genannte Verbindung

Es stellt sich heraus, dass es sich um einen Cent OS ISO Download handelt

Da in der Aufgabenstellung klar gesagt wird, dass uns nur verschlüsselter Verkehr (und andere Protokolle, die Hinweise geben wie DNS) interessiert, können wir diesen Download herausfiltern, um uns das Leben einfacher zu machen. Dies geht zum Beispiel per Tshark

tshark -r .\HTTPs-NYTimes.pcapng -Y "!(ip.addr==192.168.1.140 && tcp.port==20520 && ip.addr==193.144.61.75 && tcp.port==80)
" -w .\HTTPs-NYTimes-filtered1.pcapng

Die resultierende Datei ist wesentlich handlicher

Welche Webseiten verwenden HTTP2?

Diese Frage lässt sich nur beantworten, indem man die Verbindungen entschlüsselt. Hierzu benutzen wir das HTTPs-NYTimes-sslkeylogfile.txt Keylog file.

Danach können wir auf HTTP2 filtern.

Es macht Sinn eine weitere Spalte für den Host Header, bei HTTP2 jetzt Authority Header hinzuzufügen (http2.headers.authority).

Es gibt jetzt mehrere Wege alle Domänen zu finden, die HTTP2 benutzen. Man könnte zum Beispiel die Paketliste als CSV exportieren.

Einfacher ist es auf der Kommandozeile mit Tshark (hier Powershell).

Falls Sie Ihre Pfad Variable nicht für Wireshark konfiguriert haben, geben Sie folgenden Befehl in jeder Powershell Session ein, damit nicht der absolute Pfad aufgerufen werden muss

$env:Path += ";C:\Program Files\Wireshark"

Zunächst injizieren wir das SSL Keylogfile in das PCAP. Dies macht es einfacher, da wird nicht mehr abhängig vom Wiresharkprofile und dessen Einstellungen sind.

editcap --inject-secrets tls,.\HTTPs-NYTimes-sslkeylogfile.txt .\HTTPs-NYTimes-filtered1.pcapng .\HTTPs-NYTimes-filtered1-w
-keys.pcapng

Danach extrahieren wir alle Hosts und deduplizieren diese.

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e http2.headers.authority -Y "http2.headers.authority" | sort -Unique

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e http2.headers.authority -Y "http2.headers.authority" | sort -Unique | measure

24 Hosts verwenden HTTP2.

Ohne sslkeylog file

Deaktivieren Sie das SSL Keylog File und öffnen Sie die Datei HTTPs-NYTimes-filtered1.pcapng

Wenn wir das SSL Keylog File deaktivieren, können wir versuchen, nur anhand des verschlüsselten TLS die http/2 Verbindungen zu finden. Wir fügen dazu die Spalten tcp.stream und tls.handshake.extensions_server_name hinzu. Dann filtern wir auf h2 im ALPN beim TLS Handshake.

Wie sehen nun sowohl Client Hello als auch Server Hello. Leider enthält nur das Client Hello ein SNI. Bei dem Server Hello ist dies immer leer. Wir können jedoch anhand der Stream ID das Client Hello mit dem Server Hello korrelieren. Das bedeutet, das wir nach tcp.stream sortieren und dann schauen welches Client Hello mit einem Server Hello beantwortet wird. Da wir bereits auf h2 gefiltert haben bedeutet dies, dass beide Seiten http/2 unterstützen und es ist davon auszugehen, dass dann HTTP/2 verwendet wird.

Bei TLS 1.3 werden mehr Teile des Handshakes verschlüsselt, so auch der ALPN Teil. Daher können wir hier nicht feststellen, ob der Server ALPN unterstützt, ohne die Pakete zu entschlüsseln.

Alle Server Hellos, bei denen der ALPN sichtbar ist sind TLS1.2 (hier haben wir vorher das SSL Keylogfile deaktiviert)

Im TLS Handshake sehen wir „Application Data“

Hier das gleiche im Decode

Diese verschlüsselte Application Data enthält die ALPN Extension und kann nur mit dem SSL Keylog File sichtbar gemacht werden. Hier das gleiche Paket entschlüsselt:

Mit sslkeylog file anhand des Handshakes

Wir können die Aufgabe also anhand des TLS Handshakes lösen. Hierzu verwenden wir wieder die Datei HTTPs-NYTimes-filtered1-w-keys.pcapng.

In Wireshark sehen wir welche Handshakes h2 unterstützen (wieder anhand des tcp.streams und der SNI), jetzt jedoch auch mit TLS1.3.

Mit Powershell kann man einen schönen Einzeiler schreiben, der alle Hosts raussucht, die http/2 verwenden, diesmal nur anhand des Handshakes.

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -Y '(tls.handshake.extensions_alpn_str == "h2")' -T fields -E separator=',' -e tcp.stream -e tls.handshake.extensions_server_name | ConvertFrom-Csv -Delimiter ',' -Header Stream,Domain | Group-Object Stream |  Where-Object Count -GT 1

Wieviele Bilder sind in der nytimes Seite per image Tag eingebunden?

Hierzu müssen wir die Indexseite der NYTimes entschlüsseln und speichern und im Texteditor nach dem HTLM Tag <img suchen. Leider unterstützt Wireshark bislang noch nicht den Export von http/2 Objekten. Daher müssen wir hier manuell vorgehen.

Die erste Verbindung zur NYTimes beginnt in Paket 236. Wir isolieren diese Verbindung. In Paket 320, sehen wir das GET Request nach dem Root (GET /).

Bei http können wir einfach nach http.response filtern (mit Reassembly), um das letzte Antwortpaket zu erhalten. Bei HTTP2 können wir dazu http2.body.reassembled.length benutzen

Der Frame 583 enthält die zusammengefügte Antwort.

Wählen Sie im Decode „Line-based text data: text/html“ aus. Achten Sie darauf, dass im Hexview im Reiter „Uncompressed entity body“ alles augewählt ist. Klicken Sie dann im „Datei“ Menü auf „Packetbytes exportieren…“

Speichern Sie die Packetbytes mit dem Namen „nytimes-index.html“. Jetzt können wir in der exportierten Datei nach dem entsprechenden Tag suchen

Es sind 6 Bilder per Image Tag eingebunden.

Welche Domänen können direkt NYtimes zugeschrieben werden?

Gemeint sind Webseite, CDN, nicht verlinkte externe Inhalte. Hierfür können wir DNS, TLS Header und http/2 header betrachten.

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "dns.qry.name" -Y "dns.qry.name" > dns.txt
tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "http.host" -Y "http.host" > http.txt
tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "http2.headers.authority" -Y "http2.headers.authority" > http2.txt
tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "tls.handshake.extensions_server_name" -Y "tls.handshake.extensions_server_name" > tls.txt

Danach können wir die Dateien manuell betrachten oder wieder Skripting bemühen.

Get-Content .\dns.txt, .\http.txt, .\http2.txt, .\tls.txt | Group-Object | Sort-Object Count | Select-Object Count,Name | Where-Object {$_.Name -notlike '*arpa*'} | Where-Object {$_.Name -like '*ny*'}

Zusätzlich können wir noch Reverse DNS Lookups machen (Achtung! Tshark geht hierfür auf das Netzwerk)

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "ip.src_host" -Y "ip.src_host"  -N nN

Dies gibt uns in diesem Fall nicht mehr Informationen, kann jedoch in anderen Fällen hilfreich sein:

tshark -r .\HTTPs-NYTimes-filtered1-w-keys.pcapng -T fields -e "ip.src_host" -Y "ip.src_host"  -N nN > .\reversedns.txt

Get-Content reversedns.txt,.\dns.txt, .\http.txt, .\http2.txt, .\tls.txt | Group-Object | Sort-Object Count | Select-Object Count,Name | Where-Object {$_.Name -notlike '*arpa*'} | Where-Object {$_.Name -like '*ny*'}