Hacking NFC

Tras el último artículo publicado hace unos meses sobre cómo poner a punto el firmware y software de nuestros juguetes Proxmark3 y Chameleon, ahora vamos a ver un par de cosas sobre cómo usarlos y algunos ataques típicos sobre tarjetas NFC/RFID. Damos por hecho que tienes ya tu Proxmark lista y funcionando, y si no, echa un vistazo a dicho artículo en la siguiente url:

https://www.hackplayers.com/2021/07/nfc-proxmark3-chameleon.html

Existen otros dispositivos y softwares disponibles (mfoc, myLazyCracker, RFIDiot por ejemplo) para realizar estas y otras acciones en el mundo del NFC pero nosotros nos centraremos en la Proxmark3.

Identificando el tipo de tarjeta

Lo primero es identificar el tipo de tarjeta con la que vamos a trabajar. Si no sabemos qué tipo de tarjeta es, podemos lanzar un par de comandos para intentar identificarlo. Uno es para identificar si la tarjeta es NFC (high frequency 13.56MHz) y el otro por si es RFID (low frequency 125KHz). Son estos comandos:

hf search

lf search

Si no acertamos con el comando, probablemente no obtendremos ningún dato, pero si acertamos con el tipo de tarjeta y el comando adecuado, leeremos la tarjeta y se identificarán algunos datos básicos como son el UID (ahora pasaremos a explicar que es esto), el tipo de tarjeta, datos de la firma, etc.

Algo muy común que puede pasar es que al intentar leer la tarjeta por ejemplo con el comando “hf search” nos de un error del tipo “No known/supported 13.56 MHz tags found”. Si estás seguro de que el tipo de tarjeta es correcto pero ves ese mensaje, la solución es sencilla. Eso pasa con algunas tarjetas y basta con separar un par de centímetros la tarjeta del lector sujetándola con la mano mientras lanzamos el comando en lugar de dejar la tarjeta apoyada encima de la Proxmark. Muchas veces basta con eso para que ya la lea correctamente. Es un problema típico y muy frecuente en tarjetas chinas baratas de baja calidad.

Existen múltiples tipos (y subtipos) de tarjetas tanto de RFID como de NFC (T5577, Ultralight, Desfire, 4k) con diversas características. Para la redacción de este artículo en el primer ejemplo, hemos escogido una tarjeta bastante estándar. Una tarjeta NFC (es decir de high frequency) MIFARE Classic 1k.

UID

Antes de seguir, solo aclarar un poco más en profundidad que es el UID. Como sus siglas indican, es un “Unique Identifier” o Identificador Único que servirá a los lectores de tarjetas para diferenciar esta tarjeta de otras del mismo tipo. Este sector en principio es de solo lectura (salvo por las excepciones que luego veremos), contiene de 3 a 10 bytes (normalmente 4 bytes) y es de acceso libre para que los lectores lo puedan leer y así identificar de forma única las tarjetas… o al menos esa era la idea inicial. También reseñar que este bloque tras la fabricación de miles de millones de tarjetas podría no ser único. Además de que como veremos, las tarjetas se pueden clonar…

Leyendo los datos de la tarjeta

Tras el inciso aclaratorio del punto anterior, pasamos a lanzar un comando para leer la tarjeta en cuestión especificando el tipo de tarjeta ahora que sabemos cuál es (Mifare 1k):

hf mf chk --1k

La anterior imagen muestra los sectores que se han podido leer de la misma. Vemos en la columna “res” que hace referencia a “result” que todo lo que tiene un 1 es que se ha podido leer correctamente y lo que tiene un 0 es que no se ha podido leer. En este caso esta tarjeta tiene la clave por defecto ffffffffffff en casi todos sus sectores. Dicha clave (y otras) son probadas automáticamente al hacer este comando y es por eso que se han podido leer muchos sectores.

Ahora bien, para poder clonar una tarjeta necesitamos poder leerla completamente, así que la misión ahora es conseguir la clave de esos sectores 2 y 3 de la parte A que no se han podido leer correctamente.

Averiguando las claves que nos faltan

Para realizar este paso, hay varias formas de proceder. Podemos hacer uso de diccionarios de claves típicas de 12 dígitos hexadecimales y esperar tener suerte de igual forma que haríamos un ataque de diccionario normal y corriente a una contraseña de cualquier otro tipo, y podría ser que la clave fuera descubierta de esta forma si coincide que se encuentra en el diccionario utilizado. También hay ataques que aprovechan vulnerabilidades o bien en algoritmos matemáticos del cifrado, o bien de la implementación en la tarjeta dependiendo de la versión. Vamos a repasar algunos de estos ataques, comentando en qué se basan y viendo como es la nomenclatura de los comandos para poder reproducirlos.

Darkside attack

Este ataque es útil cuando no conocemos ninguna clave de la tarjeta en cuestión. Es decir, cuando no hemos podido leer ni un solo sector. Es decir, cuando al leer una tarjeta recibamos una pantalla de este tipo:

Este ataque trata de explotar una debilidad en el cifrado CRYPTO1 de Mifare. No obstante, hoy en día este ataque es complicado que funcione pues solo es efectivo si la tarjeta es bastante antigua (hasta 2012 aprox). De todas maneras, no sobra mencionarlo aunque no es útil para nuestro caso particular ya que nosotros ya conocemos algunas claves de nuestra tarjeta y no aplicaría. Se ha escogido otra tarjeta distinta para este apartado concreto y así poder mostrar el ataque. Se lanzaría con este comando:

hf mf darkside

Si tenéis oportunidad y encontráis alguna tarjeta muy antigua de la que no se pueda leer ni un solo sector con las claves por defecto, podéis lanzarlo y muy probablemente sacará una clave. Ahora veremos que esto es importante ya que sólo con una clave se puede avanzar bastante...

Nested attack

Este tipo de ataque, se centra en aprovechar una vulnerabilidad matemática en el PRNG (Pseudo Random Number Generation o Generación de Números Pseudo Aleatoria). Algunas tarjetas tienen esta vulnerabilidad. Las podemos identificar cuando al escanearlas vemos cosas como esta:

Si comparamos esta imagen anterior con la primera del artículo cuando escaneamos con “hf search”, se puede ver que tienen el mismo UID (aunque esté ofuscado por motivos de seguridad) pero sin embargo algunos datos de la tarjeta son diferentes. Eso es porque la primera imagen corresponde a la tarjeta original que es de mejor calidad que la que se muestra en esta segunda imagen donde se aprecia la vulnerabilidad del PRNG. Esta segunda tarjeta es una tarjeta china reescribible donde he grabado un clon de la tarjeta original precisamente para poder sacar la evidencia de dicha vulnerabilidad. Es muy normal encontrar esto en estas tarjetas chinas de bajo coste ya que son de calidad cuestionable. Eso sí, estas tarjetas tienen “Magic capabilities” de lo que hablaremos más tarde.

El caso es que este ataque necesita valerse de una clave conocida y válida de uno de los sectores, y si la tarjeta es vulnerable, es capaz de averiguar otras claves. Por tanto, para poder ejecutarlo tenemos que saber de antemano ya una clave. En nuestro caso conocemos la clave de todos los sectores excepto de dos, aunque con solo saber una clave válida en un sector ya sería suficiente, así que vamos a lanzarlo. Refrescamos la imagen (repetida) de lo que podíamos leer:

En el comando hay que especificar un bloque conocido y su clave. Si miramos la imagen anterior, se ve que en el bloque 0 (y en muchos otros), la clave es ffffffffffff. También hay que especificar un bloque objetivo. En nuestro caso será de la parte A “--ta” y el bloque será el 8 ya que cada sector se cuenta como 4 y tenemos el sector 0 y el sector 1 antes de llegar al que queremos atacar (sector 2). Así que procedemos a lanzarlo de esta manera:

hf mf nested --1k --blk 0 -a -k ffffffffffff --tblk 8 --ta

Vemos que se ha obtenido la clave 28xxxxxxxxxx, por lo que ya podríamos leer la tarjeta completamente para proceder a su clonado. No obstante, vamos a detenernos brevemente en el siguiente ataque.

Hardnested attack

Este ataque ataca una vulnerabilidad criptográfica de CRYPTO1 y al igual que el ataque nested, necesita de al menos el conocimiento de una clave válida de uno de los sectores. Este ataque se suele elegir lanzar en lugar del nested si nuestra tarjeta no es vulnerable a la debilidad matemática de PRNG pero si aún sigue usando CRYPTO1.

Se lanza de una manera muy similar al ataque nested, indicando un bloque de clave conocida, dicha clave y el sector a atacar:

hf mf hardnested --blk 0 -a -k ffffffffffff --tblk 8 --ta

Vemos en la imagen anterior que ha obtenido la clave con éxito. Aunque cuando lanzamos el ataque comienza a poner cantidades de tiempo de 30 horas y similares, sin embargo, muy rápidamente el tiempo baja y acaba realizándolo normalmente en torno a 10 o 15 segundos más o menos (a veces un poco más a veces menos), aunque imagino que dependerá de factores variables de tu equipo, la tarjeta, etc.

Lectura completa utilizando todas las claves

Ahora que ya tenemos una clave nueva, vamos a probar si con ella podemos leer la tarjeta completa pues las claves muy frecuentemente se repiten en diferentes sectores y pudiera ser que para los dos sectores restantes que nos falta por leer se estuviera utilizando la misma.

Creamos un fichero de texto llamado “customdict.dic” e introducimos en él las dos claves que ya teníamos de la tarjeta y la nueva que hemos descubierto con los ataques:

Ahora colocamos ese fichero en la carpeta pm3 de nuestra instalación del software de la Proxmark y lanzamos el siguiente comando para intentar leer la tarjeta utilizando todas las claves contenidas en él:

hf mf chk --1k -f customdict.dic --dump

Como vemos, finalmente en nuestro caso la clave que habíamos descubierto ha servido para los dos sectores restantes. Si no fuera el caso y nos faltase aún por descubrir la clave de algún sector, habría que repetir alguno de los ataques para obtenerla hasta que las vayamos añadiendo al diccionario y podamos ver una pantalla como la nuestra en la que toda la columna “res” tenga el valor 1.

El comando anterior habrá generado un fichero .bin pero no es el volcado completo de la tarjeta. Para realizar el volcado lanzaremos este comando a continuación:

hf mf dump

Esto generará varios ficheros. El binario que contiene el volcado (este fichero se puede usar en el Chameleon para emular una tarjeta). Un json con toda la información y el fichero con extensión .eml que es en formato de texto. Estos ficheros eml son los que manejan algunas otras aplicaciones como Mifare Classic Tool de Android por ejemplo.

Notas finales sobre ataques

Existen otros ataques, como el Static Nested y también existe la opción n00b de “autopwn” que supuestamente detecta la tarjeta, elige el ataque más conveniente y lo lanza automáticamente por nosotros. Depende de la tarjeta es más o menos exitoso. En el caso que nos ocupa también funcionaba perfectamente, aunque siempre es bueno saber lo que uno está haciendo ya que las herramientas de botón gordo están bien para ahorrarnos tiempo, pero recomiendo usarlas solo después de entender el proceso completo. No obstante, este sería el comando por si alguien quiere probarlo y jugar con ello:

hf mf autopwn

La salida del comando es muy larga y por tanto la imagen es muy grande por lo que he puesto solo la captura del principio. El resultado de la parte del final es así:

Como vemos, nos ha seleccionado automáticamente un ataque de tipo nested y ha descifrado la clave de los sectores restantes además de leer automáticamente toda la tarjeta y generar los volcados necesarios de la misma y todo ello en pocos segundos.

Clonado

Ahora que tenemos en un fichero el volcado de la tarjeta que queríamos clonar, ya podemos colocar en nuestra Proxmark una tarjeta en blanco que sea reescribible. Las tarjetas chinas con “Magic capabilities” vienen muy bien para estos menesteres ya que son muy baratas (cuestan céntimos) y se pueden escribir, borrar, volver a escribir, etc. Ideales para pruebas. Evidentemente necesitaremos una del mismo tipo que la tarjeta que queremos clonar de la que hemos hecho el volcado. En nuestro caso una Mifare Classic 1k.

Si no estamos seguros de si nuestra tarjeta está en blanco, podemos borrarla utilizando este comando:

hf mf cwipe

Y ahora procedemos a meter en la tarjeta el fichero de volcado. Utilizaremos el fichero con extensión .eml mediante este comando (completad la parte ofuscada con vuestro nombre de fichero):

hf mf cload -f hf-mf-D3xxxxxx-dump.eml

Voilá! Ya tenemos la tarjeta completamente clonada.

Bonus track - el bloque 0

Comentar que el bloque 0 de una tarjeta (también llamado Manufacturer Block) es el que contiene el UID y se supone que es de solo lectura en las tarjetas normales. No obstante, como se ha mostrado aquí, existen tarjetas con la habilidad de ser modificadas en este bloque. Son tarjetas especiales que permiten que se interactúe con ellas de una forma especial (backdoor commands). Además, hay de varios tipos:

  • UID: Original Chinese Magic Backdoor card (Gen 1a). Responden a backdoor commands.
  • CUID: Chinese Magic Backdoor card (2nd Gen). Mejor compatibilidad de escritura (Android).
  • FUID: Unfused. Solo se pueden escribir una vez. No responden a backdoor commands, indetectable.
  • UFUID: Versión mejorada de FUID, se puede escribir varias veces y hacer “lock” después para que no se pueda escribir más tras el bloqueo.

Estos tipos existen porque algunos lectores que gestionan accesos (tornos, ascensores, etc.) poseen la capacidad de detectar si una tarjeta es escribible en su bloque 0 utilizando backdoor commands y por tanto son capaces de detectar si es una de las tarjetas legítimas del sistema o si se trata de una tarjeta clonada. Con alguno de estos tipos mostrados se puede hacer para no ser detectado.

Agradecimientos especiales

Gracias de nuevo a Hackplayers, por trabajar tanto por la comunidad hacker de habla hispana. Gracias a GMV como siempre por seguir apostando por el I+D. Gracias a L1k0rd3b3ll0t4 por las quedadas cerveceras y tener ese grupo tan interesante.

Links de interés

Óscar Alfonso Díaz – Twitter (@OscarAkaElvis)

Comentarios

  1. podriais poner enlaces donde se pueden comprar estas targetas magicas?

    ResponderEliminar

Publicar un comentario