Por Roberto Amado, 3 de Febrero de 2010 | Imprime

Tras introducir el pasado viernes algunos aspectos teóricos relevantes de RFID, en esta segunda parte entraremos en cuestiones prácticas que nos darán resultados muy interesantes.

Comencemos profundizando un poco más en como Mifare realiza el proceso de autenticación. En primera instancia el lector le comunica a la tarjeta que quiere realizar una operación sobre un sector de datos determinado N. El tag o tarjeta en ese momento remite un número aleatorio Nc (Nonce del cliente) de 32 bits a modo de reto, para que sea cifrado con la clave privada compartida previamente. Como respuesta, el lector remite el reto cifrado y un número aleatorio Nr (Nonce del lector) para que el tag lo cifre con la clave privada, generando una trama de 64 bits. En última instancia la tarjeta le envía al lector su reto cifrado. En este momento ambos tienen la certeza de que los dispositivos son legítimos. Destacar que los dos últimos intercambios se realizan ya de forma cifrada, permaneciendo en claro tan solo el envío de la petición de lectura y Nc. La figura de la izquerda ilustra el proceso de handshake.

Este proceso de saludo a 4 bandas es importante ya que de él extraeremos la información necesaria para inferir la clave privada del sector.

Procedamos ahora a realizar una prueba de concepto que nos permitirá, a partir de la captura de la información anterior, inferir la clave privada. Pero, ¿cómo podemos capturar una comunicación real entre un tag y un lector? Aquí es donde juega un papel importante el PROXMARK III. Este dispositivo desarrollado por Jonathan Westhues permite realizar sniffing de varias tecnologías RFID desde baja frecuencia (LF 125 Khz) a alta frecuencia HF (13.56 Mhz) y entre ellas la que nos interesa ISO14443 tipo A sobre la que se basa Mifare. En un principio el PROXMARK III supondría el Hardware sobre el cual se pueden implementar diversas capas físicas y de enlace, de diferentes protocolos, simplemente programando sus integrados con la especificación que se requiera.

Muy bien, pues ya tenemos el dispositivo que nos permitirá capturar el handshake inicial entre la tarjeta y el lector, ahora tan solo nos falta un lector Mifare y una tarjeta. Para el lector, en este caso se ha optado por un Omnikey 5321 que viene con un software de ejemplo que permite la interacción con tags Mifare sin la necesidad de utilizar su API y programarse uno mismo el código. Para la tarjeta se ha utilizado una Mifare classic 4k. La captura de la derecha muestra la maqueta utilizada.

Como se puede ver la antena es casera, realizada a partir de un cable USB y no muy “profesional” pero para lo que nos acontece sobra, consiguiendo incluso sobre los 12500 mV en el test Tune (test que implementado en el firmware del PROXMARK III).

Colocando el sniffer entre la tarjeta y el lector podríamos proceder a realizar una lectura del sector 4, obteniendo la siguiente traza de bytes (véase Gerard de Koning Gans, Jaap-Henk Hoepman, Flavio D. Garcia. A practical Attack on the MIFARE classic. Radboud University Nijmegen 2008):

Es conveniente comentar ciertos aspectos de la captura:

  • En primer lugar ETU corresponde con Elementary Time Units, y define el tiempo entre mensajes, donde 1 ETU corresponde con un cuarto del período de bit, que es igual a 1,18 microsegundos.
  • SEQ en este caso correspondería con el número de mensaje.
  • La trama “2a 69 8d 43 8d” identifica la tarjeta Mifare dentro del rango del lector, este identificador es pregrabado en el sector 0 del tag y no es modificable.
  • El byte “60” de la secuencia “07” indicaría a la tarjeta que se pretende trabajar y por tanto autenticar, en un sector determinado, en este caso el sector 01 donde esta albergado el bloque de datos 04 (siguiente byte al “60”) y utilizando para ello la clave A. Si nos encontráramos con un valor “61” se trataría de un intento de autenticación utilizando la clave B del sector.
  • El resto de tramas que implican el proceso de autenticación ya han sido comentadas anteriormente (Nc, Nr, Rc, Rr).

