Déchiffrer les flux réseaux

Le chiffrement des flux réseaux est une excellente protection contre les quelques indiscrétions dont nos données peuvent être victimes lorsqu’elles circulent dans les ramifications (parfois obscures) du web entre 2 tiers de confiance.

Cependant, ce même chiffrement peut être une véritable source de complication lorsqu’on souhaite faire un peu de debug sur ce même trafic notamment en SSL/TLS et IPSec. Puisque finalement d’un point de vue strictement protocolaire, nous cherchons à faire exactement ce contre quoi il est prévu de résister.

SSL / TLS

Grâce à la véritable boite à outil WireShark, il existe différentes façons de déchiffrer du trafic SSL/TLS, plus ou moins propres et plus ou moins pertinentes.

Passons les en revue :
Dans WireShark : Edit -> Preferences / Protocols / SSL :

WiresharkSSLOptions

  1. RSA keys list :
    La plus évident, mais aussi la plus risquée : on fournit à WireShark la clé privée du serveur et il se chargera pour nous de déchiffrer le trafic. Cependant il y a deux restrictions à cette méthode : La première est qu’il faut disposer de la clé privée du serveur et la trimbaler sur la machine qui lira la capture (ce qui n’est pas une bonne pratique). La seconde restriction est que dès lors que vous faites du PFS, cette méthode de déchiffrement devient caduque : la clé privée ne servant plus à l’échange de la clé partagée. Cette méthode ne nous sera donc d’une utilité très limitée notamment si nous nous trouvons du coté client.
  2. Pre-Shared-Key :
    Le plus simple si nous maitrisons le schéma de bout en bout est de configurer le client et le serveur pour utiliser une clé secrète pré-partagée.  Le mode TLS-PSK est peu connu mais a ses avantages dans certains cas. Cependant le déchiffrement par PSK  est une fois de plus rendue obsolète si la PFS est mis en place.
  3. (Pre)-Master-Secret log :
    Décidément cette satanée PFS nous pose pas mal problème. Heureusement, les développeurs de Chrome et Mozilla ont eu une petite pensée pour nous avec le SSLKEYLOGFILE. Le SSLKEYLOGFILE est une variable d’environnement qui peut être définit aussi bien sur Linux, (Mac : pas testé, pas assez riche pour avoir le matos) ou Windows. Une fois définie et lorsqu’on navigue avec Firefox (ou chrome), les pre-master-secret sont directement stocké dans ce fichier qu’il suffit alors de passer à WireShark pour voir le trafic en clair.

Une petite démonstration s’impose :

%> export SSLKEYLOGFILE=/path/to/dumpPMS.log
%> firefox &
%> wireshark -v
wireshark 1.12.4 (Git Rev Unknown from unknown)

Copyright 1998-2015 Gerald Combs <gerald@wireshark.org> and contributors.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Compiled (64-bit) with GTK+ 3.10.8, with Cairo 1.13.1, with Pango 1.36.3, with
GLib 2.40.2, with libpcap, with libz 1.2.8, with POSIX capabilities (Linux),
without libnl, with SMI 0.4.8, with c-ares 1.10.0, with Lua 5.2, without Python,
with GnuTLS 2.12.23, with Gcrypt 1.5.3, with MIT Kerberos, with GeoIP, with
PortAudio V19-devel (built Feb 25 2014 21:09:53), with AirPcap.

Running on Linux 3.13.0-48-generic, with locale en_US.UTF-8, with libpcap
version 1.5.3, with libz 1.2.8, GnuTLS 2.12.23, Gcrypt 1.5.3, without AirPcap.
       Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz

Built using gcc 4.8.2.
%> sudo wireshark

Voici donc ce que nous obtenons lors que nous naviguons en SSL sur le site du moment :

WiresharkSSL1 Une fois le paquet déchiffré à l’aide du Pré Master Secret suivant :

%> cat /tmp/dumpPMS.log
CLIENT_RANDOM 13e12a24d225e9a8fbe6363a20fbdccee6606dfa98b44e72265947fed9f96a56 7fb2bd010421aa179340d84181cab462cc53b3b9ce14cb4dbb17307f6b5483272e07d66a501425d558553fd949d2baa

Pour ceux qui suivent, le 3eme élément de la ligne n’est ni plus ni moins que la « Master-Key » affiché par le s_client d’OpenSSL.

Il suffit d’utiliser le petit onglet sous le paquet pour voir le contenu du paquet déchiffré.

WiresharkSSL2

Comme montré ici, cette méthode peut s’avérer vraiment utile et reste assez simple à mettre en place. Le seul bémol est que pour le coup on est dépendant du navigateur client. Windows et en particulier Internet Explorer n’utilisent pas cette variable d’environnement : dommage !

IPSec

Avec IPSec, c’est encore plus simple.
Notons ici qu’IPSec est souvent en place sur des boitiers dédiés. A contrario du SSL/TLS, IPSec ne protège en général qu’une partie de la communication sur le réseau. Il est d’ailleurs parfois plus simple de faire une capture sur la partie privée du réseau pour y voir le trafic complet. De plus, ces boitiers propriétaires ont parfois des outils pour le faire directement pour directement voir le contenu des données dans le tunnel. Citons par exemple Bouclier de Tempête qui propose l’interface enc0 pour voir le trafic IPSec en clair (tcpdump -ni enc0)

Si nous opérons depuis un OS linux ou BSD standard, il existe l’outil setkey qui vous permet de dumper toutes les SA actuellement utilisées par la pile IPSec du noyau.

