La privacidad está en manos de todos.

Gabriel Martí
11 min readJun 6, 2020

--

Photo by Kevin Ku on Unsplash

Los primeros responsables somos nosotros mismos.

La privacidad de las personas es algo que sale cada vez más a menudo en los medios, pero me da la sensación de que nadie se la toma muy en serio.

Todos y cada uno de nosotros debemos exigir a las empresas, organismos e instituciones que se les dé a nuestros datos un tratamiento y protección adecuados.

Disponemos de diversos organismos que regulan el tratamiento y la privacidad de los datos. Una Agencia de Protección de Datos Europea, una Agencia de Protección de Datos Española y, además, en Cataluña, una Autoridad Catalana de Protección de Datos, pero es inútil la regulación, cuando uno mismo, no tiene conocimiento de la dimensión del tratamiento de nuestros datos. Deberíamos saber, cómo son de accesibles estos datos; que cedemos nosotros mismos de manera voluntaria, y muchas otras veces de manera involuntaria. Y si detectamos alguna remota posibilidad de que puedan verse vulnerados, tenemos el deber ético de informar sobre ello e insistir a los responsables para que solucionen el problema.

No me refiero a los datos que publicamos de forma reiterada y sin ser conscientes de ello en las redes sociales, y que son utilizados a menudo, para corroborar y cotejar información obtenida de otras fuentes. Porque el problema no está en una sola fuente, sino en el conjunto de todas ellas. Obteniendo una información de un sitio y otra de otros (valga la redundancia), es cuando nuestra privacidad puede verse vulnerada. Esta información puede parecernos inocua de manera aislada, pero combinada con otras, podría ser usada para suplantar nuestra identidad.

¿Os suena el sistema de recuperación de contraseñas con preguntas de seguridad del estilo “Nombre de pila de tu padre/madre”?

Puede que no sea tan buena idea cuando una información o un dato es predecible y hasta puede encontrarse fácilmente en internet.

Captura de hoja parroquial publicada en internet.
Captura de hoja parroquial publicada en internet.

¿Y a qué viene todo esto?

Pues a que los datos, que son susceptibles de deducirse, generarse u obtenerse de otras fuentes, no deberían de ser utilizados como medio de validación o autenticación para ofrecer otras informaciones.

Hace unos días me propuse hacer mi Declaración anual de la Renta, y tuve que descargar un certificado, de una donación que hice, de un sitio web.

El formulario para poder descargar el certificado mostraba lo siguiente:

Formulario para descargar un certificado.
Formulario para descargar un certificado.

Solo hacía falta el NIF y el Código Postal. ¿Os parece suficiente? ¿Es adecuado a unas mínimas medidas de seguridad?

El Código Postal es una información pública. Se pueden obtener el código o los códigos de cualquier población. Asociarlo a una persona no es inmediato, pero puede ser deducible o incluso “acotable” a un pequeño rango.

El NIF de una persona no es algo que suela ser público, pero sí que puede llegar a obtenerse. De hecho, muchas personas conocen el NIF de terceros, ya sea porque se conocen, son familiares, son clientes, proveedores, etc.

Y si a esto le añadimos que es utilizado para identificarse en muchos ámbitos y muchos organismos lo publican en listas, ya tenemos una información fácilmente accesible.

Si en lugar del NIF tenemos el DNI no es problema. El cálculo de la letra se obtiene por una fórmula que es pública y conocida y, además, hay decenas de páginas web que nos facilitan este cálculo online.

Además, el problema se agrava cuando a este formulario, si se le introducen datos incorrectos simplemente muestra un error, pero permite efectuar infinitos reintentos.

Un formulario de un sitio web que nos permite ir probando combinaciones y, aunque se produzcan errores, acepta nuevos intentos de manera continuada e ilimitada sin bloquear los accesos de dicho usuario, es un claro candidato a ataques continuados por parte de Ciberdelincuentes.

Alertando a los responsables directos

Mi primera reacción fue de sorpresa, y pensé que quizás habría una comprobación adicional. Tras descargar mi certificado comprobé que estos eran los únicos datos necesarios. Visto esto les envié un mensaje a través del formulario de contacto indicándoles que la seguridad para obtener el certificado no me parecía suficiente.

