elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Seguridad
| | |-+  Criptografía (Moderador: kub0x)
| | | |-+  Recuperar RSA private key Desde una session tls
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recuperar RSA private key Desde una session tls  (Leído 4,120 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Recuperar RSA private key Desde una session tls
« en: 23 Mayo 2016, 15:18 pm »

Como.me gustaria ver esa platica...

:https://www.blackhat.com/us-16/briefings/schedule/#recover-a-rsa-private-key-from-a-tls-session-with-perfect-forward-secrecy-3046

Citar
In certain circumstances it is possible to derive the private key of server regardless of the size of the used modulus. Even RSA keys of 4096 bits can be factored at the cost of a few CPU cycles and computational resources.

¿Alguien sabe algo del tema?

Saludos


En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Recuperar RSA private key Desde una session tls
« Respuesta #1 en: 23 Mayo 2016, 19:12 pm »

Buenas,

intentaré dar una explicación detallada del por que del problema, además de su aplicación matemática y resolución. A través de los conceptos aquí descritos sereís capaces de poder factorizar el módulo semiprimo RSA.

El paper en cuestión es : https://people.redhat.com/~fweimer/rsa-crt-leaks.pdf

Lo primero, voy a completar la sentencia del problema inicial, puesto que en primera instancia parece simple, pero han de darse unas condiciones de fallo en el sistema para poder realizar la factorización. Completo citando el abstracto del paper:

Citar
All that needed is the generation of a faulty digital signature from server, an event that can be observed when occurring certain conditions such as

Como vemos el servidor tiene que generar una firma digital de forma errónea, evento que puede suceder cuando se dan ciertas condiciones como errores de hardware, sobrecarga de módulos, inundación etc. Además la implementación de RSA debe de contar con la optimización CRT.

¿Qué es la optimización CRT?

Una de las aplicaciones del Chinese Remainder Theorem (CRT) es optimizar el coste computacional que conllevan las operaciones en el grupo multiplicativo modulo pq, concretamente las exponenciales modulares. La optimización se realiza computando los residuos sobre los módulos primos (por separado) y aplicando CRT sobre dichos residuos y módulos primos para así obtener el residuo en el módulo principal pq. El taller sobre el CRT lo podeís consultar aquí: https://foro.elhacker.net/criptografia/taller_chinese_remainder_theorem-t452361.0.html

Por lo tanto la optimización por CRT divide las operaciones en dos grupos multiplicativos módulo p y q (por separado) y luego reagrupa en pq mediante CRT. Este concepto se llama Residue Number System https://en.wikipedia.org/wiki/Residue_number_system .

Ahora abordemos la vulnerabilidad planteada en el paper:

Es bien sabido que al hablar de Perfect-Forward Secrecy nos referimos a las suites criptográficas que cuentan con algorítmos ephemeral, es decir, aquellos que en cada negociación TLS utilizan una clave asimétrica distinta, por lo tanto si un atacante rompiera una clave el mismo sólo tendría acceso a la clave simétrica (AES, TDES..) de esa sesión, pero no a las demás claves simétricas de sesiones distintas. En cambio si rompes RSA podrás descifrar todas las claves de sesión capturadas. Esta es el concepto del porque del esfuerzo para migrar a suites que incluyan Perfect-Forward Secrecy.

Hay una gran diferencia entre una sesión TLS negociada sólo con RSA+simétrica o con RSA+ECHDE/DHE+simétrica.

Veamos que sucedería si el servidor malfuncionara a la hora de realizar una sesión TLS utilizando una suite con Perfect-Forward Secrecy:

Con las suites que incluyen Perfect-Forward Secrecy (Ephemeral crypto) sucede un nuevo evento llamado ServerKeyExchange, donde el servidor envía su clave pública y una firma digital sobre la misma, que es un hash firmado por la clave pública RSA del certificado.

Si a la hora de computar la firma digital sobre los dos grupos multiplicativos modulares en p y q, fallará al hacerlo en p y lo hiciera bien en q, tendríamos un escenario con la siguiente información:

yp = x'd (mod p)
yq = xd (mod q)

Por lo que vemos que x' y x son distintas y deberían de ser iguales (para cumplir el CRT y la firma digital), por lo tanto se ha cometido un error al denotar x'.

Si pasamos mediante CRT yp e yq a yn tendríamos la representación final:

yn = yp*q*[q]-1p + yq*p*[p]-1q (mod pq)

donde [q]-1p es la modular multiplicativa inversa de q en p es decir q-1 = qp-2 (mod p)
y [p]-1q es la modular multiplicativa inversa de p en q es decir p-1 = pq-2 (mod q)

Vease que la modular multiplicativa inversa con módulo primo siempre tendrá exponente p-2 ya que el exponente se obtiene mediante:

phi(p)-1 y como p es primo, phi(p) = p - 1 por lo tanto phi(p) - 1 = p - 2

yn = x''d (mod pq)

Notése que x'' no es x, y debería de ser x en un escenario sin fallos (cumpliendo el CRT). Esto quiere decir la verificación de la firma digital nunca será x, ya que hemos utilizado dos x distintas, por lo tanto el destinatario fallará al validarla, pero el atacante (NOSOTROS) tendríamos la siguiente información:

x'' = yne (mod pq)

gcd(x'' - x, n) = q, por lo que q es un múltiplo de x'' - x. Fijaos en la ecuación del CRT para verificar la multiplicidad.

Un ejemplo en C#, el código de abajo selecciona dos primos p,q y computa la clave privada d, el exponente público e y la clave pública n (p*q).

Después selecciona dos valores x y x''. Recordad que para que funcione RSA con la optimización CRT los valores de x han de ser iguales (principio del CRT), por lo tanto mi código se aprovecha de la vulnerabilidad descrita en este post.

Lo siguiente que hará el code es computar el CRT de yp e yq y dejarlo en la variable CRT para así factorizar el módulo pq mediante el gcd del módulo pq con el descifrado de CRT menos x. El resto del gcd es el factor primo q del módulo.

En un escenario real el cliente tendría los valores de las variables, CRT, e, x y n, el resto de operaciones las calcula el server, vamos que es 100% aplicable en un escenario real.

Código
  1. static void Main()
  2.        {
  3.            using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider(512))
  4.            {
  5.                RSAParameters rsaparams = csp.ExportParameters(true);
  6.                p = FromBigEndian(rsaparams.P);
  7.                BigInteger n = FromBigEndian(rsaparams.Modulus);
  8.                BigInteger d = FromBigEndian(rsaparams.D);
  9.                BigInteger e = FromBigEndian(rsaparams.Exponent);
  10.                BigInteger q = FromBigEndian(rsaparams.Q);
  11.                if (p < q)
  12.                {
  13.                    BigInteger swap = q;
  14.                    q = p;
  15.                    p = swap;
  16.                }
  17.                BigInteger x = BigInteger.Parse("126858358328568235238789");
  18.                BigInteger xpr = BigInteger.Parse("87281629769238657836258");
  19.                BigInteger yp = BigInteger.ModPow(xpr, d, p);
  20.                BigInteger yq = BigInteger.ModPow(x, d, q);
  21.                BigInteger invqp = BigInteger.ModPow(q, p - 2, p);
  22.                BigInteger invpq = BigInteger.ModPow(p, q - 2, q);
  23.                BigInteger CRT = BigInteger.Remainder(yp * q * invqp + yq * p * invpq, n);
  24.                //El cliente dispone del valor CRT, e, n y x pues los entrega el server
  25.                BigInteger gcd = BigInteger.GreatestCommonDivisor(BigInteger.ModPow(CRT,e,n) - x, n);
  26.                Console.WriteLine("q is {0} = " , gcd);
  27.            }
  28.        }
  29.  

