Ataques con tarjeta bancaria sin contacto



Publicado por: cuamckuu

Recuperar el contenido del mapa y trabajar con equipos EMV puede ser interesante no solo con fines de investigación. Existen varios tipos de ataques contra tarjetas bancarias sin contacto, cuya implementación se discutirá debajo del corte.

Introduccion


Este año obtuve una pasantía en Summer of Hack 2019 en Digital Security y trabajé en el tema de investigación sobre tarjetas EMV sin contacto. Durante la pasantía, resultó ser mejor aprender cómo funcionan las tarjetas bancarias y crear una nueva utilidad para trabajar con tarjetas sin contacto. Una demostración del modo de lectura de datos se puede encontrar aquí .

Tipos de ataques


La tarjeta y el terminal se comunican utilizando el estándar EMV (Europay + MasterCard + VISA), que fue desarrollado para aumentar la seguridad de los pagos. En este sentido, no hay muchos vectores de ataque en tarjetas sin contacto. El artículo se centrará en lo siguiente:

  • Enlace la tarjeta de otra persona en la tienda en línea
  • Paso auxiliar en ingenieria social
  • DoS sin contacto que convierte una tarjeta en un ladrillo

Tales ataques son posibles al interactuar con la tarjeta de acuerdo con el estándar EMV. Muchas tarjetas le permiten leer fácilmente la información privada del usuario, en particular el PAN, la fecha de vencimiento y el nombre del titular. Los datos leídos son suficientes para mapear la tarjeta en algunas tiendas en línea, por ejemplo, Amazon. Y los datos privados recibidos se pueden usar para un phishing más personalizado o al enviar spam.

De manera similar, se implementa un ataque DoS. Llamar a los comandos EMV necesarios le permite desbordar el contador de transacciones interno o simular la entrada incorrecta del código PIN, lo que conduce al bloqueo de la tarjeta.

¿Por qué reinventar la rueda?


Antes de comenzar el desarrollo, se decidió estudiar las soluciones existentes. En particular, consideraron: RFIDIOt / ChAP.py , Jaccal , nfcmillionaire , Conference PoC , script "Ruby" , aplicaciones / libs de Android .

La mayoría de los programas revisados ​​intentan simular el funcionamiento de un terminal POS y utilizan diccionarios con identificadores de tarjetas compatibles, por lo tanto, a menudo tales soluciones solo funcionarán con Visa y MasterCard.

Otro problema es leer una pequeña parte de los datos en lugar de descargar un volcado completo. Casi todos los programas intentan analizar tantos EMV como sea posible sobre la marcha y cometen errores de análisis.

Si alguno de los problemas está ausente o no es tan pronunciado, lo más probable es que estemos hablando de una aplicación / biblioteca para Android, y necesitará un teléfono con un lector NFC, que no todos tienen.

Los problemas descritos se pueden resolver, para esto es necesario:

  • Detecta el tipo de mapa dinámicamente, en lugar de usar diccionarios
  • Agregue múltiples modos de operación para la lectura completa de archivos
  • No intente desmontar el estándar EMV sobre la marcha.
  • Utilice un lector barato PN532 (~ 5 $)

Recuperando datos de la tarjeta


Ya hay artículos sobre Habré que describen en detalle el proceso de interacción entre la tarjeta y el terminal ( uno , dos , tres ), por lo que intentaré no repetirme y centrarme en la parte práctica.

Para comunicarnos con la tarjeta, utilizaremos el lector PN532 debido al precio agradable y la biblioteca libnfc. Perfectamente ponerse manos a la obra. Los datos en el mapa están organizados de la siguiente manera:
Entorno -> Aplicaciones -> Archivos -> Registros.

El propósito de la lectura es obtener datos de todos los registros, para esto debe pasar por una cadena completa, y la elección del entorno y la aplicación se produce solo una vez al comienzo de la comunicación.
El mismo proceso en términos de comandos EMV:

  • SELECCIONAR PPSE // Seleccionar un entorno sin contacto
  • SELECCIONAR APLICACIÓN // Seleccionar una aplicación por AID
  • LEER REGISTRO // Especificar el archivo y el número de registro

Considere el ejemplo de la formación de uno de los equipos. El primer comando para seleccionar un entorno sin contacto es siempre el mismo y tiene este aspecto:

byte_t const command[] = { 0x40, 0x01, // Pn532 InDataExchange 0x00, 0xA4, // SELECT ppse 0x04, 0x00, // P1:By name, P2:_ 0x0e, // Lc: Data length 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, // Data string: 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, // 2PAY.SYS.DDF01 (PPSE) 0x00 // Le }; 

Respuesta de ejemplo: 6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 03 10 10 87 01 01 90 00

Para llamar al siguiente comando, necesitamos analizar la respuesta del comando anterior.



Estamos interesados ​​en el identificador de aplicación AID. Lo memorizamos y formamos una nueva consulta SELECT, pero esta vez pasamos el AID recibido al comando SELECT, y no al PPSE, como en el primer comando.

Ejemplo: 00 A4 04 00 07 A0 00 00 00 03 10 10 00

Como se mencionó anteriormente, es importante obtener AID dinámicamente, en lugar de usar un diccionario preparado, entonces es probable que su aplicación pueda leer diferentes tipos de tarjetas, por ejemplo, tarjetas MIR.

Después de seleccionar la aplicación, podemos leer los registros necesarios usando el comando READ RECORD y pasando el número de archivo y el número de registro como parámetros.

Un ejemplo de formación de equipo: (se puede encontrar más sobre esto en el estándar. EMV Book1. 11.2 LEER REGISTRO)

  byte_t const sfi_param = (sfi << 3) | (1 << 2); byte_t const command[] = { 0x40, 0x01, // Pn532 InDataExchange 0x00, 0xB2, // READ RECORD record_number, sfi_param, // P1:record_number and P2:SFI 0x00 // Le }; 

Ejemplo de llamada: 00 B2 02 14 00

Tenga en cuenta que no se asigna un byte completo al número de archivo, respectivamente, puede haber 31 (2 ^ 5 - 1) archivos en total y 255 entradas. Los archivos del 1 al 10 se asignan para el almacenamiento de datos internos, y los restantes se asignan para el almacenamiento registro de transacciones si la tarjeta admite el registro.

Ahora, usando dos bucles anidados, podemos obtener los datos de todos los registros del mapa llamando al comando READ RECORD para cada par. El proceso de búsqueda puede acelerarse significativamente si presta atención a la palabra de estado que devuelve la tarjeta (los dos últimos bytes de la respuesta). El estado puede indicarnos que el archivo no existe (SW = 0x6A82) o que no hay más entradas en este archivo (SW = 0x6A83).

En la práctica, resultó que tiene sentido considerar solo el caso de un archivo inexistente, ya que a veces hay tarjetas que usan incorrectamente el código de estado para las entradas faltantes. Después de leer los datos, puede enviarlos a uno de los analizadores en línea, me gustó este .

Fragmento de datos extraídos de los registros del mapa:



Los datos leídos son suficientes para mapear la tarjeta en algunas tiendas en línea (principalmente en las extranjeras), y la información obtenida se puede utilizar para un ataque más personalizado mediante la ingeniería social.

Organizamos DoS sin contacto


Pasamos al siguiente tipo de ataque. Hay al menos 2 métodos de implementación para DoS-a.

Camino lento


Para implementar el método lento (el ataque tomará aproximadamente 4 minutos), es necesario llenar en exceso el contador de transacciones de la tarjeta interna (ATC). Para hacer esto, llame a:

  • SELECCIONAR PPSE // Seleccionar un entorno sin contacto
  • SELECCIONAR APLICACIÓN // Seleccionar una aplicación
  • OBTENER DATOS // Averigüe cuánto queda antes del desbordamiento de ATC (Opcional)
  • OBTENER OPCIONES DE PROCESAMIENTO // Iniciar transacción
  • ...
  • OBTENGA OPCIONES DE PROCESAMIENTO // Repita las transacciones hasta que se desborde

Considere los pasos con más detalle. La elección del entorno y la aplicación sin contacto es similar al elemento con extracción de datos, la única diferencia es que esta vez necesitamos procesar la respuesta del comando SELECCIONAR APLICACIÓN.



Estamos interesados ​​en el campo PDOL, ya que será necesario para la llamada posterior del comando GET PROCESSING OPTIONS, que aumentará el contador de transacciones para cada llamada.
En PDOL, la tarjeta solicita información sobre el terminal y el pago de nosotros.

En el ejemplo anterior, el mapa nos pregunta:

  • 9F66 04 // Calificador de transacción de terminal (4 bytes)
  • 9F02 06 // Cantidad (6 bytes)
  • 9F37 04 // Número impredecible (4 bytes)
  • 5F2A 02 // Código de moneda de transacción (2 bytes)

Dado que implementamos DoS, no un pago real, no podemos preocuparnos por la exactitud de los valores y simplemente usar los valores previamente preparados que la tarjeta aceptará. Lea más sobre los valores requeridos en el estándar. (Libro EMV 3. Anexo A Diccionario de elementos de datos).

Para la conveniencia del uso práctico, cito la tabla:
Etiqueta (hexadecimal)DescripciónValor válido (hexadecimal)
9F59Información de transacción terminalC8 80 00
9F5ATipo de transacción terminal00
9F58Indicador de tipo de comerciante01
9F66Calificadores de transacciones terminales79 00 40 80
9F02Cantidad (autorizada)00 00 00 10 00 00
9F03Monto (otro)00 00 00 00 00 00 00
9F1ACódigo de país de terminal01 24
5F2ACódigo de moneda de transacción01 24
95Resultados de Verificación de Terminal00 00 00 00 00
9AFecha de la transacción19 01 01
9CTipo de transacción00
9F37Número impredecible82 3D DE 7A

Una vez formados los datos solicitados por la tarjeta, estamos listos para llamar al GPO.

Ejemplo: 80 A8 00 00 12 83 10 79 00 40 80 00 00 00 10 00 00 82 3D DE 7A 01 24 00

Respuesta: 77 4F 82 02 20 00 94 0C 10 02 03 00 18 01 01 00 10 04 04 00 57 13 42 76 55 00 66 83 25 13 D2 00 52 01 14 89 36 20 00 00 1F 5F 20 02 20 2F 9F 10 07 06 01 11 03 80 20 00 9F 6C 02 30 00 9F 26 08 33 33 89 D5 70 A3 DF 37 9F 27 01 00 9F 36 02 02 48 90 00

Repita la llamada de GPO 65 536 veces y la tarjeta se bloquea. Puede reducir la cantidad de llamadas requeridas leyendo primero el valor ATC actual usando GET DATA.

Forma rápida


La forma rápida es mucho más conveniente (y más peligrosa), ya que tomará aproximadamente 2 segundos bloquear la tarjeta, por lo que un análisis detallado de los detalles de implementación permanecerá detrás de escena.

El método es similar al anterior, pero esta vez será necesario reducir el contador de intentos para ingresar el código PIN, en lugar de aumentar el contador de transacciones. El valor PIN del Try Counter también se puede obtener a través de GET DATA, pero en este caso no habrá un aumento significativo en la velocidad.

Operaciones requeridas:

  • SELECCIONAR PPSE // Seleccionar un entorno sin contacto
  • SELECCIONAR APLICACIÓN // Seleccionar una aplicación
  • OBTENER DATOS // Averigüe cuántos intentos de ingresar un PIN
  • OBTENER OPCIONES DE PROCESAMIENTO // Iniciar transacción
  • VERIFICAR // e ingresar el PIN incorrecto
  • ...
  • VERIFICAR // Hasta que la tarjeta esté bloqueada

Resumen


Durante la pasantía, fue posible crear una nueva herramienta para trabajar con tarjetas bancarias sin contacto y resolver varios problemas que están presentes en las soluciones existentes, y el uso de un lector barato reduce significativamente el costo de un kit de investigación y puede ayudar a atraer nuevas personas para investigar la seguridad de las tarjetas bancarias sin contacto. El código fuente del programa está disponible en Github .

Source: https://habr.com/ru/post/468937/


All Articles