Servernamenanzeige (SNI) vom TLS-Client hallo extrahieren

8

Wie würden Sie die Servernamenanzeige aus einer TLS-Client-Hello-Nachricht extrahieren? Ich habe derzeit Mühe, diese sehr kryptische RFC 3546 auf TLS Extensions, in welcher der SNI definiert ist.

Dinge, die ich bisher verstanden habe:

  • Der Host ist utf8 codiert und lesbar, wenn Sie den Puffer encfigen.
  • Es gibt ein Byte vor dem Host, das bestimmt die Länge.

Wenn ich die genaue Position dieses Längenbytes herausfinden könnte, wäre das Extrahieren des SNI ziemlich einfach. Aber wie komme ich überhaupt zu diesem Byte?

    
buschtoens 24.07.2013, 11:24
quelle

4 Antworten

22

Ich tat dies in sniproxy und untersuchte dabei ein TLS-Client-Hallo-Paket in Wireshark Lesen, dass RFC ist ein ziemlich guter Weg zu gehen. Es ist nicht zu schwer, nur viele Felder variabler Länge müssen Sie überspringen und überprüfen, ob Sie den richtigen Elementtyp haben.

Ich arbeite gerade an meinen Tests und habe dieses annotierte Beispielpaket, das helfen könnte:

%Vor%     
dlundquist 21.02.2014, 06:32
quelle
4

Verwenden Sie WireShark und erfassen Sie nur TLS (SSL) -Pakete, indem Sie einen Filter tcp port 443 hinzufügen. Dann finden Sie eine "Client Hallo" Nachricht. Sie können seine Rohdaten unten sehen.

Erweitern Secure Socket Layer -> TLSv1.2 Record Layer: Handshake Protocol: Client Hello -> ...
und Sie werden Extension: server_name -> Server Name Indication extension sehen. Der Servername im Handshake-Paket ist nicht verschlüsselt.

Ссылка

    
LYF 28.03.2015 15:07
quelle
0

Ich habe bemerkt, dass die Domäne immer von zwei Nullbytes und einem Längenbyte vorangestellt wird. Vielleicht ist es 24-Bit-Ganzzahl ohne Vorzeichen, aber ich kann es nicht testen, da mein DNS-Server keine Domänennamen mit mehr als 77 Zeichen zulässt.

Nach diesem Wissen kam ich auf diesen (Node.js) Code.

%Vor%

Dieser Code sucht nach einer Folge von zwei Nullbytes. Wenn es eins findet, nimmt es an, dass das folgende Byte ein Längenparameter ist. Es prüft, ob sich die Länge noch in der Puffergrenze befindet und liest die Bytefolge als UTF-8. Später konnte man das Array regieren und die Domain extrahieren.

Funktioniert erstaunlich gut! Trotzdem bemerkte ich etwas Seltsames.

%Vor%

Immer, egal welche Subdomain ich wähle, wird die Domain doppelt ausgerichtet. Es scheint, als ob das SNI-Feld in einem anderen Feld verschachtelt ist.

Ich bin offen für Vorschläge und Verbesserungen! :)

Ich habe dies in ein Knotenmodul verwandelt, für alle, die sich interessieren: sni .

    
buschtoens 24.07.2013 11:52
quelle
0

Für alle Interessierten ist dies eine vorläufige Version des C / C ++ - Codes. Es hat soweit geklappt. Die Funktion gibt die Position des Servernamens in einem Byte-Array zurück, das den Client Hello und die Länge des Namens im Parameter len enthält.

%Vor%     
Æðelstan 27.12.2016 03:09
quelle