Seguridad

Hacking de tarjetas NFC: MIFARE Classic 1k (Parte 2 de 4)

Ahora que sabemos un poco cómo funcionan estas tarjetas tal y como hemos visto en la primera parte de este artículo, veamos el tema de la comunicación. La comunicación entre el lector y la tarjeta sigue la norma ISO 14443 en su mayoría, salvo en la parte que define cómo se envían los comandos del lector a la tarjeta. Inicialmente se produce una autenticación, y a partir de entonces toda la comunicación está cifrada.

Figura 1: Hacking de tarjetas NFC: MIFARE Classic 1k (Parte 2 de 4)
Imagen Dall-e 2 “happy hacker with long hair in cyber punk digital art”

Si avanzamos un poco en esta parte para no hacerlo muy extenso, llegamos a la parte lógica en la que se basan estas tarjetas. En resumen, utilizan el algoritmo de cifrado CRYPTO1, del cual es propietario NXP Semiconductors (al igual que de las tarjetas MIFARE), y posee varias vulnerabilidades. Gracias a la ingeniería inversa que hicieron Nohl y Plotz sabemos cómo funciona. En la siguiente imagen podemos ver el esquema responsable de la inicialización del algoritmo:

Figura 11: Como se puede ver, las claves son de 48 bits de longitud,
lo que hace posible un ataque de fuerza bruta en un tiempo razonable.

Por otra parte, el LFSR (Linear Feedback Shift Register) utilizado por el RNG (Random Number Generator, o mejor dicho, PRNG, Pseudo-Randon Number Generator) es predecible, de forma que el número generado ya no es tan aleatorio, sino que depende del número de ciclos de reloj que hayan pasado desde que se activó la tarjeta (por medio del lector, recordemos que el lector es el elemento activo y la tarjeta el pasivo) hasta que se pide dicho número. Y aquí tenemos un esquema del algoritmo de cifrado:

Figura 12: Esquema del algoritmo de cifrado.

Esencialmente hay 2 tipos de ataques que se pueden realizar, el primero es mediante sniffing de la comunicación entre una tarjeta (o un emulador de la tarjeta, lo cual se puede hacer con una Proxmark) y un lector válido. El objetivo de este ataque es conseguir las claves que están involucradas en esta comunicación. Por ejemplo, si el lector solo necesita los datos del sector 9, únicamente las claves de este sector se transmitirán de una forma u otra. Con los datos de la conversación challenge-response entre el lector y la tarjeta, somos capaces de averiguar las claves.

El otro tipo de ataque es el que solo requiere una tarjeta válida, no el lector. Este tipo de ataque a su vez permite varios ataques conocidos, que pasamos a explicar a continuación:

Ataques a tarjetas NFC
Nota importante: No me he metido en profundidad en la matemática que hay detrás de los ataques que vamos a ver, por lo que esa parte simplemente quedará explicada en cierta manera. No obstante, la información proporcionada hasta ahora es suficiente para tener una comprensión notable sobre cómo funcionan los ataques, las debilidades que aprovechan, etc. Si alguien quiere profundizar más en esta materia, podrá encontrar mas información en los papers que se han mencionado.
Lo más habitual es que alguna de las claves sea fácil de conseguir, bien porque esté por defecto, porque es fácil de generar un diccionario (todo ceros, todo “F”), etcétera. Una vez que conocemos una clave, podemos probar el ataque “nested”.

1.- Nested Attack

Para realizar este ataque, como decimos, necesitamos conocer al menos una clave válida. Utilizando esta clave, nos autenticamos en el sector al que pertenezca (previamente al proceso de autenticación se lleva a cabo el proceso de selección, mediante el cual el lector es capaz de seleccionar la interacción con una tajeta en concreto, por si alguna más estuviera en su rango de campo electromagnético). En el proceso de autenticación, el lector (es decir, nosotros) envía una solicitud de autenticación en un sector concreto. 

Seguidamente, la tarjeta responde con un “nonce” (Nt), el cual debemos capturar. Posteriormente, el proceso de autenticación finaliza correctamente (puesto que conocíamos la clave). Siguiendo con el ataque, tenemos que autenticarnos de nuevo en el mismo sector y leer de nuevo el nonce Nt. Con estos dos datos y la diferencia en el estado del LFSR, podemos deducir el keystream y, por lo tanto, las sucesivas claves de los diferentes sectores.

