Captura del Handshake SSL con tcpdump
21:07, 08.05.2024
SSL es, con diferencia, el protocolo más común que se utiliza para la transmisión cifrada de datos a través de conexiones TCP. Durante este procedimiento, ambas partes deben intercambiar distintos tipos de información, como claves públicas, algoritmos de cifrado, versiones del protocolo y muchos otros.
A veces, sin embargo, el intercambio no va como se supone que debe ir y se necesita detectar problemas y solucionarlos. Una forma común de hacerlo es capturando el handshake SSL con tchpdump. Haciendo esto, usted será capaz de analizar en detalle, lo que está pasando con su transmisión de datos y tomar medidas para resolver los problemas.
Visión general del comando tcpdump
tcpdump es una potente herramienta de análisis de red de línea de comandos que se utiliza para capturar y mostrar los paquetes transmitidos y recibidos a través de una interfaz de red, disponible en la mayoría de los sistemas operativos tipo Unix, incluidos Linux y macOS. Si su objetivo es capturar SSL handshake, debe saber que la herramienta por sí misma puede capturar grandes volúmenes de datos, que no podrá analizar de forma productiva. Teniendo esto en cuenta, tendrá que aplicar una serie de filtros que seleccionarán los paquetes que tienen que ver directamente con su tarea. Los criterios de filtrado incluyen direcciones IP de origen y destino, números de puerto y protocolos.
Introducción al Handshake SSL
El protocolo SSL (Secure Sockets Layer) es una parte esencial del protocolo SSL/TLS (Transport Layer Security), ampliamente utilizado para proteger la comunicación en redes informáticas. Aunque SSL ha sido sustituido en gran medida por TLS, el término "handshake SSL" se sigue utilizando ampliamente para describir la fase inicial de negociación de una conexión TLS.
Un handshake SSL consiste en una serie de mensajes que se intercambian entre el cliente y el servidor, y estos mensajes son las etapas del establecimiento de un canal de comunicación seguro y cifrado. Echémosles un vistazo.
- ClientHello: El handshake comienza cuando el cliente envía un mensaje ClientHello al servidor. Este mensaje consiste en el número de versión SSL/TLS del cliente, una lista de suites de cifrado soportadas (algoritmos de cifrado, intercambio de claves y autenticación de mensajes), una lista de métodos de compresión soportados y, posiblemente, una lista de extensiones soportadas.
- ServerHello: Para dar una respuesta al mensaje anterior, el servidor envía un mensaje ServerHello al cliente, que contiene el número de versión SSL/TLS del servidor, el conjunto de cifrado y el método de compresión seleccionados de la lista del cliente y, posiblemente, las extensiones seleccionadas por el servidor.
- Certificado del servidor: A efectos de autenticación, el servidor envía su certificado al cliente, que contiene la clave pública del servidor, utilizada posteriormente por el cliente para el intercambio de claves.
- Solicitud de certificado (opcional): En caso de que el servidor requiera autenticación por parte del cliente, como ocurre con SSL bidireccional, el servidor envía el mensaje al cliente.
- Intercambio de claves: El cliente y el servidor intercambian información sobre la clave. Esto puede tener lugar de diferentes maneras. Por ejemplo, el cliente puede enviar un secreto premaster cifrado con la clave pública del servidor (como en el caso del intercambio de claves RSA). Otra posibilidad es que tanto el cliente como el servidor generen las claves conjuntamente (como en el caso del intercambio de claves Diffie-Hellman). Este paso puede variar en función del conjunto de cifrado elegido.
- Server Hello Done: Después de que el servidor haya terminado de enviar mensajes para soportar el intercambio de claves y la autenticación del servidor, envía el mensaje ServerHelloDone para indicarlo.
- Intercambio de claves del cliente: Para responder al mensaje anterior el cliente envía un mensaje de intercambio de claves, incluyendo un secreto premaster que depende del método de intercambio de claves.
- Certificate Verify (opcional): En caso de que sea necesaria la autenticación del cliente, éste puede enviar un mensaje de verificación de certificado firmado digitalmente, permitiendo al servidor verificar el certificado del cliente.
- Finalización: Por último, tanto el cliente como el servidor intercambian mensajes cifrados de Finished, que verifican que los procesos de intercambio de claves y autenticación se han realizado correctamente.
Filtrado de mensajes SSL Handshake en tcpdump
Dado que tcpdump filtra la información a nivel de paquetes y no puede tratar directamente con construcciones como los protocolos SSL/TLS, tendrás que aplicar filtros basados en características generales de los paquetes de handshake, como números de puerto y tamaños de paquetes, para capturar sólo el proceso de handshake. Echemos un vistazo a los enfoques que puedes tener que utilizar para esta tarea.
- Filtrado por puerto:
Los apretones de manos SSL/TLS suelen producirse a través del puerto 443 para HTTPS, aunque también pueden estar implicados otros puertos utilizados para proteger protocolos. En concreto, para capturar todo el tráfico en el puerto HTTPS 443 predeterminado, utilice:
tcpdump -i any 'port 443'
Tenga en cuenta que esto capturará todo el tráfico en el puerto y no sólo los mensajes de handshake.
- Captar el inicio de la conexión:
Dado que al principio de una conexión SSL/TLS tiene lugar un "handshake", capturar los intercambios iniciales de paquetes puede ayudar a distinguir los mensajes del "handshake". Por ejemplo, puedes capturar paquetes SYN y SYN-ACK para poder ver el inicio de las conexiones TCP antes del handshake SSL/TLS.
tcpdump -i any 'port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn)'
- Filtros de longitud:
Dado que los mensajes handshake, ClientHello y ServerHello, en particular, tienden a tener un rango distintivo en tamaños, este hecho teóricamente puede ser aprovechado para filtrar paquetes basándose en su tamaño de carga útil TCP. Sin embargo, como hay un gran grado de aleatoriedad en variables como el tamaño, este método es bastante impreciso y poco fiable.
- Captura y análisis con Wireshark:
Wireshark es una herramienta especial que puede proporcionarte un análisis más detallado del tráfico que has capturado previamente con tcpdump, filtrando por mensajes de handshake específicos. Primero, captura el tráfico del puerto específico, escribiéndolo en un archivo:
tcpdump -i any 'port 443' -w capture_file.pcap
Abra el archivo capture_file.pcap con Wireshark y utilice sus filtros SSL/TLS, como ssl.handshake.type para un análisis más detallado.
Captura de paquetes específicos de la versión TLS
Aunque la mayoría de las aplicaciones modernas utilizan el protocolo TLSv1.3 para el intercambio de mensajes. No obstante, para preservar la compatibilidad con versiones anteriores, se admiten TLSv1.0, TLSv1.1 y TLSv1.2. A cada versión se le asigna un código numérico:
SSLv3 – 0x300
TLSv1.0 – 0x0301
TLSv1.1 – 0x0302
TLSv1.2 – 0x0303
TLSv1.3 – 0x0304
Dado que esta información está contenida en los bytes 10 y 11 de los datos del mensaje de enlace SSL, se puede utilizar el siguiente filtro:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x16) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+9] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+10] = 0x03)"
Captura de paquetes de datos de aplicaciones a través de TLS
Los mensajes Handshake van seguidos de datos de aplicación, que también contienen la versión TLS en el 2º y 3º byte de datos. Para capturarlo:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x17) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+1] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+2] = 0x03)" -w appdata.pcap
De esta forma podemos capturar paquetes que contengan 17 en el primer byte y 03 en el segundo y tercer byte.
Rastreo de fallos de conexión SSL
Para filtrar los errores, debe comprobar el 1er byte que contiene 15 o 21, números correspondientes a fallos específicos:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x15) || (tcp[((tcp[12] & 0xf0) >>2)] = 0x21)" -w error.pcap
Observaciones finales
Usar tcpdump para capturar SSL handshake es una forma eficiente de analizar el tráfico y encontrar bugs y fallos si algo va mal. En este artículo, nos hemos enfrentado a algunos enfoques que pueden ayudarle a filtrar el tráfico capturado de manera adecuada para poder detectar cualquier problema. Esperamos que esta guía le haya sido útil, ¡cuídese!