Automatización con Python me ayuda a reportar la misma vulnerabilidad en múltiples sitios

Tiempo de lectura 6 minutos

Después de tanto tiempo sin publicar nada, hoy voy a escribir sobre como encontré una pequeña vulnerabilidad en un sitio web. Hecho que me llevó a crear un script para probar otros sitios y así poder checkear varios sitios en menos tiempo y encontrar más sitios vulnerables y he encontrado varios. Digo pequeña porque es así, pequeña, de poco a mediano impacto, pero bastante interesante. Ya que es una nueva forma de enumerar usuarios de en un sitio web que esté utilizando WordPress y en particular BuddyPress, un plugins para la gestión de comunidades, equipos y grupos.

Una pequeña introducción para entrar en contexto

En marzo, y dada la situación general que se está viviendo en todas parte del mundo, decidí pasar el tiempo buscando vulnerabilidades en algunos sitios web. Obviamente entré a HackerOne a buscar algún programa que me pueda interesar. No voy a dar el nombre del programa, por una sola razón, todavía no han corregido el problema.
De todas formas decidí escribir este post para compartir el conocimiento, lo que quiere decir que voy a dejar el script más abajo ;)

Dado que voy encontrando la misma vulnerabilidad en varios sitios, lo lógico (creo yo) era reportar la vulnerabilidad a WordPress y eso hice. Debo decir que ellos tienen un excelente tiempo de respuesta, pero cerraron mi reporte por “Not Applicable” lo que quiere decir que NO entra dentro de los riesgos que a ellos les importan. De hecho, luego de releer sus políticas, ellos consideran a los usuarios de un sitio de WordPress como usuarios públicos. Bastante raro según mis políticas de seguridad, pero no estaba de ánimo como para discutir por eso.
Lo bueno, es que otros programas SI califican la enumeración de usuarios como un riesgo, de poco impacto, pero un riesgo al fin de cuentas.

La vulnerabilidad

La enumeración de usuarios de un sitio web, como su nombre lo indica, sirve para obtener el listado de todos los usuarios registrados en un sitio web. Tener esta información nos abre las puertas para posteriores ataques, desde un simple email flooding hasta ataques de fuerza bruta para obtener sus contraseñas y hacerse de sus cuentas.

Al principio solo había detectado el email flooding, se podía enviar email de reseteo de contraseña sin tiempo límite, ni captcha, ni nada. El cual reporté.
Y como bien me contestó la contraparte del programa: “un email flooding es solo molesto sino se tiene la lista de los usuarios del sitio web, cough cough“. A lo que le contesté: “Dame unos días y te paso la lista de todos los usuarios”.

El problema

BuddyPress nos permite organizar grupos de temas en los cuales los usuarios pueden interactuar, una especie de foro. Los grupos pueden ser públicos o privados.
Usemos una demo online para probar como funciona.
En esta se puede visualizar la lista de grupos y la cantidad de miembros de cada uno (en una configuración por defecto).

Si entramos a un grupo, por ejemplo “Architecture” podemos ver la lista de miembros, usuarios que están en dicho grupo porque es público. Tanto el grupo como sus miembros.

A estas alturas creo que ya tenemos una idea por donde puede venir el problema. Es realmente necesario mostrar la lista de miembros de cada grupo, incluso si estos son públicos? Son solo los nombres de usuarios visibles o son los usernames de usuarios? Qué pasa si los grupos son privados? Con esto nos podemos dar una idea de por dónde podemos atacar.

La explotación

Para responder a las preguntas anteriores: depende; ambos; y también podemos ver sus miembros.

Depende, cada caso es diferente y particular. Tal vez como requerimiento se necesita que esa información sea de carácter público. Realmente veo innecesario que sus miembros sean públicos, eso solo agranda la superficie de ataque y no aporta ningún valor agregado al sitio web.

Ambos, podemos ver el nombre del usuario y el username del mismo.

También podemos ver sus miembros, siempre y cuando seamos usuarios registrados y pertenezcamos al grupo.


Para cada caso el método de explotación es el mismo (aquí viene lo bueno):

  1. Verificar que el sitio este usando BuddyPress y tenga la caracteriza de grupos habilitada.

  2. Obtener la lista de grupos.

  3. Entrar a la sección de miembros de cada uno.

  4. Leer los nombres de usuarios.

Fácil, no es cierto? Un webscrapper de no más de 100 líneas en Python para obtener miles de usuarios.
Aquí les dejo el código del script! BuddyPress Scanner


© 2018. All rights reserved.

Powered by Hydejack v8.2.0