Tras esperar unos días y no recibir respuesta, utilicé otras vías de contacto, insistiendo, hasta que conseguí que alguien me respondiera y me hiciera caso.

Finalmente recibí un correo de contestación donde me comunicaban que habían trasladado mi mensaje al departamento correspondiente para solucionar el problema.

Desactivaron el formulario al día siguiente.

¿Era grave el problema?

La gravedad es siempre relativa. Dependerá del tipo de información que se pueda conseguir, del volumen de personas afectadas, de su impacto en la confidencialidad y/o la integridad, de la complejidad necesaria, etc.

No se vulneraba ningún sistema aquí, ni se conseguía acceso a carpetas de datos o del sistema; pero sí que se podía obtener información de terceros, suplantando su identidad.

Paso a demostrar cómo esto era posible.

Obteniendo datos

Con un simple buscador y utilizando sencillas combinaciones podemos recabar la información necesaria. Y con ello obtener el certificado de una tercera persona.

Me voy a centrar en Google, aunque esto es aplicable a muchos otros buscadores. Los Google Dorks, son cadenas de búsqueda específicas con algunos parámetros que nos permiten acotar o profundizar en nuestra búsqueda.

Por ejemplo: Si centramos nuestra búsqueda a tipo de archivo “.pdf”, un sitio web concreto y las palabras adecuadas, podríamos hacer una búsqueda en Google del siguiente tipo, dentro del sitio web del Ayuntamiento de Barcelona:

site:ajuntament.barcelona.cat filetype:pdf dni or nif

Búsqueda en Google de documentos PDF del Ayuntamiento de Barcelona
Búsqueda en Google de documentos PDF del Ayuntamiento de Barcelona

Son datos públicos y abiertos, y legalmente pueden o deben estar ahí, aunque también podría darse el caso de filtraciones de datos involuntarias y Google las dejaría al descubierto y al alcance de cualquiera.

Ya sabemos que Barcelona tiene varios códigos postales y millones de personas, pero ¿qué pasa si la búsqueda la centramos en una población con un solo código postal? No voy a responder, pues imagino que el lector ya habrá llegado a una conclusión.

Pero incluso el Gobierno de España tiene publicaciones de Nombres y DNIs que son accesibles. Como ejemplo unos resultados del sitio web del Ministerio de Justicia simplemente indicando las tres palabras clave que nos interesan.

Búsqueda en Google con las palabras “listado” “dni” “nif”
Búsqueda en Google con las palabras “listado” “dni” “nif”

Y podemos obtener el listado con DNI / NIF y Nombres y Apellidos que a pesar de ser públicos he preferido difuminar parcialmente.

Listado de Nombres y DNI de personas obtenidos en la web del Ministerio de Justicia.
Listado de Nombres y DNI de personas obtenidos en la web del Ministerio de Justicia.

Y así, como en el ejemplo anterior tenemos a cientos (o miles) de casos en sitios web como el BOE, Ministerios, Ayuntamientos, Gobiernos Autonómicos, Universidades, Organizaciones Privadas, etc.

Listado de Nombres y DNI en la web del Ayuntamiento de Madrid.
Listado de Nombres y DNI en la web del Ayuntamiento de Madrid.
Listado de Nombres y DNI en la web del Ayuntamiento de Sesena.
Listado de Nombres y DNI en la web del Ayuntamiento de Sesena.

Podría incluir cientos de ejemplos y capturas, aunque llegados a este punto creo que no hacen falta más para convencer a nadie.

Pero vayamos al caso que nos ocupa.

¿Es posible obtener un certificado de otra persona que no sea yo mismo?

La respuesta es SI.

Usando búsquedas específicas tal y como he explicado anteriormente y acotando debidamente los datos.

Búsqueda específica del “target” en Google.
Búsqueda específica del “target” en Google.

Estas búsquedas nos pueden llevar a documentos con nombres y DNI de la zona geográfica que nos pueda interesar.

PDF con Nombres y DNI.
PDF con Nombres y DNI.

El último paso sería rellenar el formulario con la información obtenida.

¿Automatización? Sí, es posible.

Llegados a este punto, cualquier persona puede banalizar esta afirmación, argumentando que la posibilidad de que alguien obtenga un certificado que no sea el suyo propio es muy remota, por el hecho de las decenas de miles de combinaciones que tendría que hacer manualmente para llegar a un NIF y Código Postal correctos.

Y sí, puede que manualmente sea un proceso lento y tedioso, pero es posible, puesto que muchos usuarios ponen información personal en las redes sociales, y además el NIF y Código Postal son dos elementos habituales que van juntos en las facturas.

No obstante, alguien podría desarrollar un pequeño programa, como el script en Python que he hecho como prueba de concepto, donde carga por un lado un fichero de texto con una lista de NIFs de posibles personas, y por otro lado otro fichero de texto con la lista de Códigos Postales a probar.

Este Script se encarga de hacer las combinaciones pertinentes y lanzar las peticiones automáticas del formulario comprobando solo, la respuesta de si es válido o no, y generando así una lista de combinaciones correctas.

Salida de Script en Python que prueba dos combinaciones, una válida y otra incorrecta.
Salida de pruebas de Script en Python que prueba dos combinaciones, una válida y otra incorrecta.

Analizando el formulario

Si analizamos el contenido del formulario y la petición que se hace obtenemos lo siguiente:

En una petición con datos incorrectos, podemos observar que el código de estado que nos responde es 500. Un poco extraño, pues corresponde al mensaje ”Internal Server Error”.

Petición POST con datos incorrectos.
Petición POST con datos incorrectos.

En una petición con datos correctos, vemos que el código de respuesta es un 302, que corresponde al mensaje “Found”.

Petición POST con datos correctos.
Petición POST con datos correctos.

Así pues, enviando los parámetros adecuados y automatizando el envío de datos desde Python con solo comprobar el código de respuesta podemos saber si una combinación de DNI + Código Postal es correcta o incorrecta, y para ello nos basta con comprobar que el código de respuesta sea 302.

Generando diccionarios

Para poder automatizar el envío de datos al formulario necesitamos diccionarios de datos que podemos hacer, y ampliar al gusto, nosotros mismos.

Para empezar, un diccionario de Códigos Postales, que son conocidos e incluyen muchas aplicaciones de gestión, o incluso Google -que es nuestro amigo- nos los proporciona. Por lo que si situamos el target en una provincia o una veintena de poblaciones tenemos la lista hecha rápidamente.

Códigos postales de Barcelona ofrecidos por Google
Códigos postales de Barcelona ofrecidos por Google

Para obtener una lista de NIF o DNI podemos recurrir también a una búsqueda en Google como he mencionado anteriormente, pero también nos podemos hacer un pequeño generador partiendo de la fórmula conocida para obtener la letra del NIF.

Código en Python para generar una lista con números de NIF válidos
Código en Python para generar una lista con números de NIF válidos

Con este código e indicando un rango de numeración e incluso un rango de salto aleatorio se puede generar una lista del tamaño que deseemos.

Aquí tenemos un ejemplo de una lista con 2.300.000 NIF aleatorios que se ha generado en solo 3 segundos y ya la tenemos en un fichero de texto.

Muestra parcial de archivo generado con lista de NIFs aleatorios.
Muestra parcial de archivo generado con lista de NIFs aleatorios.

Ahora solo deberíamos lanzar el script que se encarga de comprobar cada uno de los NIF combinado con cada uno de los Códigos Postales que tenemos en la otra lista.

¿Es largo? Sí, es cierto, pero un Ciberdelincuente con un sistema automatizado solo tiene que esperar. En el momento que consiga una combinación válida significará que ha obtenido éxito en su “ataque” y habrá vulnerado la supuesta barrera de seguridad que lo separa de la información privada.

Automatizando la fuerza bruta

Tenemos ahora dos archivos con los que hacer combinaciones, uno llamado nifs.txt y otro codigos_postales.txt.

El siguiente paso es desarrollar el script que combine estas dos listas. Por su puesto, es recomendable acotarla a unos valores concretos o más probables. Seguidamente, el script irá lanzando los formularios y mostrará el código de la respuesta recibido. Recordemos, un 302 es la respuesta a combinación correcta.

La función que se encarga de enviar el formulario quedaría como el código mostrado en la siguiente imagen.

Función de envío de formulario.
Función de envío de formulario.

La función principal, que se encarga de combinar las dos listas y lanzar los datos del formulario sería la que se ve en la siguiente imagen.

Función main() que combina las dos listas y llama a la función de envío de formulario.
Función main() que combina las dos listas y llama a la función de envío de formulario.

Nótese que este envío no está optimizado por razones obvias. Con las capacidades de programación multihilo de Python se podrían lanzar múltiples peticiones de formulario en paralelo, reduciendo el tiempo de pruebas.

La ejecución del script nos mostraría un resultado similar a la siguiente imagen, que corresponde a una muestra simulada y no un lanzamiento real sobre el sitio web afectado.

Pantalla de ejemplo, SIMULACIÓN resultados.
Pantalla de ejemplo, SIMULACIÓN resultados.

Medidas de prevención y mitigación

Probada la debilidad de este formulario es momento de ver qué cambios se deberían de hacer para mejorar la seguridad de este.

  • La inclusión de un captcha sería la primera medida, no infalible pero que puede mitigar en parte los intentos automáticos.
  • Campo oculto que no se rellena. Normalmente los robots intentan rellenar todos los datos de los formularios. Una medida para filtrar usuarios de programas automatizados, es poner un campo que el usuario no ve, y por lo tanto no va a rellenar y comprobar en backend si se ha rellenado. En ese caso sabremos que no procede de un usuario normal y podremos descartar la petición y tomar medidas adicionales, como por ejemplo banear la IP.
  • Control de reintentos fallidos. Una medida imprescindible sería implementar un sistema que detecte varios intentos fallidos de combinación NIF + Código Postal desde una misma IP para evitar la fuerza bruta y banear dicha IP. Normalmente un usuario puede cometer un error al teclear sus datos una vez, pero no más de 5 veces.
  • Control de secuencia y tiempo. Antes de rellenar el formulario el navegador hace un GET previo al envío de los datos con el POST. Se debería de implementar algún sistema que no acepte un POST si antes no se ha recibido un GET desde la misma IP. Y como el formulario lo rellena un usuario y sabemos que los datos no los escribe el usuario a la velocidad de un procesador, se debería comprobar que al menos entre GET y POST haya pasado un tiempo mínimo aceptable, como por ejemplo 5 segundos.
  • Sustituir el campo Código Postal por un token único asociado al dni o añadirlo como tercer campo. Dicho token se podría proporcionar al usuario en el mismo correo donde se incluía el enlace del formulario para solicitar la descarga del certificado.

Conclusión

Los datos solicitados para la descarga de ese certificado no cumplían unos requisitos mínimos de seguridad para asegurar y validar que quien hace la descarga es la propia persona interesada y no un tercero.

No significa esto que el sitio web sea vulnerable.

Pero sí pone de relieve que tan importantes son las medidas técnicas como el flujo y el tipo de datos que se tienen que solicitar.

Descargo de Responsabilidad

El contenido de este artículo está únicamente destinado a proporcionar al lector el conocimiento de las debilidades de algunos formularios web y como podrían ser mejorados o mitigar los ataques.

Cualquier uso de los métodos de fuerza bruta sobre un sitio web del que no se tiene la debida autorización puede incurrir en delito.

Esta información no constituye una solución única ni definitiva y puede contener algunas imprecisiones o quedar obsoleta con el tiempo.

El autor declina cualquier responsabilidad por el mal uso de la información que aquí se ofrece.

Servicios de auditoria de Seguridad

¿Tienes un servidor, una red corporativa, un sitio web, un eCommerce?

Tu red y tus sistemas pueden ser vulnerables. Yo puedo ayudarte, realizar una auditoría de seguridad y aconsejarte para mejorar tus sistemas. Visita mi sitio web de empresa y déjame un mensaje.

www.interbits.es

www.interbits.es

--

--

Gabriel Martí

Ex-Docente CFGM, CFGS Ciberseguridad. Actualmente Consultor en Ciberseguridad. Intereses en robótica, ciberseguridad, reversing. Twitter @gmarti @310hkc41b