Extrait de SNI (Server Name Indication) de client TLS bonjour
Comment voulez-vous extraire l'Indication du Nom du Serveur à partir d'un Client TLS message Hello. Je suis actuellement de la difficulté à comprendre ce très cryptique RFC 3546 sur TLS Extensions, dans lequel la SNI est défini.
Choses que j'ai entendu jusqu'à présent:
- L'hôte est encodés en utf-8 et lisible lorsque vous utf8 enocde la mémoire tampon.
- Theres un octet avant de l'hôte, qui détermine sa longueur.
Si je pouvais trouver la position exacte de la longueur en octets, de l'extraction de la SNI serait assez simple. Mais comment faire pour que les octets en premier lieu?
La simple approche vous essayez de prendre est le mal. Vous devez analyser la demande et notamment de ses extensions et puis, vous obtenez les données à partir de l'extension correspondante.
Ouais, j'en suis certain, mais je ne sais pas vraiment comment l'analyser. Voulez-vous comprendre comment la poignée de main TLS fonctionne?
Bien sûr, je ne nous vous offrons une bibliothèque sur la sécurité comme l'un de nos produits principaux. Vous devez ouvrir le RFC ( tools.ietf.org/html/rfc5246 ) et le mettre en œuvre.
Haha, eh bien je vous remercie, c'est comme 100 pages de pure tech. Je suppose que les choses deviennent intéressantes sur page 41. C'est là que les extensions sont mentionnés, qui sont décrits dans la RFC 3546. Oh mon dieu, Oh mon. 😀
Hey regarde, une autre réponse où Eugene est de vendre un 20 mille dollars, produit une réponse. Je suppose en pointant les gens à un énorme RFC et de rendre la tâche se sentir écrasante majorité redoutable est une tactique de vente?
Ouais, j'en suis certain, mais je ne sais pas vraiment comment l'analyser. Voulez-vous comprendre comment la poignée de main TLS fonctionne?
Bien sûr, je ne nous vous offrons une bibliothèque sur la sécurité comme l'un de nos produits principaux. Vous devez ouvrir le RFC ( tools.ietf.org/html/rfc5246 ) et le mettre en œuvre.
Haha, eh bien je vous remercie, c'est comme 100 pages de pure tech. Je suppose que les choses deviennent intéressantes sur page 41. C'est là que les extensions sont mentionnés, qui sont décrits dans la RFC 3546. Oh mon dieu, Oh mon. 😀
Hey regarde, une autre réponse où Eugene est de vendre un 20 mille dollars, produit une réponse. Je suppose en pointant les gens à un énorme RFC et de rendre la tâche se sentir écrasante majorité redoutable est une tactique de vente?
OriginalL'auteur buschtoens | 2013-07-24
Vous devez vous connecter pour publier un commentaire.
Je l'ai fait en sniproxy, l'examen d'un client TLS bonjour paquets dans Wireshark lors de la lecture de cette RFC est une très bonne façon d'aller. Il n'est pas trop dur, juste beaucoup de champs de longueur variable que vous avez à passer et vérifier vérifier si vous avez le bon type de l'élément.
Je travaille sur mes tests, et ont cette annoté échantillon de paquet qui pourraient vous aider:
C'est nettement plus élaboré que mon original à la moitié de la réponse. Une tique. 😀
Super, je suis venu ici parce que je voulais avoir un non-décryptage simple TLS transitaire basé sur la SNI. Donc, avec sniproxy qui est déjà fait.
OriginalL'auteur dlundquist
Utiliser WireShark et de capturer uniquement le protocole TLS (SSL) des paquets par l'ajout d'un filtre
tcp port 443
. Ensuite, trouver un Client "Bonjour" Message. Vous pouvez voir ses données brutes ci-dessous.Développez
Secure Socket Layer
->
TLSv1.2 Record Layer: Handshake Protocol: Client Hello
->
...
et vous verrez
Extension: server_name
->
Server Name Indication extension
. Le nom du serveur dans la poignée de main package n'est pas chiffré.http://i.stack.imgur.com/qt0gu.png
OriginalL'auteur LYF
J'ai remarqué que le nom de domaine est toujours préfixer par deux à zéro octets et une longueur en octets. C'est peut-être 24 bits non signé entier, mais je ne peux pas le tester, que mon serveur DNS ne permettent pas à des noms de domaine au-delà de 77 caractères.
Sur ces connaissances, je suis venu avec cette (Node.js) code.
Ce code se présente pour une séquence de deux octets zéro. Si il en trouve un, il suppose que l'octet suivant est un paramètre longueur. Il vérifie si la longueur est toujours à la limite de la mémoire tampon, et si c'est la séquence d'octets en UTF-8. Plus tard, on pourrait RegEx le tableau et d'en extraire le domaine.
Fonctionne étonnamment bien! Encore, j'ai remarqué quelque chose d'étrange.
Toujours, n'importe quel sous-domaine que je veux, le domaine est ciblé à deux reprises. Il semble que la SNI champ est imbriqué dans un autre domaine.
Je suis ouvert aux suggestions et des améliorations! 🙂
J'ai tourné cela en un Nœud du module, pour tout le monde, qui s'en soucie: sni.
Je ne pense pas que les expressions régulières sont le meilleur moyen d'extraire des données à partir d'un fichier binaire protocole cryptographique. Le Client Hello message comprend 32 octets de données aléatoires qui pourraient correspondre à votre regexp.
Je ne sais pas qu'elle mérite un downvote, je veux dire qu'il a trouvé une solution. J'ai rencontré le même, mais comme dlundquist notes, je ne vais pas compter sur elle étant conforme ou exclure la possibilité d'octets aléatoires à polluer la regex match. Il ne fait toutefois travailler.
OriginalL'auteur buschtoens
Pour toute personne intéressée, c'est une version provisoire du code C/C++. Il a travaillé jusqu'à présent. La fonction retourne la position du nom du serveur dans le tableau d'octets contenant le Client et Bonjour la longueur du nom dans la
len
paramètre.OriginalL'auteur Æðelstan