Table of Contents
Descifrar tráfico HTTPS / HTTP2 con SoCat (Parte servidor: Certificado y llave privada)
Para poder auditar tráfico https desde la parte del servidor, es decir, disponemos del certificado público y su clave privada, se puede utilizar socat. El proceso se basa en ponerse en medio de la comunicación e ir descifrando con ayuda de la clave privada el tráfico entrante y saliente, algo que con socat es muy fácil de hacer.
Para el ejemplo se usará localhost, por lo que con especificar la interfaz “lo” sería suficiente para empezar a ver el tráfico HTTP y poder guardarlo si se desea. El certificado que usemos con socat para descifrar y ofrecer https al cliente, debe contener la llave privada y el certificado de manera concatenada.
cat certificado.pem cert-key > certificado_mim.pem
Este sería un esquema del flujo de datos.
[Firefox] <----- SSL -----> [443:socat <---- PLAIN ----> socat:655] <----- SSL -----> [443:Servidor web]
Se ofrece en el puerto https (443) una conexión cifrada que será descifrada en tiempo real y redirigida al puerto local 644.
socat -v openssl-listen:443,cert=certificado_mim.pem,verify=0,reuseaddr,fork tcp4:localhost:6444
El puerto 6444 recibe en texto claro (HTTP) el tráfico web y pasa a una sesión cifrada HTTPS con el destino X.X.X.X.
socat -v tcp4-listen:6444,reuseaddr,fork ssl:X.X.X.X:443,verify=0
Descifrar tráfico HTTPS / HTTP2 con Wireshark / TCPdump (Parte cliente: navegador)
El tráfico cifrado HTTPS entre un servidor y un cliente puede utilizar diferentes versiones del estándar TLS (También llamado SSL), todo depende de la versión que soporte el servidor web y el navegador del usuario que solicite tráfico cifrado a dicho servidor web. Dentro de cada estándar (SSL3, TLS 1.0, TLS 1.1, TLS 1.2) para hacer conexiones https hay diferentes algoritmos criptográficos a utilizar (RSA, Diffie-Hellman, DSA, Fortezza, etc.), los cuales a su vez tienen diferentes implementaciones.
Esto provoca que haya cientos de combinaciones posibles a la hora de crear una conexión https, en Internet hay varios tutoriales que explican diversos método pero muy pocos especifican bajo qué condiciones es posible el descifrado de una captura de tráfico https.
Factores que influyen a la hora de saber si una captura de tráfico https es descifrable.
- Software, versión y configuración del servidor web (Versión del estándar, algoritmos).
- Software, versión y configuración del navegador web (Versión del estándar, algoritmos).
- Acceso a las claves privadas del servidor, claves pre-maestras / maestras utilizadas por el navegador.
- Versión del sniffer utilizado para descifrar (Soporte / implementación de los algoritmos criptográficos).
Al estar el uso de Internet tan masificado y al existir un conjunto de aplicaciones utilizadas de forma masiva para navegar (Apache, Nginx, Firefox, Chrome, …), es frecuente utilizar el mismo tipo de cifrado en un determinado entorno (escritorio, móviles, etc.) y espacio de tiempo dado. Vamos a mostrar uno de los métodos utilizados en el pasado, cuando se utilizaba SSL 3.0, para descifrar capturas de tráfico https y otro método, que a fecha de este artículo suele ser el habitual.
Lectura recomendada: http://es.wikipedia.org/wiki/Transport_Layer_Security
Descifrado de tráfico HTTPS / HTTP2 utilizando la clave privada del servidor WEB
Estándar / Cifrado: SSL 3.0 / TLS_RSA_WITH_AES_256_CBC_SHA
Captura: snakeoil2_070531.tgz
Qué se necesita para descifrar la captura: La clave privada del servidor https
Procedimiento: Wireshark > Edit > Preferences > Protocols > SSL > RSA Keys list > Nuevo
IP address: 127.0.0.1
Port: 443
Protocol: http
Key file: rsasnakeoil2.key
Aplicar
Descifrado de tráfico HTTPS / HTTP2 utilizando las claves simétricas (Navegador - Servidor)
Actualmente y a diferencia que en el ejemplo anterior, con TLS 1.2, el navegador y el servidor negocian una clave secreta (simétrica) común llamada master secret, normalmente usando el resultado de un intercambio Diffie-Hellman, o simplemente cifrando una clave secreta con una clave pública que es descifrada con la clave privada de cada uno.
Todos los datos de claves simétricas restantes son derivados a partir de este master secret (y los valores aleatorios generados en el cliente y el servidor), que son pasados a través una función pseudoaleatoria cuidadosamente elegida. Obtener esas claves simétricas es fundamental a la hora de poder descifrar un tráfico https. En este caso la clave privada del servidor no es de interés.
Estándar / Cifrado: TLS 1.2 / Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
Qué se necesita para descifrar la captura: Las claves simétricas generadas para cifrar la comunicación https.
Obtener claves simétricas en Firefox.
export SSLKEYLOGFILE=$HOME/llaves firefox
Procedimiento: Wireshark > Edit > Preferences > Protocols > SSL > (Pre)-Master-Secret log filename > /home/XXX/llaves > Aplicar
También es posible elegir un método concreto a la hora de crear una conexión https con un servidor. En navegadores Mozilla podemos hacer uso de about:config y jugar con opciones como security.tls.version.max o bien hilar más fino y activar o desactivar distintos modos de cifrado. Se debe tener en cuenta que no todos los servidores soportan los mismos modos de cifrado. A la hora de modificar la configuración del navegador se recomienda tener una copia de seguridad de la misma.
Utilizar SSLdump para descifrar tráfico cifrado HTTPS
Como ya se explicó anteriormente, necesitamos hacer uso de protocolos específicos para poder utilizar herramientas que descifren tráfico https. Se debe rebajar la seguridad y eliminar ECDSA, DH / EDH (Según pase el tiempo es posible que se deban especificar otros nuevos mecanismos que por defecto pueden venir activados)
Configuración https para Apache que permite el uso de ssldump.
SSLProtocol ALL -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCipherSuite "AES256-SHA"
Configuración https para Nginx que permite el uso de ssldump..
ssl_ciphers "RSA+AES256:!MD5"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on;
Uso de ssldump en tiempo real / ficheros pcap.
ssldump -ndk /ruta/clave privada port 443 tcpdump -nvv -s 65535 -w ssl_debug.pcap port 443
Enlace de interés: Wireshark en modo texto (Tshark)