Skip to main content

Antes de empezar la parte entretenida, es necesario ver un poco de teoría. La pregunta que tenemos que responder es “¿Cómo funciona el handshake de 2 vías SSL?”

Funcionamiento Handshake de 2 vías SSL

  1. Client hello: enviado desde el cliente (navegador) al servidor e incluye sus conjuntos de cifrado admitidos y compatibilidades de versión TLS.
  2. Server hello: enviado desde el servidor al cliente en respuesta. Contiene un enlace al certificado público del servidor y una solicitud de devolución del mismo por parte del cliente.
  3. El navegador valida el certificado del servidor y, si todo está bien, envía un link a su propio certificado.
  4. El servidor verifica el certificado del cliente. Si todo está bien, el establecimiento de la sesión continúa.

En esta documentación, se hace uso de pre-master secret key generada por el navegador en el lado del cliente. El cliente genera una clave secreta “pre-master” y el servidor la utiliza para derivar una “master key” que encripta el tráfico de la sesión. Es el estándar actual en criptografía y generalmente se implementa a través de Diffie-Hellman.

 En la imagen, la llave “pre-master” es “S” (mensaje 3).

NOTA: También es posible desencriptar el tráfico en wireshark teniendo disponible la clave privada del certificado SSL/TLS (generalmente *.key).

Ahora que conocemos la teoría, pasamos a la práctica. Esta documentación aplica para clientes (notebook o computadora de escritorio) que posean alguna variante de kernel UNIX. En este ejemplo se utiliza como sistema operativo cliente “MacOSX Monterey 12.3.1“. Aunque no esté mencionado en el desarrollo de esta prueba, también es posible para clientes Windows.

Chequeo anterior de tráfico SSL/TLS

Para ver la diferencia, capturamos tráfico al sitio “https://root-view.com”, accediendo a un artículo. Detenemos el tráfico y buscamos datos HTTP/2. Como resultado, no aparece resultado alguno.

1. Establecer una variable de entorno en Linux o MacOSX

Se necesita configurar la variable de entorno SSLKEYLOGFILE. Para ello, abrimos una terminal y ejecutamos lo siguiente:

export SSLKEYLOGFILE="/Users/$USER/ssl-key.log"

NOTA: También es posible editar nuestro archivo “.bashrc” (o el que corresponda sobre la configuración de nuestro shell) para no tener que ejecutar el export cada vez que necesitemos.

Imprimimos el valor de la variable. Debería devolver el path donde se encuentra el archivo declarado. Ejemplo:

echo $SSLKEYLOGFILE
/Users/name/ssl-key.log

2. Abrir un navegador y revisar el archivo ssh-key.log

Antes de iniciar Wireshark y configurarlo para descifrar SSL, hay que iniciar el navegador de preferencia y confirmar que se está utilizando el archivo de registro. Desde una la misma termianal que se ejecutó el export de la variable, correr la siguiente instrucción:

open /Applications/Firefox.app

Paso siguiente, ingresar a un sitio con certificados SSL/TLS configurados. Al hacerlo, se creará el archivo “ssl-key.log”. Tendrá el siguiente formato:

cat ssl-key.log
# SSL/TLS secrets log file, generated by NSS
CLIENT_HANDSHAKE_TRAFFIC_SECRET db56bddxxxx27338e98f8fb4ecd13561026908b8c358f2a4bf0 7ddcd1bc07676ca0f881xxxedb7adb1949d9a6436359c5a9dd8f6b
SERVER_HANDSHAKE_TRAFFIC_SECRET db56bdd27aadf3bxxxx8fb4ecd13561026908b8c358f2a4bf0 266dfbcf397xxx82a3c152b4cc1974206e8cdb7367c5d198d
CLIENT_HANDSHAKE_TRAFFIC_SECRET 1412fbxxx92678859549ea8f4829e5806156d93289ba0a 4783xxxxcc323c6b3d838a1c27e552090c945425e8329f9e
SERVER_HANDSHAKE_TRAFFIC_SECRET 1412fbxxxxx2678859549ea8f4829e5806156d93289ba0a bba9076863e3f29fc7xxxxxxxx091725808e706216ed13a
CLIENT_TRAFFIC_SECRET_0 db56bdd27aadf3bxxxxxxxxxxx4ecd13561026908b8c358f2a4bf0 357ae6164dc5dd7d5xxxxxxxxxxx2dfaf9a98b38cecaee61cf99639
[...]

3. Configurar Wireshark para descifrar SSL

Una vez que tengamos el tráfico capturado en Wireshark, vamos a importar el archivo generado anteriormente. Para ello, necesitamos ir a “Preferences > Protocols > TLS” (Preferencias > Protocolos > TLS). En el apartado “(Pre)-Master-Secret log filename” le agregamos el mismo.

4. Sniffear el tráfico y detenerlo

Una vez que tenemos el tráfico capturado, vamos a filtrar en el buscador por “tls.handshake”.

Buscamos la IP involucrada para la prueba. Luego, hacemos click derecho sobre la misma y seleccionamos “Follow > TLS Stream”. Se puede notar gran parte del tráfico entre el cliente y servidor.

Para ver más en detalle, podemos hacer un follow up del HTTP/2 stream.

Si quisiéramos ver todos los paquetes HTTP2 disponibles de la sesión, podemos agregar en el filtro generado cuando hicimos un seguimiento del stream TLS “and http2”, quedando como resultado la siguiente línea:

tcp.stream eq 31 and http2

El contenido de este artículo esta bajo licencia Creative Commons.