web-dev-qa-db-fra.com

Capture uniquement la prise de contact SSL avec tcpdump

J'ai un serveur auquel de nombreux clients se connectent en utilisant SSL. Récemment, j'observe des erreurs de négociation SSL dans les journaux du serveur (ex erreur MAC SSL). L'erreur elle-même n'est pas importante, mais je veux voir pourquoi certains clients peuvent se connecter alors que d'autres échouent, et doivent également identifier les clients qui échouent.

Pour déboguer ce problème, je veux capturer toutes les poignées de main SSL qui se produisent sur le serveur et comme je ne sais pas quand les clients problématiques se connectent, je ne veux pas capturer tout le trafic jusqu'à ce que cela se produise. Je veux juste capturer toutes les poignées de main SSL et les analyser plus tard avec Wireshark. Supposons que je n'ai accès qu'à tcpdump et à aucun autre outil de capture.

10
sadiq.ali

Je ne sais pas exactement ce que vous appelez poignée de main, mais je propose cette commande qui capturera probablement plus de 95% de ce que vous pouvez souhaiter:

tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"

Maintenant, qu'est-ce que ça fait:

  • eth: est mon interface réseau, changez-la si vous en avez besoin
  • port tcp 44: Je suppose que c'est le port sur lequel votre serveur écoute, changez-le si vous en avez besoin
  • tcp [((tcp [12] & 0xf0) >> 2)] = 0x16: un peu plus délicat, détaillons ceci ci-dessous

tcp[12] Signifie la capture du 13e octet du paquet TCP, correspondant à la première moitié étant le décalage, la seconde moitié étant réservée. Le décalage, une fois multiplié par 4, donne le nombre d'octets de l'en-tête TCP, ce qui signifie que ((tcp[12] & 0xf0) >> 2) Fournit la taille de l'en-tête TCP.

Le premier octet d'un paquet TLS définit le type de contenu. La valeur 22 (0x16 en hexadécimal) a été définie comme étant du contenu "Handshake".

Par conséquent, tcp[((tcp[12] & 0xf0) >> 2)] = 0x16 capture chaque paquet ayant le premier octet après l'en-tête TCP défini sur 0x16).

Plus de filtrage peut être effectué, mais cela répond strictement à votre question.

32
Jyo de Lys

Je pense que la réponse acceptée est une optimisation prématurée avec une solution fragile.

La prise de contact SSL a lieu dès que la connexion est établie.

Approche simple: démarrez la capture avant que le client ne se connecte à l'hôte distant et capturez les premiers N paquets complets.

Par exemple, pour 300 paquets:

/ usr/sbin/tcpdump -i eth0 -p -s 65535 -c 300 "tcp et Host 1.2.3.4 et port 443"

De cette façon, Wireshark possède la charge utile complète de la négociation SSL, peut la décoder et vous montrer tous les bits.

0
Massimo