Con la información anterior capturada procederemos a inferir la clave privada del sector mediante la aplicación CRAPTO1 de desarrollo anónimo (lógico dado los problemas que tuvo la universidad de Radboud con Philips por su investigación).

Configuramos crapto1 con los parámetros anteriores:

uint32_t uid             = 0x2a698b43;
uint32_t tag_challenge   = 0x3bae032d;
uint32_t nr_enc          = 0xc494a1d2;
uint32_t reader_response = 0x6e968642;
uint32_t tag_response    = 0x8466059e;

Pasamos a compilar la aplicación:

roberto@hacklab:~/Mifare/crapto-v1.1$ gcc -o post post.c crapto1.c crypto1.c

Y obtenemos por fin la ansiada clave :

roberto@hacklab:~/Mifare/crapto-v1.1$ ./post
nt': 7fcf34c3
nt'': 869dbbd5
ks2: 1159b281
ks3: 02fbbe4b
Found Key: [85 cc f9 ff ff ff]

Con esta clave privada ya podemos pasar a leer/modificar el contenido de los 4 bloques de datos que componen el sector 01, podríamos por ejemplo, cambiar esta clave privada escribiendo en el bloque de datos trailer o incrementar el valor de nuestro monedero electrónico. Cuidado al realizar esta primera operación, ya que podríamos modificar el tipo de acceso (3 bytes de Acces Conditions) y dejar el sector (todos los bloques de datos que lo componen!) inservible. Para más información sobre estos 3 bytes ojear ISO14443-A, Identification cards – Contactless integrated circuit(s) cards – Proximity cards (2006). Lo más habitual es encontrarse con el resto de sectores protegidos con la misma clave privada, con lo que se podría proceder a realizar un clonado completo de la tarjeta (salvo el UID, auque normalmente no lo comprueban las aplicaciones).

En resumen hemos visto como es posible comprometer la seguridad de este tipo de tecnologías RFID. Como apunte final, alarma la cantidad de empresas y entidades a nivel mundial que utilizan Mifare Classic como sistema de ticketing, monedero electrónico o control de acceso físico. No voy a revelar que organismos lo hacen, pero más de los que os imagináis.

Happy RFIDing!

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • E-mail this story to a friend!
  • LinkedIn
  • Netvibes
  • Live
  • Meneame
  • TwitThis
No me gusta esta entradaMe gusta esta entrada (+4 rating, 4 votes)
Loading ... Loading ...




12 comentarios a “Hacking RFID, rompiendo la seguridad de Mifare (II)”

Estupendo artículo. Una duda, yo siempre he pensado que mas allá de este tipo de bugs criptográficos (interesante como bien dices para tarjetas-monedero) lo realmente interesante es el ‘clonado’ de la UID de la tarjeta, que es básicamente el mecanismo empleado en el 90 % de edificios / parkings con tarjetas RFID. Hace tiempo que tengo ‘fichado’ al PROXMARK III y leyendo especificaciones nunca me ha quedado claro si permite ser programado en modo emisor pudiendo ponerle un UID arbitrario (teóricamente se supone que si en modo emulación…) ¿Lo habéis probado?

YJ [web], 3 de Febrero de 2010, 11:34 am

Hola YJ, en primera instancia gracias por tus comentarios.

Por experiencia propia, el tipo de tecnologías que me he encontrado en cuanto a controles de acceso tenían un pobre nivel de seguridad, es decir, ni siquiera utilizan Mifare. Estan basados en EM4102 HF, o RFID UHF sin ningún tipo de cifrado. Simplemete la tarjeta tiene un UID no cifrado y este es comprobado contra una base de datos (interna al dispositivo, o con un backend de BBDD). Los controles de acceso que me he encontrado y que implementan Mifare Classic, tampoco comprobaban si el UID era válido o por lo menos era una tarjeta generada por la compañía fabricante del dispositivo.

Ahora es cuando te voy a dar una alegria, implementar un control donde se determine si el UID es lícito para un sistema, tampoco sirve de nada, ya que el PROXMARK III puede funcionar, entre otras cosas como un tag con un UID arbitrario. Por lo tanto tan solo tienes que leer (va en plano) el UID de la tarjeta a clonar, con un lector convencional y simularla con el PROXMARK III. Como en todas las teccnologías puedes ir poniendo barreras de seguridad que no solucionarían el problema (ej. Ocultar el ESSID en redes 802.11).

Sí estas interesado en la auditoría o ingenieria en RFID este dispositivo PROXMARK III no te puede faltar, tiene unas posibilidades tremendas (no cobro por su difusión ;) )

De nuevo gracias por tus comentarios.

ramado [web], 3 de Febrero de 2010, 11:55 am

Gracias, lo cierto es que he trabajado bastante con Mifare y otras tecnologías RFID, y el 99 % de veces que he visto implementar sistemas de acceso están basados en el UID de la tarjeta asociado en una BD a una persona. He estado tentado varias veces en comprar el PROXMARK o/y OpenPCD http://www.openpcd.org/ precisamente por la posibilidad de emulación del UID, incluso he mantenido varios correos con el devel de RFIDiot sobre la posibilidad de encontrar tarjetas ‘compatibles MIFARE’ con el sector del UID editable. Aclarado el punto del PROXMARK lo posiciono como opción N1. Muchas gracias

YJ [web], 4 de Febrero de 2010, 2:10 am

Pues ha bajado de precio Yago, yo lo compre hace un tiempo a 499$ ahora lo tienes por 329$. Saludos.

ramado [web], 4 de Febrero de 2010, 1:11 pm

No sabía que había bajado de precio, eso son buenas noticias :D

vierito5 [web], 4 de Febrero de 2010, 11:22 pm

Hola Roberto

Primero de todo felicitarte por las dos entradas. Está muy bien explicado y me ha picado la curiosidad para informarme sobre tecnologías Mifare y RFID

No tengo un ProxMark III para hacer pruebas, y me gustaría saber si cada vez que se lee/escribe un sector hace falta que el lector y el tag se autentiquen de nuevo, aunque ya se haya consultado ese sector previamente. En caso de que lo hayan implementado por eficiencia, se podría acceder a un sector con el que se ha operado sin necesidad de implementar este ataque.

A ver qué me puedes decir :)

damontero [web], 23 de Febrero de 2010, 5:59 pm

Para leer o escribir en un bloque de datos perteneciente a un sector, el lector y el tag han de autenticarse mutuamente usando la clave privada almacenada en el trailer para dicho sector una vez. A partir del proceso de autenticación correcta para un sector, toda la comunicación va cifrada.

Sl2

ramado [web], 23 de Febrero de 2010, 6:41 pm

Entonces entiendo que hace falta autenticarse cuando se lee/escribe en cualquier bloque de un sector, y para eso se utiliza la clave del trailer. Una vez realizada una operación sobre cualquier bloque de ese sector, ya no hace falta autenticarse de nuevo y sólo se procede a cifrar la comunicación.

¿Correcto?

damontero [web], 24 de Febrero de 2010, 6:52 pm

Correcto, si quieres trabajar contra, por ejemplo, un bloque de datos llamemoslo A, de un sector, te autenticas contra el trailer correspondiente. Si quieres leer/escribir en otro bloque de datos B protegido con la clave de su trailer correspondiente has de autenticarte contra él. Ahora si quieres volver a realizar operaciones contra el bloque A, debes volver a autenticarte contra el trailer correspondiente al bloque A.

En general cada vez que quieras trabajar contra un bloque de datos fuera del sector en el que estas autenticado debes volver a realizar la operación de autenticación.

Sl2

ramado [web], 24 de Febrero de 2010, 9:44 pm

Con la última frase lo has explicado perfectamente.

Muchas gracias por tu ayuda ;)

damontero [web], 26 de Febrero de 2010, 12:44 pm

hola roberto que exelemnte explicacion entre la pagina de proxmark iii y hay dos versiones cual me aconsejas comprar ,quierio meterme en el mundo de l rfid y tambien montare linux que publicacion es la mas estable con los puertos para esto del rfid te agradezcio de antemano tu colaboracion y te felicito por este exelente post

SCORPION27 [web], 4 de Marzo de 2010, 2:31 am

Que yo sepa solo hay una versión actualmente a la venta. http://proxmark3.com/

Sl2

ramado [web], 4 de Marzo de 2010, 9:52 am

Deja un comentario