Ocultamiento de ataques web bajo HTTPS

Desde hace un par de años al día de hoy ha habido una fuerte apoyo de parte de las grandes empresas de tecnología para la adopción de HTTPS por todo Internet. Google, Microsoft, Mozilla, Cloudflare, Akamai, entre muchas otras, han decidido habilitar el protocolo para sus clientes o facilitar el acceso a este protocolo, sin embargo como profesionales en seguridad es necesario estar atento a cualquier cambio fuerte de cualquier índole, no nada más tecnológico. Sabemos que cualquier cambio, tendencia, adopción masiva, situaciones insólitas, etc. pueden potencialmente ser un foco de infección o punto compromiso para los sistemas informáticos y la rápida adopción de HTTPS no ha sido la excepción a esta regla.

Algo que he estado viendo en la red es el incremento de ataques a aplicaciones web utilizando HTTPS como transporte para el ataque, lo cual es, hasta cierto punto, obvio ya que los mismos atacantes están cifrando los comandos o exploits por HTTP bajo el protocolo TLS que evita que el ataque sea visualizado durante el transporte y, peor aún, si la entidad atacada tiene mal configurada su infraestructura de seguridad, este ataque también será invisible a sus herramientas de seguridad.

Un caso muy común es cuando herramientas como UTMs, NGFWs, WAFs o cualquier otra herramienta con protección a nivel aplicación web es instalada y los ingenieros desean visualizar HTTPS y proteger las aplicaciones bajo ese protocolo también. En la mayoría de los casos, y por facilidad en la implementación, configurarán el protocolo e instalarán los certificados para que la herramienta pueda “abrir” el tunel HTTPS y visualizar las peticiones de entrada, sin embargo, la configuración correcta va mucho más allá de eso. Para que la herramienta funcione correctamente y cubra todo el tráfico HTTPS es necesario configurala como punto de negociación HTTPS para la infraestructura, de no ser así, como atacante, uno puede forzar a utilizar ciertos algoritmos criptográficos y suites de cifrado, al momento de la negociación HTTPS, para que la herramienta no pueda visualizar las peticiones.

UN POCO DE TECNICISMO:

En términos generales tenemos dos formas de establecer un tunel TLS para HTTP (HTTPS): En el protocolo handshake de TLS podemos utilizar algoritmo RSA para el intercambio de llaves criptográficas cuya llave pública está en el certificado y la privada instalada en la herramienta de seguridad o servidor, y algoritmo Diffie-Hellman y variantes (ECDHE, DHE, etc) cuya negociación se hace directamente en la memoria RAM del punto de negociación de HTTPS en el lado server y el user-agent del lado cliente. Las suites de cifrado más “fuertes” están hechas para que ni obteniendo la llave privada puedas descifrar el contenido que pasa por el tunel TLS y mejor aún, si logras tener una llave privada podrás descifrar contenido por pocos segundos ya que las llaves de cifrado de mensaje están cambiando frecuentemente. 

La forma de realizar un ataque sobre una infraestructura mal configurada para HTTPS es utilizar una suite de cifrado suficientemente robusta que realice el intercambio de llaves durante la negociación TLS utilizando el algoritmo Diffie-Hellman, ya sea efímera o con curvas elípticas. Cuando ocurre esta negociación el mensaje client-key-exchange del protocolo TLS handshake no utiliza la llave pública que recibió del certificado para enviar los bytes “pre-master secret”, si no que las memorias RAM de ambos entidades (punto de negociación server y user-agent) serán las únicas que tendrán los datos para generar la llave de cifrado principal de los mensajes y en las herramientas, aún teniendo el certificado y llave privada correspondiente, no serán capaces de llegar a la misma llave criptográfica, por ende no serán capaces de visualizar el tráfico en claro y proteger las infraestructura.

Usualmente estas herramientas mostrarán un mensaje del tipo “Unable to decrypt HTTPS” y, a pesar de que verán pasar el tráfico no verán su contenido. 

La forma en la cual podemos forzar a utilizar una suite de cifrado en particular es:

$ openssl s_client -cipher ECDHE-RSA-AES256-GCM-SHA384 -connect albertx.mx:443

Al realizar eso tendremos el escenario como el siguiente:

Por lo que lo recomendable es que la mejor solución de seguridad para aplicaciones que tenga su infraestructura sea el punto de negociación HTTPS. Con esto, independientemente de la suite de cifrado que utilicemos para negociar TLS, la herramienta podrá visualizar por completo todo el contenido bajo ese protocolo y proteger las aplicaciones de forma correcta.