La privacidad está en manos de todos.
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.
¿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:
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
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.
Y podemos obtener el listado con DNI / NIF y Nombres y Apellidos que a pesar de ser públicos he preferido difuminar parcialmente.
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.
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.
Estas búsquedas nos pueden llevar a documentos con nombres y DNI de la zona geográfica que nos pueda interesar.
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.
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”.
En una petición con datos correctos, vemos que el código de respuesta es un 302, que corresponde al mensaje “Found”.
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.
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.
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.
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.
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.
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.
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.
Otros artículos que te podrían interesar
Te dejo a continuación otros artículos míos relacionados con la Ciberseguridad que a lo mejor te pueden interesar:
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.