Hacking de tarjetas NFC: MIFARE Classic 1k (Parte 2 de 4)
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:
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:
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:
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.
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.
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.
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.
Figura 16: Pentesting con Kali Silver Edition de Pablo González en 0xWord |
- mfoc -O dump.dmp
Así hasta que finalmente encuentra las claves que faltan (las B del sector 11 al 15), como se ve en la imagen siguiente:
Y posteriormente hace un volcado de la tarjeta, con lo que tenemos una copia completa de todos los datos:
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.
Powered by WPeMatico