miércoles, agosto 12, 2015

Atacar la seguridad HTTPs con un Delorean en Python

Entre la lista de conferencias que se han dado este año en DefCon 23 hay una que tenía ganas de revisar, ya que la daba uno de los mejores hackers españoles, el gran José Selvi. Sus trabajos son siempre elegantes e ingeniosos, como cuando migró JailBreakMe a JailOwnMe para ownear los terminales iPhone - tanto me gustó que le pedí que lo detallara paso a paso para incluirlo en el libro de Hacking iOS -. En esta ocasión, su charla en Las Vegas versaba sobre cómo romper la seguridad de las conexiones HTTPs por medio de un Delorean, una que ya había impartido en Black Hat Europe 2014 pero que no había podido ver todavía.

Figura 1: Atacar la seguridad de HTTPs con un Delorean en Python

Sí, el uso de un Delorean es una forma de hacer entender a todo el mundo que el ataque tiene que ver con las medidas de seguridad que dependen de la fecha del sistema operativo y que, por fallos de seguridad en el protocolo NTP, pueden ser manipuladas para hacer viajar en el tiempo al sistema. Si cuando hablamos de Leap Seconds vimos lo mal que le podía venir a al sistema un segundo introducido, os podéis imaginar si hacemos viajar en el tiempo a los sistemas informáticos durante más tiempo. 

Figura 2: Saltar la seguridad de HSTS con un Delorean

La presentación de la charla la tenéis colgada dentro de la recopilación que han hecho nuestros amigos de Cyberhades con todo el material de DefCon 23, y merece la pena que la veas - incluidas las preciosas fotos de esa ciudad de Valencia tan bonita que tenemos en España -, y en la web de BlackHat Europe 2014 tienes acceso a un WhitePaper donde se recoge el trabajo.

Implementaciones de NTP en sistemas operativos

En la lista de sistemas operativos que ha analizado José Selvi se encuentran Ubuntu, Fedora, OS X y Windows. Todos ellos hacen uso de una forma u otra del protocolo NTPv3 o NTPv4 con configuraciones susceptibles de sufrir un ataque de man in the middle. Esto quiere decir que, un atacante, podría interceptar la petición de sincronización NTP emitida por el sistema operativo y darle una hora arbitraria para configurar de forma maliciosa la hora del sistema operativo.

Figura 3: Petición NTPv4 de Ubuntu vulnerable a man in the middle

Para hacer esto, hay que utilizar algún esquema de man in the middle en redes IPv4 o IPv6 que permita interceptar la petición NTP del cliente. Aceptando que en una red insegura - sin IPSec o sin posibilidad de bloquear los ataques de man in the middle - el protocolo NTP es vulnerable, las medidas de mitigación que tienen los sistemas operativos se basan por tanto en reconocer si alguna de estas peticiones puede reconocerse como maliciosa.

En las diferentes implementaciones Fedora es que más fácil lo pone, ya que hace una petición cada minuto y por tanto se le pueden hacer cambios en la fecha del sistema constantemente. En el caso de Ubuntu la sincronización es cuando se levanta la conexión de una nueva red o se produce un reinicio. En OS X se hace cada ciertos minutos, pero en las últimas versiones depende de la carga de trabajo que tengo el sistema.  Windows es el que lo pone más complicado, ya que tarda días en hacer las peticiones, además de que no permite cambios muy grandes en los tiempos, desechando las peticiones que vienen con grandes saltos, dejando una ventana muy pequeña de ataque.

Figura 4: Cuatro de los cinco modos de funcionamiento que tiene Delorean para viajar en el tiempo

Visto esta primera parte, el resumen sería que, con mayor o menor grado de exposición, si un equipo se conecta a una red insegura, su fecha del sistema puede ser alterada de forma maliciosa por medio de una herramienta escrita en Python, que José Selvi ha bautizado como Delorean.

Ataques a HSTS con el Delorean

Visto esto, que un equipo tenga una fecha maliciosa puede ser aprovechado por un atacante para hacerle mucho daño a un equipo. Uno de los ejemplos que propone José Selvi es el de atacar el protocolo HSTS. Este protocolo cierra la posibilidad de ataques Man in The Middle que se producen cuando se utilizan conexiones HTTP, ya que con HSTS se fuerza al navegador a que la conexión sea siempre por HTTPs cuando un dominio esté en la lista. Esto se hace mediante la configuración del HTTP Header HSTS que envía el servidor web en la primera conexión. A partir de ese momento se le impide al navegador conectarse a un dominio por HTTP mientras el TTL configurado por el HSTS sea mayor que cero. Es decir, que no haya caducado.