Estaré encantado de responder cualquier pregunta.

Saludos!


« Última modificación: 23 Mayo 2016, 19:51 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Recuperar RSA private key Desde una session tls
« Respuesta #2 en: 24 Mayo 2016, 01:33 am »

Excelente la base teorica muy bien explicada y ahorita que llegue a mi casa probare el codigo para testearlo por mi mismo y ahora bien.

Ya sabia que serias tu el que responderia.

Citar
Veamos que sucedería si el servidor malfuncionara a la hora de realizar una sesión TLS

¿Que tipi de fallo podria ocasionar esto?

Por que segun yo no es un fallo de programacion.
« Última modificación: 24 Mayo 2016, 01:45 am por AlbertoBSD » En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Recuperar RSA private key Desde una session tls
« Respuesta #3 en: 24 Mayo 2016, 08:49 am »

Este ataque tiene historia, antes de ser comentado en la BlackHat, nuestro querídismo Lenstra ya lo había propuesto en un paper del año 96 lo único que teorizándolo. Como bien sabemos a los chicos de la BlackHat les encanta el lema de "exploiting everywhere" por lo tanto se trabajaron este nuevo paper y demostraron lo que Lenstra teorizó, explotando unos cuantas sesiones TLS y explicando más o menos en que consisten los fallos.

