Identificando nombres de usuarios en aplicativos web (WordPress, Jira y GLPi)

Cuando iniciamos una evaluación de seguridad a un determinado activo, una de las fases más importante es la recopilación de información, también conocida como Information Gathering. En esta fase trataremos principalmente de recolectar todo tipo de información vinculada al objetivo de análisis. Si más concretamente estamos analizando una aplicación web, en base a la metodología que empleemos o la dinámica con la que estemos acostumbrado a trabajar, nos centraremos de determinados tipos de información que podrían ir desde descubrimiento de tecnologías, revisión de banners, identificación de directorios, revisión de códigos de estados HTTP, análisis de métodos HTTP, revisión de cabeceras de peticiones y respuestas y enumeración de nombres de usuarios, solo por nombrar algunos tipos; En esto último nos centraremos el día de hoy, enumeración de nombres de usuarios, y es que esta labor que también la veremos referenciada aquí y en otros post como simplemente enum nos permitirá por ejemplo, entre otras cosas, en caso de tener paneles de autenticación emplear estos resultados y por tanto reducir a la mitad los potenciales ataques de fuerza bruta que lancemos. No es lo mismo que a través de fuerza bruta tengamos que identificar nombres de usuarios y contraseñas válidos en un determinado sistema, que tan solo nos centrarnos en la identificación de contraseñas de usuarios que ya evidenciamos su existencia. Por tanto podemos decir que la enumeración será nuestra gran baza a “jugar”.

Las técnicas y métodos que aquí serán descritos, si bien a día de hoy ya en muchas herramientas de “botón gordo” las disponemos, siempre es interesante que contemos con habilidades mas comprensibles y manuales. Para ello emplearemos algunos comportamientos concretos de las aplicaciones web, ya sea ofreciendo respuestas enriquecidas de información, mostrando recursos accesibles de forma pública o interpretando las distintas conductas adoptadas por éstas aplicaciones según se formule nuestras peticiones. Nos centraremos principalmente en 3 tipos de aplicativos web, como son: WordPress, Jira y GLPi.

Enumeración en WordPress

En este CMS emplearemos el “pseudoleak que existe en la ruta: /wp-json/wp/v2/users/ en cada aplicativo WordPress que tengamos en frente. Este recurso vinculado a la REST API de WordPress normalmente es accesible por defecto, al menos que el administrador del sitio haya querido protegerlo y bloquear su acceso para usuarios no autenticados, por tanto una visita a la ruta concreta nos arrojará un resultado parecido al siguiente:

A través del siguiente fork: UserEnumWP que comparto en mi GitHub, podemos automatizar el proceso de obtención de nombres de usuarios de WordPress a través de esta ruta descrita.

Pero ¿Qué pasa con aquellos aplicativos WordPress donde no sea accesible la ruta anteriormente comentada?

No hay problema, para ello emplearemos una característica igualmente interesante en WordPress que nos permitirá enumerar nombres de usuarios del aplicativo web. Para ello emplearemos la siguiente cadena: “?author=1” que debemos ponerla al final de la URL de un aplicativo WordPress, esto por lo general, si observamos la respuesta de una petición GET obtendremos la cabecera Location que mostrará la ruta donde seremos redirigidos. Si observamos el final de la ruta notaremos que como un directorio hará referencia al nombre del usuario.

Estas consultas pueden ser automatizadas para cambiar el número del autor e ir recorriendo una secuencia para así ubicar todas las respuestas a peticiones que agreguen una cabecera Location. Obviamente las respuestas a peticiones que no agreguen esta cabecera en concreto (Location), se descartarán. A continuación el resultado obtenido de una prueba con la condición descrita.

for var in {1..40}; do curl -sI "https://produccion.gob.bo/?author="$var | grep -i "Location:" | cut -d "/" -f5; done

administrador
sergio-torrejon
sergio-salazar
ludwig
juan-quiroga
raul-mamani
sergio-calizaya
rolando-soto
carlos-arce
marcelo-romero
jorge-torrico

En este punto, si lo que pretendemos identificar son nombres completos de personas vinculadas al aplicativo WordPress, bajo la misma lógica explicada, nuestra técnica variará un poco y se centrará en el código fuente obtenido como respuesta en cada petición realizada. Para tener un ejemplo, haremos 5 peticiones al aplicativo WordPress y filtraremos la etiqueta «<title>», que es donde localizaremos nuestro dato necesario.

Tomando en cuenta que la etiqueta «<title>» cuenta con un salto de linea y posteriormente viene el dato que precisamos, seguido del cierre de la etiqueta «<title>«, aplicaremos un filtro más.

for var in {1..5}; do curl -sL "https://produccion.gob.bo/?author=$var" | grep "</title>"; done

administrador, Author at MDPyEP</title>
Page not found - MDPyEP</title>
Sergio Torrejon, Author at MDPyEP</title>
Page not found - MDPyEP</title>
Page not found - MDPyEP</title>

Finalmente ya solo tenemos que recortar el resultado y quedarnos con la parte que nos interesa, en este caso el nombre completo del usuario. Ojo que también desecharemos las líneas que pongan “Page not found” ya que es identificativo de registro sin nombre de usuario. El resultado podrá ser complementado con lo anterior.

for var in {1..40}; do curl -sL "https://produccion.gob.bo/?author=$var" | grep "</title>" | grep -v "Page not found" | cut -d "," -f1; done

administrador
Sergio Torrejon
Sergio Salazar
Ludwig Calderon
Juan Quiroga
Raul Edgar Mamani Mollo
Sergio Calizaya
Rolando Soto Mamani
Carlos Armando Arce Moreira
Marcelo Romero Oña
Jorge Eduardo Torrico Lima Lobo

Enumeración en Jira

Jira es una herramienta líder para la gestión de tickets, tareas e incidencias en proyectos. Muchas empresas de tamaño importante suelen temerla implementada y en algunos casos accesibles desde Internet. Podremos identificar un puñados de ellas haciendo una búsqueda rápida con Google Dorks.

Como es de esperar, estos aplicativos web de Jira suelen tener mecanismos de autenticación que al visitarlos podremos ver un aspecto cercano a este:

Bien, el tema es que Jira suele contar con el siguiente directorio activity en donde ofrece un aparente log de actividad desde donde podremos extraer nombres de usuarios, nombres completos e incluso cuentas de coreo electrónicos. A continuación un extracto del tipo de información accesible:

Similar al automatismo de WordPress se ha generado un script para obtener de manera directa y rápida los datos interesante del log de Jira (nombres de usuarios, nombres completos y cuentas de coreo electrónicos). El script está disponible en GitHub y es llamado UserEnumJira

El script básicamente opera con el siguiente output generado (es un ejemplo).

curl -s "https://TARGET/activity" | grep -n "<name>" | cut -d ">" -f3-8 | sort | uniq

<name>Amritanshu Pandia</name><email>a.pandia1@samsung.com</email><uri>https://bugs.tizen.org/secure/ViewProfile.jspa?name=amritanshup</uri
<name>Jihoon Jung</name><email>jh8801.jung@samsung.com</email><uri>https://bugs.tizen.org/secure/ViewProfile.jspa?name=jihoonjung</uri
<name>Woo Chang Kim</name><email>wchang.kim@samsung.com</email><uri>https://bugs.tizen.org/secure/ViewProfile.jspa?name=playchang</uri

Enumeración en GLPi

Por último tenemos a esta otra herramienta tipo “mesa de ayuda”, que cuenta con un comportamiento peculiar a la hora de emplear la función de recuperación de contraseña.

Ya que obtendremos respuestas distintas para cuando nuestro dato de usuario NO sea válido, como para cuando el dato introducido SI corresponda a un usuario existente en el sistema. A continuación ambos ejemplos:

Basados en esta condición lo que podemos hacer es a partir de un diccionario o mediante fuerza bruta sin más, podremos enumerar usuarios válidos del sistema.

Pero ojo, para versiones más recientes de GLPi, adicionalmente tendremos que sortear con algo de astucia el control Anti-CSRF.

Aunque debido a su implementación mejorable, nada que BurpSuite y su Session Handling rules no te puedan ayudar. Ya hablaremos con más calma de este último aspecto en otra entrada, por el momento si te interesa el tema te dejo por aquí la documentación oficial: https://portswigger.net/support/configuring-burp-suites-session-handling-rules