Comment puis-je décrypter les messages TLS quand une ciphersuite éphémère Diffie-Hellman est utilisée? Je suis en mesure d'exposer le secret prémaster et le secret maître du client SSL. En utilisant cela, comment décrypter les messages dans Wireshark?
Quelques informations: Wireshark prend en charge le déchiffrement des sessions SSL lorsque le secret maître peut être calculé (qui peut être dérivé d'un secret pré-maître). Pour les suites de chiffrement utilisant l'échange de clés RSA, la clé RSA privée peut être utilisée pour déchiffrer le secret pré-maître chiffré.
Pour les suites de chiffrement éphémères Diffie-Hellman (DHE), la clé privée RSA est uniquement utilisée pour signer les paramètres DH (et pas pour le chiffrement). Ces paramètres sont utilisés dans un échange de clé DH, résultant en un secret partagé (en fait le secret pré-maître qui n'est bien sûr pas visible sur le fil).
Wireshark prend en charge diverses méthodes pour déchiffrer SSL:
Utilisation de n fichier SSL keylog qui mappe les identifiants pour maîtriser les secrets. Les identifiants disponibles sont:
RSA XXX YYY
, puisque Wireshark 1.6. )CLIENT_RANDOM XXX YYY
, puisque Wireshark 1.8. ) PMS_CLIENT_RANDOM XXX ZZZ
, puisque Wireshark 2. )CLIENT_RANDOM
, la clé est l'une des CLIENT_EARLY_TRAFFIC_SECRET
, CLIENT_HANDSHAKE_TRAFFIC_SECRET
, SERVER_HANDSHAKE_TRAFFIC_SECRET
, CLIENT_TRAFFIC_SECRET_0
ou SERVER_TRAFFIC_SECRET_0
. Depuis Wireshark 2.4 .RSA Session-ID:XXX Master-Key:YYY
, puisque Wireshark 1.6. )RSA Session-ID:XXX Master-Key:YYY
, puisque Wireshark 1.11. )Pour générer un tel fichier journal de clés SSL pour une session, définissez la variable d'environnement SSLKEYLOGFILE
sur un fichier avant de démarrer l'application NSS. Exemples de commandes Shell pour Linux:
export SSLKEYLOGFILE=$PWD/premaster.txt
firefox
Sous Windows, vous devez définir une variable d'environnement global, soit via cmd
(appelez setx SSLKEYlOGFILE "%HOMEPATH%\Desktop\premaster.txt"
par exemple) ou via le panneau de configuration du système. Après cela, vous pouvez lancer Firefox via l'icône. Remarque : (Linux) les utilisateurs de Firefox avec NSS 3.24+ ne sont peut-être pas en mesure d'utiliser cette méthode car les développeurs de Firefox l'ont désactivée par défaut =.
Le fichier journal des clés SSL peut être configuré pour Wireshark à Modifier -> Préférences, Protocoles -> [~ # ~] ssl [~ # ~], champ (Pre) -Master-Secret log filename (ou passez le -o ssl.keylog_file:path/to/keys.log
à wireshark
ou tshark
).
Après cela, vous pouvez décrypter les sessions SSL pour les captures précédentes et en direct. Si vous rencontrez une situation où vous ne pouvez toujours pas décrypter le trafic, vérifiez:
https://lekensteyn.nl/
qui fonctionne, mais un site utilisant une suite de chiffrement Camellia a échoué.Si vous ne parvenez toujours pas à décrypter tout le trafic, il est possible que Wireshark contienne un bogue (dans mon cas, il manquait le support de Camellia). Pour commencer le débogage, enregistrez votre capture et démarrez Wireshark avec la journalisation SSL activée:
wireshark -o ssl.debug_file:debug.txt savedcapture.pcapng
Une fois la capture chargée, vous pouvez refermer le programme. (Vous n'avez pas réellement besoin d'enregistrer la capture, mais cela facilite la reproduction du problème et évite davantage de bruit dans le vidage du journal.) Vous pouvez voir quelque chose de similaire à la ligne ci-dessous:
ssl_generate_keyring_material not enough data to generate key (0x33 required 0x37 or 0x57)
Ces nombres sont une combinaison des constantes définies dans epan/dissectors/packet-ssl-utils.h
:
215-#define SSL_CLIENT_RANDOM (1<<0)
216-#define SSL_SERVER_RANDOM (1<<1)
217:#define SSL_CIPHER (1<<2)
218-#define SSL_HAVE_SESSION_KEY (1<<3)
219-#define SSL_VERSION (1<<4)
220-#define SSL_MASTER_SECRET (1<<5)
221-#define SSL_PRE_MASTER_SECRET (1<<6)
Comme vous pouvez le voir, il me manque le SSL_MASTER_SECRET
(0x20) ici. En regardant plus loin dans le fichier journal, je peux également trouver:
dissect_ssl3_hnd_srv_hello can't find cipher suite 0x88
Cette suite de chiffrement est en effet absente du cipher_suites
structure définie dans epan/dissectors/packet-ssl-utils.c
. Après avoir étudié RFC 5932 - Camellia Cipher Suites for TLS, j'ai trouvé les paramètres requis pour un CipherSuite
. Le patch résultant devrait alors être soumis à Wireshark comme je l'ai fait ici: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9144 . La série 1.12 stable a une suite de chiffrement et un support TLS considérablement améliorés, vous ne devriez donc pas avoir à le corriger manuellement maintenant.
Si vous pouvez "dévoiler le secret prémaster", bien que l'échange de clés utilise éphémère Diffie-Hellman, alors vous avez un accès privilégié au client ou au serveur . C'est l'un des points de DHE: l'échange de clés réel utilise des paires de clés DH nouvellement générées, que ni le client ni le serveur ne stockent ailleurs que dans sa propre RAM. Avoir une copie de la clé du serveur permanent ne vous donnerait rien, en tant qu'attaquant passif avec Wireshark, car il n'est utilisé que pour les signatures. Cette clé pourrait être utilisée pour usurper l'identité du serveur et ainsi monter une attaque active Man-in-the-Middle .
Quoi que vous disiez, si vous avez accès au secret prémaster, vous devez également avoir un accès direct aux données claires, sans avoir à recourir à la capture de paquets grossiers; par conséquent, votre question est bizarre.
Quoi qu'il en soit, les enregistrements de données suivants peuvent être déchiffrés en suivant le standard (ou l'un des leprécédentversions , le cas échéant), ce qui est un exercice de programmation intéressant. Il est possible que le code source de ssldump soit réutilisé pour cette tâche.