La seguridad no está en tu huella dactilar.

Gabriel Martí
10 min readOct 12, 2022

--

Cómo me salté una seguridad biométrica usando el Flipper Zero

Photo by Meg Jenson on Unsplash

Nota

Por motivos ajenos a mi voluntad, este artículo tiene algunas fotografías pixeladas.

Este articulo tiene una traducción al inglés en el enlace adjunto a continuación.

This article has an English translation in the link below.

https://gabimarti.medium.com/security-is-not-in-your-fingerprint-2a67391319

Prólogo

Todo sistema de seguridad y/o control debe de tener unas medidas ajustadas al entorno. Digo esto, porque, lo que voy a relatar aquí, a pesar de adolecer de ciertas carencias, no significa que no sea seguro teniendo en cuenta su entorno y alcance.

Es por esto, que lo que se relata a continuación no es sobre un proceso de autenticación, sino sobre un proceso de identificación.

No obstante, conviene conocer los puntos débiles de estos mecanismos para saber a qué nos enfrentamos o debemos atenernos en caso de producirse una situación no prevista por el conjunto de los mecanismos que intervienen en el proceso de identificación.

El control de acceso

Desde hace un tiempo tengo que acceder a un edificio usando una tarjeta de acceso. Una tarjeta sencilla, blanca, sin marca por ningún lado, excepto un pequeño número en una esquina inferior.

Tarjeta de control de acceso con ID de usuario anonimizado.

Un número de muy pocos dígitos que me hacían intuir que algo tenían que ver con mi identificación a nivel interno.

En cuanto tuve la tarjeta, mi curiosidad me hizo indagar para ver si podía leer el contenido de esta. Lo único que tenía a mano en ese momento era mi Smartphone Android con NFC. Así que activé el lector de NFC y probé de leerla. ¿Resultado? No había lectura.

Tras documentarme más, cabía la posibilidad de que fuera RFID 125Khz ya que es un tipo de tarjeta extensamente utilizada en sistemas de identificación. No podía verificar certeramente esta posibilidad, pues no disponía de ningún lector de esta frecuencia.

Esta tarjeta era el único salvoconducto que necesitaba para abrir las barreras de control de entrada / salida del edificio.

Barreras de control de acceso a edificio

El único control en el ámbito de usuario que tiene el sistema es que, si un usuario ya ha accedido al edificio, las barreras no se abren desde el exterior, ya que tiene registrado el usuario dentro del edificio, y viceversa.

El Flipper Zero

Pasado un tiempo, llegó el día en que recibí mi Flipper Zero.

Flipper Zero recién salido de la caja

Tras probar los diferentes modos de lectura, el resultado fue rápido y sencillo. Se confirmaba que la tarjeta era RFID 125Khz, muy usada en sistemas de control de acceso, y con una seguridad prácticamente nula, a no ser que por detrás (en el backend) exista algún otro sistema de verificación. Su baja frecuencia la hace altamente resistente a las interferencias y apta para entornos industriales, y eso implica que su uso esté muy extendido. Pero no voy a entrar en los detalles físicos, ni de señal.

Lo importante aquí es saber qué datos almacena, y como.

La seguridad

Como he dicho, la seguridad en este tipo de tarjetas es nula. Flipper Zero lee todo el contenido, y se puede volver a emular (o clonar) utilizando este como dispositivo de identificación en lugar de la tarjeta.

Flipper Zero mostrando menu de operación con RFID 125Khz

Clonar la tarjeta no tiene ninguna dificultad, y permite tener un dispositivo de acceso adicional o incluso poder traspasar los datos de identificación sobre un llavero grabable que trabaje en la misma frecuencia.

Llavero (“keyfob”) RFID 125Khz regrabrable

Estos llaveros y/o tarjetas los puedes encontrar también con el nombre de “TAGS” (etiquetas) o “Transponders” (transpondedores), que en realidad es, simplificando mucho, un chip con una pequeña antena que se activa al recibir la señal del lector y envía la información que contiene.

Interior del llavero con la antena y chip RFID 125Khz.

Hay que tener clara una cosa: Estos dispositivos son elementos de “identificación”, no elementos de “autenticación”, por lo que no tenemos seguridad. Para que haya seguridad deberían de entrar en juego otros factores inexistentes.

Estos chips / antena simplemente tienen registrado un identificador (un número) y al recibir la señal del lector, la antena lo único que hace es emitir dicho identificador.

El chip EM4100

Antes de pasar a ver que contenía mi tarjeta de identificación, veamos un poco que almacena dicha tarjeta.

La tarjeta contiene (presumiblemente) un chip EM4100 que es de solo lectura. Es decir, salen de fábrica con un identificador pregrabado. Este identificador se guarda en una memoria de 64 bits. Es decir, 8 bytes. Pero de estos bits, hay 9 bits de cabecera que siempre están a 1. Después tenemos 8 bits de identificador de versión. Y por cada 4 bits de datos se añade un bit de paridad, y finalmente existen 4 bits de paridad por columna con un bit final de parada a 0. Con lo que finalmente nos quedan realmente 32 bits para datos, que vendrían a ser 8 dígitos hexadecimales, ya que así nos lo va a mostrar el Flipper Zero.

Tabla de formato de datos EM4100

En realidad, la información almacenada en el Flipper Zero descarta todos los bits de cabecera, paridad y final. Eso solo forma parte del protocolo de envío y, por lo tanto, solo almacena 5 bytes (40 bits). Los primeros 8, tal y como se indica en el esquema, indican versión o cliente, y dependerán del sistema. En este caso siempre están a cero (00), y los siguientes 4 bytes (32 bits) son los que nos interesan, nuestro identificador.

Tal sería así que, en el Flipper Zero, nos muestra algo similar a lo que se ve en la siguiente imagen. Para ello voy a poner unos valores de ejemplo para que se entienda mejor.

Muestra de información obtenida de la tarjeta RFID con el Flipper Zero.

Los valores hexadecimales mostrados por la lectura eran los siguientes:

[ 00:4F:B1:00:40 ]

En cambio, la numeración que tiene la tarjeta (siempre hablando de valores hipotéticos) era el “1337”.

¿En qué se parecen?

Pues si cogemos el valor hexadecimal y lo pasamos a decimal obtenemos el siguiente resultado:

[ 1.337.000.000 ]

Es decir, “mil trescientos treinta y siete millones”. Es decir, el número impreso en tarjeta, que corresponde a la identificación del usuario, se multiplica por un millón y se almacena en el chip. Por facilidad, el Flipper Zero muestra los bytes en hexadecimal.

De esta manera, es fácil pensar que si conocemos el número de tarjeta de otra persona, es factible calcular el valor a almacenar de un TAG RFID y crear una tarjeta de acceso para suplantar la identidad de dicha persona, ¿verdad?. Efectivamente, es posible, pero deberás de leer hasta el final. 😎

La huella dactilar

De repente, un día te dicen: “Vamos a eliminar las tarjetas de identificación y el acceso al edificio será a partir de ahora mediante huella dactilar”.

Es decir, el control de acceso, o lo que es lo mismo, el sistema de identificación, será biométrico.

Normalmente, indicar que hay un control biométrico se asocia siempre a una mayor seguridad, y así es (o debería ser) si en conjunto se cambian otras partes del proceso.

Pero en este caso no es así. 😏

Así que llegó el momento en que me tuvieron que tomar la huella dactilar y registrarla en el sistema.

Shoulder Surfing

¿Has oído hablar de este término? Su traducción vendría a ser “Mirar por encima del hombro”. No es que se haga esto explícitamente, pero sí que significa en fijarse en datos, detalles, cosas… cuando las personas escriben en su ordenador, teléfono móvil, dispositivo, etc., sin que ellos se den cuenta. Este método forma parte de una de las tantas técnicas incluidas en la Ingeniería Social.

Y aquí radica la seguridad de muchos procesos.

Cuando me tuvieron que registrar la huella dactilar, un operario me tomaba la huella en el mismo dispositivo que se usa para identificarte al entrar al edificio. En este caso, el propio dispositivo muestra un menú con diferentes opciones y hay que repetir diferentes tomas y grabaciones de huellas. Esto hizo que el operario tuviera que entrar y repetir múltiples veces un código. En todas las ocasiones el mismo.

Dispositivo lector de control de acceso que lee huella dactilar y tarjetas RFID 125Khz

Yo me fijé en ese código y lo memoricé. Como podrás imaginar, ese código era el que estaba asociado a mi huella dactilar, y en realidad es el código interno al que responde el sistema.

¿Poner el dedo o poner la tarjeta?

Toda esta historia vino porque en realidad no tenía ganas de ir poniendo el dedo haciendo contacto en una superficie donde pasan miles de dedos a diario (manías mías 😒) si podía evitarlo.

Y mi objetivo fue comprobar si efectivamente el código que me habían, supuestamente, asociado a la huella dactilar, también se podía enviar a través del lector RFID.

No podía grabar una tarjeta nueva, pero si grabar un TAG como el que he mostrado anteriormente o enviar la información desde el mismo Flipper Zero. Solo tenía que editar la información en mi Flipper Zero con los valores adecuados.

Muestra de información de TAG RFID 125Khz editado en la pantalla del Flipper Zero

En la siguiente ocasión que tuve que pasar la barrera de acceso, en lugar de poner la huella dactilar, utilicé el Flipper Zero para que enviara dicha información. ¡¡¡Y funcionó!!! 😏

De hecho, ese fue el primer acceso. No usé nunca mi huella dactilar para acceder a las instalaciones. El único momento que mis dedos tocaron ese dispositivo fue en el momento de registro de la huella.

¿Suplantar otra identidad?

Queda claro desde este momento que, en este caso, la huella dactilar no es una medida de identificación mejor, ya que esta está asociada a un identificador igual de corto y sin seguridad como el que se almacena en la tarjeta, debido a que se acepta la lectura de dicho código desde el lector RFID.

Por lo tanto, de la misma manera que yo puedo utilizar mi código asociado a la huella dactilar y copiarlo sobre un pequeño TAG, también podría generar otros códigos y acceder al edificio suplantando la identidad de otra persona. Y lo que es peor, el control de acceso de ese edificio, al leer un código correcto, muestra por pantalla el nombre y apellidos de la persona que accede al edificio.

Pero, ¿es esto sencillo de llevar a cabo?

Puedo responder afirmativamente a esta pregunta con un rotundo:

¡¡¡SI, ES POSIBLE!!!

Generando identificadores

Conociendo de antemano cuál es mi identificador actual, y sabiendo el que tenía anteriormente, puedo suponer en que rango de valores se mueven los identificadores usados en la empresa.

Así que lo primero será generar y guardar sobre un fichero de texto una lista de posibles candidatos. Es decir, una lista de posibles identificadores susceptibles de ser correctos.

Como tampoco quiero que sean valores continuos, por aquello de que a veces la aleatoriedad nos acerca más al resultado con éxito, voy a crear un generador donde le doy un valor de partida, un valor final y un salto aleatorio entre valores.

También podría poner valores continuos y, de hecho, el código soporta que sea así, pero de esta manera reduzco el número de identificadores a probar.

Hacer esto en un lenguaje como Python es cosa de pocas líneas de código. De hecho, hacerlo en otro lenguaje como C, sería casi “calcado”, pero ahora está de moda Python. 😉

Este script nos genera una lista de identificadores posibles, los cuales solo tenemos que volcar dentro de un archivo de texto y colocar dentro del Flipper Zero.

Parte de la lista de IDs generados

Fuzzing

El Fuzzing, es una técnica de pruebas de software consistente en proporcionar datos inválidos, inesperados o aleatorios a las interfaces de introducción de datos para comprobar si las rutinas detectan entradas erróneas. En este caso, se podría asemejar también más a un intento de identificación por fuerza bruta proporcionando un diccionario de valores a probar. Menciono fuzzing porque el plugin que he usado en este caso así se llama, RFID Fuzzer.

Una vez colocado este fichero con la lista de identificadores a probar lanzamos el plugin que se encargará de leer los identificadores de ese fichero e ir enviándolos uno a uno al lector hasta que este detecte un identificador válido y nos abra la barrera.

Pantalla con opción de menú donde se muestra el RFID Fuzzer

Como la lista tiene una alta probabilidad de códigos válidos, el resultado lo veremos concluir en pocos segundos.

No hay fotos del momento, lo siento. 😏

RFID Fuzzer en acción enviando códigos al lector RFID

Conclusión

Quedaría por ver si todo este sistema es mejorable (probablemente) y aplicar algunas correcciones. Por un lado, se podrían mejorar aspectos de protocolo a nivel de usuario, y por otro a nivel de identificador se podrían añadir otras medidas como digitos de control, que entiendo que supondrían cambios en el software que lee y recibe los datos de estos lectores, y que yo desconozco en su totalidad.

Me ha quedado pendiente en este punto hacer mi propio plugin para Flipper Zero que queda para otra ocasión.

Mientras tanto, recuerda una cosa: “El peligro no está en el cuchillo sino en la mano que lo maneja”.

@310hkc41b

--

--

Gabriel Martí

Ex-Docente CFGM, CFGS Ciberseguridad. Actualmente Consultor en Ciberseguridad. Intereses en robótica, ciberseguridad, reversing. Twitter @gmarti @310hkc41b