2.- Hardnested Attack

En el caso de que el ataque anterior no sea posible porque el generador de número pseudo-aleatorios (PRNG) está parcheado, es posible intentar la autenticación en un sector concreto del que se conozca su clave e ir recopilando todos los Nt recibidos, del orden de 2.000-4.000. De esta manera, es posible realizar un ataque de fuerza bruta “offline” e intentar conseguir de esta manera la clave de un sector concreto.

3.- Dark Side Attack

Este tipo de ataque es un poco diferente. Durante la autenticación, el lector envía los parámetros Nr y Ar. La tarjeta, por su parte, al recibir estos parámetros comprueba primero los bits de paridad. Si cualquiera de ellos es incorrecto, deja de responder.

Figura 14: Parámetros Nr y Ar son enviados por el lector

Si todos son correctos, comprueba Ar y, si este es incorrecto, la tarjeta responde con un código de error 0x5 (NACK) de 4 bits de forma cifrada. Si ahora el lector hace un XOR de este código de error en texto plano con su forma cifrada, es capaz de obtener el keystream.

4.- Fixed Nonce (Static Nested)

Existe un tipo de tarjetas que, ante las vulnerabilidades anteriormente descritas, siempre envían el mismo nonce Nt, por lo que ya no es posible llevar a cabo estos ataques. Sin embargo, como veremos a continuación, en el Github del RRG (Rfid Research Group) se hicieron eco de este tipo de tarjetas y buscaron una solución. De hecho fue el propio iceman quien me informó tras ponerme en contacto con él de un issue abierto donde se discutía esta característica.

Probando los ataques

Pero basta ya de cháchara y pasemos a la acción. Todos los ataques anteriores se pueden hacer con la Proxmark, cargando el firmware del Github del RRG que acabamos de mencionar. Respecto a los ataques Nested y Hardnested, se pueden hacer también con las herramientas MFOC y MFOC-Hardnested respectivamente y para el ataque DarkSide MFCUK. Los pasos generales a seguir serían:

  • Probamos el ataque nested con MFOC
  • Si no encuentra ninguna clave, probamos DarkSide con MFCUK contra un sector concreto. Si encuentra la clave, volvemos a lanzar MFOC utilizando esta clave.
  • Si el PRNG no es vulnerable y ninguno de los métodos anteriores funciona, utilizamos el ataque hardnested con MFOC-Hardnested. Pero para ello debemos conocer al menos una clave. Es muy raro que alguna de las claves no esté por defecto, pero siempre podemos generar diccionarios e ir probando.
  • Si ninguno de los anteriores ataques funciona, utilizaríamos la herramienta del RRG para Proxmark, para las tarjetas con “fixed nonce”.

¡Vamos allá! Disponemos de este lector, así que, como hemos dicho, comencemos por lo más común que es lanzar primero MFOC, desde nuestro Kali Linux, que comprobará si alguna de las claves de la tarjeta están por defecto. 

En ese caso, se lanzará el ataque Nested para obtener el resto de claves: 
  • mfoc -O dump.dmp

Figura 17: mfoc desde Kali Linux (Parte 1)

Figura 18: mfoc desde Kali Linux (Parte 2)

Así hasta que finalmente encuentra las claves que faltan (las B del sector 11 al 15), como se ve en la imagen siguiente:

Figura 19: Encontrada la clave B

Y posteriormente hace un volcado de la tarjeta, con lo que tenemos una copia completa de todos los datos:

Figura 20: Dump completo de la tarjeta MIFARE

En caso de no conseguir ninguna clave con el ataque anterior, podemos probar a lanzar el ataque Darkside con MFCUK contra un sector concreto y, si obtenemos alguna clave, lanzar posteriormente MFOC para obtener el resto de claves. Lo vemos en la siguiente parte de este artículo.

Saludos,
**********************************************************************************************
– Hacking de tarjetas NFC: MIFARE Classic 1k (Parte 3 de 4)
– Hacking de tarjetas NFC: MIFARE Classic 1k (Parte 4 de 4)
**********************************************************************************************
Autor: Sergio Saiz

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.