![SSL-Handshake-Aufzeichnung mit tcpdump](/image/original/333b4388-0d7c-11ef-8223-002590e76e7d.png)
SSL-Handshake-Aufzeichnung mit tcpdump
SSL ist das bei weitem häufigste Protokoll, das für die verschlüsselte Datenübertragung über TCP-Verbindungen verwendet wird. Während dieses Vorgangs müssen beide Parteien verschiedene Arten von Informationen austauschen, darunter öffentliche Schlüssel, Verschlüsselungsalgorithmen, Protokollversionen und viele andere.
Manchmal läuft der Austausch jedoch nicht so ab, wie er sollte, und es besteht die Notwendigkeit, Probleme zu erkennen und zu beheben. Eine gängige Methode dafür ist die Aufzeichnung des SSL-Handshakes mit tchpdump. Auf diese Weise können Sie detailliert analysieren, was bei der Datenübertragung vor sich geht, und Schritte zur Lösung der Probleme unternehmen.
Der tcpdump-Befehl im Ãœberblick
tcpdump ist ein leistungsfähiges Befehlszeilen-Tool für die Netzwerkanalyse, das zum Erfassen und Anzeigen der über eine Netzwerkschnittstelle gesendeten und empfangenen Pakete verwendet wird. Es ist auf den meisten Unix-ähnlichen Betriebssystemen verfügbar, einschließlich Linux und macOS. Wenn es Ihnen darum geht, den SSL-Handshake zu erfassen, sollten Sie wissen, dass das Tool allein riesige Datenmengen erfassen kann, die Sie nicht auf produktive Weise analysieren können. Aus diesem Grund müssen Sie eine Reihe von Filtern anwenden, die die Pakete herausfiltern, die direkt mit Ihrer Aufgabe zu tun haben. Zu den Filterkriterien gehören Quell- und Ziel-IP-Adressen, Portnummern und Protokolle.
Einführung in den SSL-Handshake
Der SSL-Handshake (Secure Sockets Layer) ist ein wesentlicher Bestandteil des SSL/TLS-Protokolls (Transport Layer Security), das weithin zur Sicherung der Kommunikation über Computernetze verwendet wird. Obwohl SSL weitgehend durch TLS abgelöst wurde, wird der Begriff "SSL-Handshake" immer noch häufig verwendet, um die anfängliche Verhandlungsphase einer TLS-Verbindung zu beschreiben.
Ein SSL-Handshake besteht aus einer Reihe von Nachrichten, die zwischen dem Client und dem Server ausgetauscht werden, und diese Nachrichten sind die Phasen des Aufbaus eines sicheren und verschlüsselten Kommunikationskanals. Schauen wir sie uns an.
- ClientHello: Der Handshake beginnt damit, dass der Client eine ClientHello-Nachricht an den Server sendet. Diese Nachricht besteht aus der SSL/TLS-Versionsnummer des Clients, einer Liste der unterstützten Cipher Suites (Algorithmen für Verschlüsselung, Schlüsselaustausch und Nachrichtenauthentifizierung), einer Liste der unterstützten Komprimierungsmethoden und möglicherweise einer Liste der unterstützten Erweiterungen.
- ServerHello: Als Antwort auf die vorhergehende Nachricht sendet der Server eine ServerHello-Nachricht an den Client, die die SSL/TLS-Versionsnummer des Servers, die aus der Liste des Clients ausgewählte Cipher-Suite und Kompressionsmethode sowie möglicherweise vom Server ausgewählte Erweiterungen enthält.
- Server-Zertifikat: Zur Authentifizierung sendet der Server sein Zertifikat an den Client, das den öffentlichen Schlüssel des Servers enthält, der später vom Client für den Schlüsselaustausch verwendet wird.
- Zertifikatsanforderung (optional): Für den Fall, dass der Server eine Authentifizierung von Seiten des Clients benötigt, wie bei Zwei-Wege-SSL, sendet der Server die Nachricht an den Client.
- Schlüsselaustausch: Der Client und der Server tauschen Schlüsselinformationen aus. Dies kann auf unterschiedliche Weise geschehen. Beispielsweise kann der Client ein Pre-Master-Geheimnis senden, das mit dem öffentlichen Schlüssel des Servers verschlüsselt ist (wie beim RSA-Schlüsselaustausch). Alternativ können Client und Server gemeinsam Schlüssel generieren (wie im Falle des Diffie-Hellman-Schlüsselaustauschs). Je nach gewählter Cipher Suite kann dieser Schritt variieren.
- Server Hallo Erledigt: Nachdem der Server das Senden von Nachrichten zur Unterstützung des Schlüsselaustauschs und der Serverauthentifizierung beendet hat, sendet er die Nachricht ServerHelloDone, um dies anzuzeigen.
- Client-Schlüsselaustausch: Als Antwort auf die vorherige Nachricht sendet der Client eine Schlüsselaustauschnachricht, einschließlich eines Pre-Master-Secret, das von der Schlüsselaustauschmethode abhängt.
- Zertifikat verifizieren (optional): Falls eine Client-Authentifizierung erforderlich ist, kann der Client eine digital signierte Zertifikatsüberprüfungsnachricht senden, die es dem Server ermöglicht, das Zertifikat des Clients zu überprüfen.
- Beendet: Schließlich tauschen sowohl der Client als auch der Server verschlüsselte "Finished"-Nachrichten aus, die bestätigen, dass der Schlüsselaustausch- und Authentifizierungsprozess erfolgreich war.
​Filterung von SSL-Handshake-Nachrichten in tcpdump
Da tcpdump Informationen auf Paketebene filtert und mit solchen Konstrukten wie SSL/TLS-Protokollen nicht direkt umgehen kann, müssen Sie Filter anwenden, die sich auf allgemeine Merkmale von Handshake-Paketen stützen, wie Portnummern und Packergrößen, um nur den Handshake-Prozess zu erfassen. Werfen wir einen Blick auf die Ansätze, die Sie für diese Aufgabe verwenden können.
- Filtern nach Port:
SSL/TLS-Handshakes erfolgen in der Regel über Port 443 für HTTPS, obwohl auch andere Ports, die zur Sicherung von Protokollen verwendet werden, beteiligt sein können. Um den gesamten Datenverkehr über den Standard-HTTPS-Port 443 zu erfassen, verwenden Sie insbesondere
tcpdump -i any 'port 443'
Denken Sie daran, dass damit der gesamte Verkehr auf dem Port erfasst wird und nicht nur die Handshake-Nachrichten.
- Erfassen des Beginns der Verbindung:
Da zu Beginn einer SSL/TLS-Verbindung ein Handshake stattfindet, kann die Aufzeichnung des anfänglichen Paketaustauschs dazu beitragen, die Handshake-Nachrichten zu identifizieren. Sie können zum Beispiel SYN- und SYN-ACK-Pakete aufzeichnen, um den Beginn von TCP-Verbindungen zu sehen, die vor dem SSL/TLS-Handshake stattfinden.
tcpdump -i any 'Port 443 und (tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn)'
- Längenfilter:
Da Handshake-Nachrichten, insbesondere ClientHello und ServerHello, in der Regel eine ausgeprägte Größenordnung aufweisen, kann diese Tatsache theoretisch genutzt werden, um Pakete auf der Grundlage ihrer TCP-Nutzlastgröße zu filtern. Da solche Variablen wie die Größe jedoch ein hohes Maß an Zufälligkeit aufweisen, ist diese Methode eher ungenau und unzuverlässig.
- Erfassen und Analysieren mit Wireshark:
Wireshark ist ein spezielles Tool, mit dem Sie den Verkehr, den Sie zuvor mit tcpdump aufgezeichnet haben, genauer analysieren können, indem Sie nach bestimmten Handshake-Nachrichten filtern. Erfassen Sie zunächst den Datenverkehr von einem bestimmten Port und schreiben Sie ihn in eine Datei:
tcpdump -i any 'port 443' -w capture_file.pcap
Öffnen Sie die capture_file.pcap Datei mit Wireshark und verwenden Sie dessen SSL/TLS-Filter, wie ssl.handshake.type zur weiteren Analyse.
TLS Version-Specific PackeIt Capture
Although most modern applications use TLSv1.3 protocol for message exchange. Nevertheless, to preserve compatibility with older versions, TLSv1.0, TLSv1.1, and TLSv1.2 are supported. Each version is assigned a numerical code:
SSLv3 – 0x300
TLSv1.0 – 0x0301
TLSv1.1 – 0x0302
TLSv1.2 – 0x0303
TLSv1.3 – 0x0304
Given that this information is contained in the 10th and 11th bytes of the data in the SSL handshake message, the following filter can be used:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x16) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+9] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+10] = 0x03)"
Application Data Packet Capture over TLS
Handshake messages are followed by application data, which also contain the TLS version in the 2nd and the 3rd data byte. To capture it:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x17) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+1] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+2] = 0x03)" -w appdata.pcap
This way we can capture packets inholding 17 in the 1st and 03 in the 2nd and 3rd bytes.
SSL Connection Failure Tracing
For filtering errors, you should check the 1st byte containing either 15 or 21, numbers corresponding to specific failures:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x15) || (tcp[((tcp[12] & 0xf0) >>2)] = 0x21)" -w error.pcap
Concluding Remarks
Using tcpdump for capturing SSL handshake is an efficient way of analyzing traffic and finding bugs and failures if anything goes wrong. In this article, we’ve faced some approaches that can help you filter the captured traffic in proper way to be able to detect any issues. We hope that this guide was helpful, take care!