Desde las URLs internas de Google Chrome, puedes consultar el estado de la política HSTS que tiene tu navegador para cada dominio, así como los datos del certificado que se espera encontrar al otro lado para que no le den uno falso. Es decir, no solo la política de HSTS, sino también cuál es el certificado del que se está haciendo Certificate Pinning.

Figura 5: Configuración de HSTS para el dominio www.gmail.com en Google Chrome

Sin embargo, usando el Delorean alguien puede llevar la fecha más allá en el tiempo, hacer que caduque el TTL de la configuración HSTS y conseguir una petición HTTP a un dominio para lograr hacer, ahora sí, un ataque de SSLStrip, como el que hacía yo con Evil FOCA para robar las cuentas de Facebook o Gmail usando el ataque de WPAD.
A día de hoy esto no es posible con todos los dominios, ya que algunos navegadores tienen listas preconfiguradas en el código, es decir, hardcodeadas, de conexiones HSTS que no van a realizarse nunca por HTTP - ni la primera vez -. Esta lista la gestiona Google Chrome y la utilizan otros navegadores. Además, cualquiera puede solicitar estar en esa lista mediante este sitio web.

Figura 7: Configuración de política de expiración en lista precargada de certificados

Por suerte o por desgracia, los certificados de esa lista también dependen del tiempo y expiran - y no tardando mucho ya que algunos son horas, otros como Google Chrome 10 semanas -, así que es posible hacer caducar la lista precargada en los navegadores y forzar la conexión HTTP a un sitio web para lograr interceptarla y hacer un man in the middle a esa conexión.

Usando certificados digitales expirados

Otra de las cosas curiosas que se pueden hacer es la de llevar con el Delorean la fecha del sistema a un tiempo en el pasado, con el objeto de lograr que los certificados que hubieran expirando antaño o que hayan sido marcados como caducados, vuelvan a ser válidos. 

Figura 8: Certificado de Diginotar firmado para Google.com que se bloqueó

Así, por ejemplo, José Selvi explica cómo se puede engañar a un navegador para que vuelva a dar por válidos los certificados robados a Diginotar que se hicieron para firmar dominios como Google.com o Live.com. Pero también para conseguir que certificados de las listas CRL que han sido marcados como caducados vuelvan a poder usarse.

Los planificadores de tareas y las actualizaciones de seguridad

Por último, una de las cosas más curiosas que se producen es que, si un equipo cambia su fecha y su hora, todo su planificador de tareas puede dejar de funcionar. Esto hace que las tareas de mantenimiento puedan no realizarse a tiempo o incluso no hacerlo nunca. En el caso de Windows, una de las cosas que se puede hacer es llevar la fecha del sistema a un tiempo en el futuro, y cuando se planifique la siguiente actualización de software mediante Windows Update, volver a llevar el sistema a su hora actual. Esto, como efecto lateral dejaría a un equipo sin actualización de parches de seguridad.

Figura 9: Configuración de Windows Update para febrero de 2016

Mis más sinceras felicitaciones a José Selvi por este trabajo. De que forma tan sencilla ha enlazado los ataques de man in the middle, las debilidades NTP - que ya eran conocidas - con la seguridad de HTTPs para lograr, con una herramienta sencilla escrita en Python cargarse su seguridad en ciertos entornos. Me encanta.

Saludos Malignos!

4 comentarios:

Anónimo dijo...

No esta mal te has enterado casi 6 meses después q lo publicara en la rooted... :)

Chema Alonso dijo...

@Anónimo... ¡y lo que me queda por aprender! Mira que intento seguir todo, pero no me da tiempo.

Saludos!

Juan Cercas dijo...

Pues yo tampoco lo conocía y le agradezco a Chema Alonso su magnífica explicación y su dedicación diaria a este blog.

Anónimo dijo...

Pues a mi me viene genial que Chema se moleste en traernos a su blog todo aquello que él vaya aprendiendo, ya que este "mundillo" no para de actualizarse y aquellos script-kiddies como yo que quieren ir más allá y entender mejor el funcionamiento de los protocolos, las cookies y demás -mediante ejemplos que podamos aplicar- necesitamos este tipo de entradas que nos sirven de "empujón" para animarnos a no quedarnos sólo en simples tutoriales que te explican paso a paso cómo hacerlo, sino que yo prefiero mil veces que nos den documentación y que ya luego nos busquemos la vida.
Un saludo enorme y muchísimas gracias por mantener el blog up-to-date, cómo se suele decir..

$WhP

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares