Wireshark – Comment déchiffrer les flux TLS comme le HTTPS ?
Sommaire
I. Présentation
Aujourd’hui, nous allons apprendre à utiliser une fonctionnalité très pratique de Wireshark disponible depuis la version 3.0 : le déchiffrement des flux chiffrés HTTPS sans certificat. Cette fonctionnalité va permettre d’afficher les flux chiffrés en clair, notamment les flux :
- Web
- DoH : Dns Over Https
- Quic
Avant de continuer, voici la liste des précédents articles de cette série sur Wireshark :
- Tutoriel - Installation pas-à-pas de Wireshark
- Tutoriel - Découverte de l'interface Wireshark
- Tutoriel - Astuces pour personnaliser l'interface de Wireshark !
- Tutoriel - Wireshark et les filtres de capture
- Tutoriel - Wireshark et les filtres d'affichage
- Tutoriel - Wireshark et la résolution de noms
- Tutoriel - Wireshark et les commentaires
- Tutoriel - Wireshark : activer la géolocalisation d’adresses IP
- Téléchargement - Wireshark
II. Comment décrypter les flux TLS sans certificat ?
A. Explication
Avec Wireshark, il existe deux méthodes pour déchiffrer les flux :
- Avoir le certificat en sa possession
- Enregistrer les clés de sessions TLS
Avec le nouveau protocole de sécurité TLS 1.3 ou algorithme de chiffrement ECDHE, même en ayant le certificat nous ne pouvons pas déchiffrer les flux : cela peut poser problème pour une analyse de performances ou dans le cadre d'une analyse liée à un incident de cybersécurité.
Ce qui est d'autant plus vrai avec la mise en place du protocole de transport Quic sur Internet ! Contrairement à TCP qui fournit les informations en clair, Quic chiffre l’ensemble des en-têtes donc même pour suivre l’ordonnancement des paquets, nous sommes obligés de voir les flux en clair. Pour résoudre cette problématique, nous allons mettre en œuvre l’enregistrement de clés de sessions TLS clients et serveurs.
N.B : la fonctionnalité d’enregistrement des clés TLS fonctionne uniquement sur des captures réseau en direct.
B. Enregistrer les clés de sessions TLS
L’enregistrement des clés de sessions TLS peut s’effectuer sur Linux, Mac et Windows. Dans ce tutoriel, nous allons appliquer la procédure pour Windows, avec une machine sous Windows 11 dans mon cas (ceci fonctionne aussi sur Windows 7 et Windows 10). Si vous souhaitez l’implémenter pour Mac et Linux, vous pouvez aller sur le site de Wireshark consulter cette page.
Sur Windows, il y a deux étapes pour enregistrer les clés de sessions TLS :
- Créer une variable environnement utilisateur
- Créer un fichier texte pour enregistrer les clés de sessions clients et serveurs
III. Mise en place de l’enregistrement des clés de sessions TLS
A. Création d’un fichier txt pour enregistrer les clés de sessions TLS
Vous allez créer un fichier txt pour enregistrer les clés de sessions TLS.
Mon fichier s’appellera sslkeys.txt que je vais enregistrer dans mon disque DATA. A vous d'adapter selon votre environnement.
B. Modification des variables d’environnement utilisateurs
Aller dans les paramètres de Windows. Une fois la page ouverte cliquer sur « Système », « Informations système » puis « Paramètres avancés du système »
Une nouvelle fenêtre s’ouvre, cliquer suz « Variables d’environnement… ».
Nous arrivons sur les Variables d’environnement de votre ordinateur, la partie qui va nous intéresser, c'est la section des variables d’environnements utilisateur. Cliquez sur « Nouvelle… »
Donnez le nom suivant à la variable : SSLKEYLOGFILE
Indiquez l’emplacement de votre fichier en cliquant sur « Parcourir le fichier… ». Dès que vous avez terminé votre configuration, cliquez sur « OK ».
La nouvelle variable d’environnement apparaît, pour l’appliquer, cliquez sur « OK ».
C. Valider le bon fonctionnement
Pour valider l’enregistrement des clés de sessions TLS, il suffit d’aller sur internet et de regarder si le fichier txt créé précédemment se remplit. Ouvrez votre fichier txt, vous devriez voir les lignes suivantes créer.
D. Que signifient les lignes dans ce fichier ?
Dans ce fichier, les lignes utilisent des préfixes différents. Voici des informations pour vous aider à les interpréter :
- CLIENT_HANDSHAKE_TRAFFIC_SECRET : la clé secrète de la poignée de main du client codé en hexadécimal.
- SERVER_HANDSHAKE_TRAFFIC_SECRET : la clé secrète de la poignée de main du serveur codé en hexadécimal.
- CLIENT_TRAFFIC_SECRET_0 : le premier code du trafic applicatif du client codé en hexadécimal.
- SERVER_TRAFFIC_SECRET_0 : le premier code du trafic applicatif du serveur codé en hexadécimal.
- EXPORTER_SECRET : le secret de l’exportation en hexadécimal
Voici la source qui explique l’ensemble des valeurs.
IV. Configuration de Wireshark
Maintenant que nous avons validé l’enregistrement des clés de sessions TLS, il reste à configurer Wireshark, pour voir les flux en clair.
Pour cela, lancez Wireshark et allez sur « Editer » puis « Préférences… ».
Ensuite, déroulez le menu à gauche jusqu'à trouver « protocols ».
Cherchez le protocole « TLS ».
On arrive à la page de configuration du protocole TLS. Pour lier votre fichier txt de clés sessions TLS, il suffit de renseigner la localisation de votre fichier en cliquant sur « Parcourir… » au niveau de « (Pre)-Master-Secret log filename ». Ici :
Vous devez arriver à ce résultat et ensuite cliquez sur « OK ».
V. Validation de la configuration Wireshark
Lancez une trace réseau avec Wireshark... vous devriez voir des flux http sur le port TCP ou UDP sur le port 443. Ainsi, les flux HTTPS sont visibles en clair dans Wireshark grâce à la configuration que nous venons de mettre en place ! Cela s'applique aussi aux flux transportés par le protocole QUIC.
VI. Conclusion
Cet article sur Wireshark et la fonctionnalité de déchiffrement les flux TLS est terminé ! Avec cette fonctionnalité, vous pourrez déchiffrer vos flux des applications SAAS de votre entreprise à titre d’exemple, donc vous serez en mesure de voir les requêtes et réponses applicatives.
Le prochain article sera sur l’importation de clés sessions TLS dans un fichier de capture.
Merci pour ce tuto très clair ! :pray: :+1: 🙂
Aux DEV NodeJS pour que SSLKEYLOGFILE comporte du contenu
>npm i -D sslkeylog
puis
>import sslkeylog from ‘sslkeylog’;
>sslkeylog.hookAll();
>(mon app)
source: https://gist.github.com/dfrankland/0fec2cd565f1f7b78fb0e3ededf36b89