Pégale un vistazo a otros posts de esta serie:
[1] NTP MitM con Delorean
[7] Otros ataques
[8] Herramientas de ayuda
Descargo de responsabilidad: Toda la información se ha obtenido de una forma empirica, realizando pruebas, y en un periodo de tiempo concreto, con lo que puede haber cambiado en el momento de leer este artículo.
[1] NTP MitM con Delorean
[7] Otros ataques
[8] Herramientas de ayuda
Descargo de responsabilidad: Toda la información se ha obtenido de una forma empirica, realizando pruebas, y en un periodo de tiempo concreto, con lo que puede haber cambiado en el momento de leer este artículo.
Descargo de responsabilidad (2): En este artículo hablo de certificados, claves SSL, etc. En ocasiones diré cosas como "la clave privada del certificado", ya que es la manera en la que normalmente me expreso, aunque probablemente no sea el término más correcto. Debería decir cosas como "la clave privada de la clave pública del certificado", pero creo que resulta más sencillo de entender si lo simplifico un poco. En cualquier caso, si algo no se entiende bien solo tenéis que mandarme un correo o dejar un comentario e intentaré aclararlo.
De los ataques en los que he estado trabajando desde que empecé con esta investigación, el ataque contra PKI es mi favorito. Es algo que me vino a la cabeza cuando me paré a pensar que más servicios o protocols podrían funcionar mal si conseguía manipular el reloj de un equipo.
Como probablemente sepáis, un certificado SSL es válido bajo las siguientes condiciones:
- Ha sido firmado por una entidad de certificación de confianza (CA) o por una CA intermedia que a su vez a sido firmada por una CA de confianza.
- El "Common name" del certificado coincide con el hostname del servidor (los comodines están permitidos).
- La fecha actual está entre las fechas "Not valid before" y "Not valid after".
Para poder usar un certificado de esta manera, necesitamos que éste cumpla una serie de condiciones:
- Tenemos que reconstruir la antigua cadena de certificados: Esto no es un problema, ya que los certificados de las CAs normalmente tiene periodos de valicez muy largos, así que probablemente la cadena de certificados actual también funcionará con el certificado antiguo. Sino, es fácil encontrar los certificados buscando el "Issuer name" del certificado en Internet.
- La root CA (la que empieza una cadena de certificados) tiene que ser ua CA de confianza para el sistema operativo/navegador: Si la root CA expira y se elimina de la base de datos del navegador, éste no será capaz de validad la cadena de certificados. Este problema solo ocurre con la root CA, que es la que debe estar instalada en el navegador. Cualquier otra CA intermedia se pude usar a pesar de que se encuentre expirada.
- Tenemos que encontrar certificados viejos de hosts: Esto es más difícil de lo que parece. Lo veremos un poco más abajo.
- Tenemos que poder obtener la clave privada deel certificado de host: Esta es la única clave privada que necesitamos obtener. Al ser un certificado viejo, su clave debería ser más fácil de obtener que en un certificado actual. Hablaremos de esto más adelante también.
Desafortunadamente, los objtivos más importantes (Google, Facebook, etc) ya no usaban RSA-512 en 2010. Quizá si tuvieramos una base de datos más antigua... En cualquier caso, encontré algunos certificados interesantes y algunos bastante divertidos, como por ejemplo una página de Disney (no la página principal).
Descargo de responsabilidad (3): Cuando hago una demo con Deloran y uso una página web, NO estoy atacando esa página. La página NO es vulnerable. Estoy atacando un clinte vulnerable, que es mi propia máquina de pruebas, así que me estoy atacando a mi mismo, no a la página web.
No voy a contar paso por paso como crackear un RSA-512 porque sería un artículo (o varios) en si mismo, y porque tampoco es un tema en el que yo sea un experto. Si tenéis interés, os dejo algunos enlaces [1][2][3][4]. Resumiento, tuve 4 máquinas en EC2 corriendo durante 3 días (si no recuerdo mal) y al final costó al rededor de $150 en total.
¡Funciona! La cadena de certificados es válida y tenemos la clave privada, así que podemos engañar al navegador e impersonar la página ¡Genial!
Por lo que he podido leer (no soy un experto), los Gobiernos y otros organismos con suficientes recursos podrían crackear RSA-1024 en un tiempo razonable. Ésto es aún más interesante que mi demo, porque RSA-512 en estos momentos está baneado en la mayoría de navegadores, así que estos rechazarían la cadena de certificados, aunque ésta sea válida. Hice esta demo usando un RSA-512 porque en este momento yo no dispongo de la capacidad computacional para crackear RSA-1024, y porque el proceso es exactamente el mismo, con lo que podríamos hacer lo mismo con un RSA-1014 en un navegador completamente actualizado si dispusieramos de esta potencia.
Ésta no es la única debilidad que podemos usar:n use:
- Claves hackeadas
- Claves extraidas con Heartbleed
- Firma de certificados débil (consultar "MD5 considered harmful today")
- Claves generadas con el bug de Debian PRNG
- Muchas más...
Cuando me encontré con este problema, la pregunta que vino a mi cabeza fue: ¿Esas CRLs guardan TODOS los certificados revocados? ¿Desde el principio de los tiempos? Eso haría que el fichero fuera ENORME, lo cual podría afectar al rendimiento. Bien, no puedo estar 100% seguro de esto, pero hice unas rápidas pruebas para ver si las CAs purgan sus CRLs cuando los certificados revocados caducan.
OCSP no resulta muy útil contra estos ataques, ya que la mayoría de los navegadores están configurados para aceptar los certificados cuando no pueden validar si están revocados o no, con lo que un atacante únicamente tiene que bloquear las conexiones contra OCSP para que sus certificados revocados sean aceptados. Más informacion AQUÍ.
De la lista de antes, me decidí a buscar certificados generados con el bug de Debian PRNG. El problema era que ésto ocurrió en 2008, mientras que la base de datos de la que disponemos era 2010, así que todas las páginas web interesantes habían cambiado ya su certificado antes de 2010.
Buscando por Internet encontré CodeFromThe70s. Esta gente desarrolló un plugin para Firefox que detectaba los certificados vulnerables y se los enviaba. Ellos mantenían una blacklist genial en su página que nos podémos descargar y usar para ver si aún estarán revocados o no.
El siguiente paso fue obtener la clave privada. No fue tan fácil como pensaba, porque las listas pre-generadas que publicó HD Moore eran para SSH, así que tuve que generarme las mias propias para HTTPS. Lo que hice fue usar el "getpid.so" parcheado original y el entorno "ubunturoot" (el enlace original está roto, así que yo me lo bajé de aquí), y desarrollé un par de scripts en shell para generar todas las posibles claves SSL y comprobar si era la que estaba buscando:
$ cat keyfind.sh
#!/bin/bash
TARGET=0123456789abcdef0123456789abcdef
for PID in `seq 1 32768`
do
chroot . /generate.sh $PID &>/dev/null
openssl rsa -in private.pem -noout -modulus | openssl md5 | awk '{print $2}' | grep "$TARGET"
if [ $? -eq 0 ]
then
cp private.pem found.pem
echo "FOUND!"
exit
fi
rm -f private.pem
echo $PID
done
$ generate.sh
#!/bin/bash
export MAGICPID=$1
export LD_PRELOAD=/getpid.so
/usr/bin/openssl genrsa -out private.pem 1024 &>/dev/null
En unas pocas horas tenía la clav privada. Quizá hubiera sido más eficiente de otro modo, pero funcionó al fin y al cabo. Veamos la demo:
Mi charla de DEF CON ( 7 de Agosto de 2015) está online, así que también le podéis pegar un ojo. También presenté la charla en Español en RootedCON (Marzo 2015) y NavajaNegra/ConectaCON (Octubre 2015),pero los videos aún no han sido publicados:
3 comentarios :
Muy interesante articulo Jose.
Sobre el comportamiento de si en el CRL deberian estar los certificados revocados no expirados, aqui tienen una bonita discusion acerca de como interpretar lo que dice el RFC
http://sourceforge.net/p/ejbca/mailman/message/27787250/
En este otro articulo de diseño de PKI con la CA de Microsoft directamente mencionan "A Base CRL is a CRL that contains all non-expired revoked certificates"
http://blogs.technet.com/b/xdot509/archive/2012/11/26/pki-design-considerations-certificate-revocation-and-crl-publishing-strategies.aspx
Desde el punto de vista del rendimiento, bajarse una CRL de una CA de 10 años de validez con todos los serials que ha podido revocar puede ser una pesadilla, aunque ya se encargan los OS o browsers de hacerlo en segundo plano y cachearlo...
Gracias kRiZiO, los enlaces que pones son muy interesantes :)
Yo al leer el RFC me encontré con lo mismo que comentan en la discusión de sourceforge, que no dice ni que sí, ni que no, ni todo lo contrario. En realidad lo único que dice es que debe permanecer en la CRL mientras el certificado sea válido, pero no dice nada sobre que pasa después.
En mi opinión, los mecanismos de revocación actuales dejan mucho que desear, porque guardar en una CRL todos los certificados revocados de la historia no me parece nada escalable. Para solucionar el ataque con Delorean yo optaría por secularizar los mecanismos de sincronización de tiempos, porque lo de las CRLs... puede ir para largo.
Hola,
Jose, cuando dices "secularizar" te refieres a "securizar" o es realmente secularizar?
Imagino que sólo es un error de escritura y te refieres a que debería securizar la sincronía de tiempos de las maquinitas ^^
Enorme trabajo el tuyo! No dejes de hacerlo nunca!!! Enhorabuena
Publicar un comentario