%> sudo apt-get install ipsec-tools
%> sudo setkey -D
10.10.10.13 10.10.10.37
        esp mode=tunnel spi=122112477(0x074749dd) reqid=16386(0x00004002)
        E: aes-cbc  5558002e 8cecf335 1be2d591 17ac0e58 d55b7328 a1db550b 289a5b10 4aa4e96c
        A: hmac-sha256  6ae60450 c18c0123 515f7fe3 7467144c 4ea48ac7 b17cfc92 9ed5eda0 78ae8fbd
        seq=0x00000003 replay=8 flags=0x00000000 state=mature
        created: Jan 05 14:45:16 2015   current: Jan 05 14:59:16 2015
        diff: 840(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 05 14:55:43 2015      hard: 0(s)      soft: 0(s)
        current: 114(bytes)     hard: 0(bytes)  soft: 0(bytes)
        allocated: 3    hard: 0 soft: 0
        sadb_seq=1 pid=67943 refcnt=1
10.10.10.37 10.10.10.10
        esp mode=tunnel spi=150150116(0x08f31be4) reqid=16385(0x00004001)
        E: aes-cbc  d106cdcb e72f55d7 ad3852d5 453850b0 3012f5f6 6b4331ef 7b7922c5 ed165722
        A: hmac-sha256  050e04e1 13272ea4 bd92e03e 3653dbeb ce88a93c e32feca7 d90b8854 1874c95e
        seq=0x0000001c replay=8 flags=0x00000000 state=mature
        created: Jan 05 14:45:16 2015   current: Jan 05 14:59:16 2015
        diff: 840(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 05 14:59:05 2015      hard: 0(s)      soft: 0(s)
        current: 3024(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 28   hard: 0 soft: 0
        sadb_seq=0 pid=67943 refcnt=2

Une fois ces données récupérées, il faut les importer dans notre outils de capture favoris.
Ainsi dans Wireshark, une fois dans le menu Edit-> Preferences -> Protocols -> ESP, cliquons sur « edit » : WiresharkESPOptionsEt remplissons avec les informations fraichement glanées via setkey.

WiresharkSPIDefL’IPSec ayant un contexte (SPI) par direction, il faut donc créer deux règles.

Il faut bien penser à préfixer les clés en hexadécimale par des « 0x » sinon WireShark les assimelera à des chaines ASCII. Une fois ces informations complétées, le déchiffrement est automatique pour Wireshark si « Attempt to detect/decode encrypted ESP payloads: » est coché.

Cependant Wireshark n’est pas le seul à effectuer ce travail. Tcpdump peut également déchiffrer le trafic ESP, ce qui peut être utile sur des petits équipements où seul la ligne de commande est disponible.

La syntaxe est alors la suivante :

%> tcpdump -nr fichier.pcap -E "0x074749dd@10.10.10.13 aes256-cbc:0x5558002e8cecf3351be2d59117ac0e58d55b7328a1db550b289a5b104aa4e96c"

Ou bien si vous préférez utiliser un fichier :

%> tcpdump -nr fichier.pcap -E "file secretsesp.txt" 
%> cat secretsesp.txt
0x08f31be4@10.10.10.37 aes256-cbc:0xd106cdcbe72f55d7ad3852d5453850b03012f5f66b4331ef7b7922c5ed165722
0x074749dd@10.10.10.13 aes256-cbc:0x5558002e8cecf3351be2d59117ac0e58d55b7328a1db550b289a5b104aa4e96c

Cependant, le support cryptographique bien que basé sur openssl est assez faible dans tcpdump en témoigne l’exemple du code pris dans le code source print-esp.c ci-dessous :

        len = colon - decode;
        if (strlen(decode) &gt; strlen("-hmac96") &amp;&amp;
            !strcmp(decode + strlen(decode) - strlen("-hmac96"),
                    "-hmac96")) {
                p = strstr(decode, "-hmac96");
                *p = '\0';
                authlen = 12;
        }
        if (strlen(decode) &gt; strlen("-cbc") &amp;&amp;
            !strcmp(decode + strlen(decode) - strlen("-cbc"), "-cbc")) {
                p = strstr(decode, "-cbc");
                *p = '\0';
        }
        evp = EVP_get_cipherbyname(decode);

        if (!evp) {
                (*ndo-&gt;ndo_warning)(ndo, "failed to find cipher algo %s\n", decode);
                sa-&gt;evp = NULL;
                sa-&gt;authlen = 0;
                sa-&gt;ivlen = 0;
                return 0;
        }

En gros pour ceux qui ne lisent pas le C, seul le mode CBC est supporté pour le déchiffrement. Ainsi si nous souhaitons faire autre-chose que du mode CBC, il faut aller voir ailleurs (Mais si vous vous en sentez le courage, ou si vous avez un stagiaire sous la main, modifier le code de tcpdump pour supporter l’ensemble des modes d’OpenSSL ne devrait pas être si compliqué).

Voilà rien de vraiment nouveau, mais ca peut toujours servir…

Publicités

A propos JoMendes

Amateur de mathématiques et d'hexadécimal. Je m'intéresse de près ou de loin suivant mon niveau à tous les sujets de sécurité de l'information.
Cet article, publié dans Cryptographie Symétrique, Outils, est tagué , , , , , . Ajoutez ce permalien à vos favoris.

4 commentaires pour Déchiffrer les flux réseaux

  1. clement dit :

    Les proxy HTTPS marchent très bien aussi, je pense par exemple à fiddler4 🙂

  2. Ping : Notes en vrac sur IPSec | Cryptobourrin

  3. Ping : Le support ne répond plus | Cryptobourrin

  4. Ping : Locky l’épidémie | Cryptobourrin

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s