El paper de la BlackHat está en el post inicial, 3ª línea.
El paper de Lenstra es : https://infoscience.epfl.ch/record/164524/files/nscan20.PDF

Los de BlackHat nos dan las siguientes premisas para que un fallo suceda en la computación del Residue Number System con isomorfismo a Z/nZ:

- La librería de precisión aritmética múltiple utilizada en la implementación de RSA tiene un defecto que produce malos resultados. Revisar CVE-2014-357.
- Puede haber una race condition de acceso a datos entre hilos no sincronizados, por lo tanto ya sabemos que sucede aquí (nefasto).
- Fallos en la unidad aritmético lógica de la CPU de forma determinista en base a http://iacr.org/archive/crypto2008/51570222/51570222.pdf o dependiendo de unas condiciones de entorno.
- http://eprint.iacr.org/2002/076.pdf
- Otros módulos del PC como la cache o la RAM han sido alterados, cambiando los valores del Reduced Number System.

Saludos!
« Última modificación: 24 Mayo 2016, 15:55 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Recuperar RSA private key Desde una session tls
« Respuesta #4 en: 24 Mayo 2016, 13:25 pm »

Muchas gracias kub0x le dare tiempo a cada paper ahorita estoy leyendo  este


- Fallos en la unidad aritmético lógica de la CPU de forma determinista en base a http://iacr.org/archive/crypto2008/51570222/51570222.pdf o dependiendo de unas condiciones de entorno.


Ya habia escuchado de este tipo de fallos pero no habia visto el alcance que pueden tener.

Tus aporte son Geniales.

Saludos!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
recuperar contraseña de administrador de dominio desde
Hacking
byron_21 0 4,228 Último mensaje 28 Noviembre 2010, 15:44 pm
por byron_21
[Python] Acceder a ftp y recuperar ficheros desde una fecha
Scripting
lnvisible 1 4,878 Último mensaje 7 Febrero 2011, 05:52 am
por lnvisible
Recuperar descarga desde archivo.part
Dudas Generales
79137913 0 2,051 Último mensaje 21 Junio 2012, 19:15 pm
por 79137913
recuperar mensajes y contactos desde la SIM
Dispositivos Móviles (PDA's, Smartphones, Tablets)
roaco33 1 2,427 Último mensaje 30 Diciembre 2012, 02:04 am
por roaco33
Recuperar clave desde Hex
Hacking Wireless
[u]nsigned 1 2,242 Último mensaje 8 Abril 2013, 01:50 am
por P4nd3m0n1um
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines