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)
Fuente obtenida de: https://www.hackplayers.com/2021/11/hacking-nfc.html