Enumeración de Usuarios en WordPress (Fingerprinting) - Presentando wp_users.sh

Hola amigos, conozco la comunidad DragonJAR desde hace mas de 4 años donde llegue a ser de los usuarios mas activos, pero en este tiempo de conocer a la comunidad es la primera vez que publico algo en el blog principal. Quería fuera algo especial y espero poder llenar las expectativas del publico exigente en calidad de artículos técnicos que visita DragonJAR.

La idea del articulo conforme fui desarrollando e investigando sobre el tema, cambio radicalmente de como se contemplo al principio, así que lo dividiré en dos secciones.

  1. Como es la enumeración de Usuarios de wordpress hoy en día.
  2. Dar a conocer el script que escribí wp_users.sh

Pero como suelo hacer, primero quiero dar a conocer un poco del contexto sobre por que me metí a este tema; Realmente yo no tenia contemplado hacer un script para esta tarea, puesto que ya existen programas, plugins y scripts que hacen la misma tarea.

Todo esto empezó cuando mi blog personal (Neobits.org) que hace uso del famoso gestor de contenido wordpress fue atacado. En ese momento me metí bastante a estudiar "Hardening para wordpress", aunque mi blog tenia medidas de seguridad suficientes para creerlo "seguro", fui vulnerado. Hoy en día las medidas de seguridad que implemente en mi Blog son mucho mayores a ese entonces y creo hasta ahora me funcionan bien.

En este punto varias personas me han pedido les comparta un manual de Hardening, y aunque en internet hay varios y varios tips, decidí crear mi propia cadena de tips, en las que me baso yo. Algunas recomendaciones son las que wordpress oficialmente nos recomienda, otras son de desarrolladores de plugins, otras de profesionales de la Seguridad Informática y las demás son en base a mi experiencia.

Todos estos tips y manual que voy creando espero poder presentarlo a la comunidad informática en "Campus Party México 4". Si es que logro contactar al encargado de Área de Redes y Seguridad. Así que si les interesa pueden ayudarme para que lo presente en #CPMx4 =P

En mi investigación me encontré con este tema taaaaaaan sonado y "común". Donde se dice es muy sencillo sacar los usuarios de wordpress (Y realmente lo es). Y aunque existen varias soluciones para lograr este objetivo, me di cuenta que varios de ellos no me ofrecen los resultados que esperaría...Aquí fue donde decidí crear mi pequeño script (Unas 3 líneas) como PoC.

Para unos días mas tarde el script creció a 100+ Líneas y ofrece buenos resultados (Mejores que algunas herramientas conocidas en ciertos casos).

Sin mas preámbulo entremos en tema.

Índice

Enumeración de Usuarios

¿Para que obtener los usuarios de wordpress de una página?

-obtener los nombres de usuario es una parte muy importante en una prueba de intrusión, ya que obteniendo estos, podemos dirigir un ataque de fuerza bruta a esos usuarios para ver si podemos ingresar al portal y de ahí tratar de escalar privilegios, subir una webshell etc...

Encontré varias opciones para lograr enumerar usuarios y aquí probaremos algunas de las mas "usadas y recomendadas"

  • Flunym0us (Flu-project y enelpc.com)
  • Metasploit (Con el modulo wordpress_login_enum)
  • wpbf.py
  • w3af (Plugin wordpress_enumerate_users)

Flunym0us

Flunym0us es un script programado en python creado por Flu-project.com y enelpc.com. Donde solo hace unas semanas salió la versión 2.0

Este programa es un Scanner de vulnerabilidades para WordPress y Moodle. Hace un completo fingerprinting a la plataforma identificando versión de la plataforma, plugins instalados y desactualizados, y LOS USUARIOS REGISTRADOS...

En la siguiente captura de pantalla podemos observar como funciona flunym0us y obtiene los usuarios de la pagina muyseguridad.net

Click para Agrandar

Trabaja bien ¿no? sin embargo Flunym0us tiene unos pequeños inconvenientes en cuanto a los usuarios. Obtiene muy pocos, y Cuando encuentra algunos, se basa en el <title> de la pagina...Podemos ver un ejemplo a continuación con el blog de daboblog.com

Click para Agrandar

Dice encontrar 5 usuarios pero solo 1 es real. Los demás son el <title> del sitio.

Metasploit (wordpress_login_enum)

Muchos profesionales de la seguridad recomiendan el uso de metasploit para enumerar usuarios ya que tiene todo un modulo dedicado a esto, y es bastante configurable.

El modulo lo podemos encontrar en:

auxiliary/scanner/http/wordpress_login_enum

Podemos hacer uso de el fácilmente simplemente configurando el Host remoto. Y claro podemos ver todas las opciones con "show options". Lo probaremos ahora contra los creadores de flunym0us.

>use auxiliary/scanner/http/wordpress_login_enum
>set RHOSTS flu-project.com
>exploit
Click para Agrandar

Como vemos no me devolvió ningún usuario valido. La verdad no se por que, por mas que intente con varias paginas, con servidores dedicados, en local, configuración de parámetros, etc...En ninguna de mis pruebas logre obtener un solo resultado exitoso. (Si alguien logra realizar esto con éxito, favor de hacérmelo saber)

WPBF.py

WordPress BruteForce es un script, igualmente programado en python que me agrado bastante, pero que igualmente NO ME DEJO COMPLETAMENTE CONVENCIDO. Podemos descargar este script desde github donde su autor "Andres Tarantini" lo alojo. http://atarantini.github.com/wpbf/

Este es un script de fuerza bruta para probar las contraseñas, detectar plugins y enumerar usuarios.

Aunque tiene una gran cantidad de opciones yo solo mostrare la enumeración de usuarios. En esta ocasión la pagina "afortunada" es el famoso sitios de tecnología, gadgets, y ¿Seguridad? -> g3ekarmy.com

$python2.7 wpbf.py -eu -mu 40 http://g3ekarmy.com

La opción -eu es para (enumerate uses)
La opción -mu 40 es para definir la cantidad máxima de usuarios a obtener

Click para Agrandar

Le dijimos que obtuviera un máximo de 40 usuarios y obtuvo con éxito 12. Pinta bien el programa =) Sin embargo veremos después que con wp_users podemos obtener mas de 12 usuarios 😉

Sin duda wpbf es una buena opción a tener en cuenta.

w3af

w3af no necesita presentación, si estas leyendo esto, seguro conoces w3af a fondo y en modo "console" 😉

Dentro de los muchos plugins de w3af tenemos en el área de "discovery" el plugin "wordpress_enumerate_users" el cual usaremos. Veamos dos ejemplos uno ahora con la pagina de seguridad infospyware.com y de nuevo con daboblog.com

Si corremos el plugin contra daboblog.com vemos que solo encuentra al usuario "admin", como lo hizo flunym0us.

Click para Agrandar

Ahora si lo corremos contra infospyware.com vemos que nos devuelve una gran cantidad de usuarios exitosamente.

Conclusión:

  • Flunym0us Sin duda es un gran Scanner de vulnerabilidades y que en el futuro seguramente mejorara la enumeración de usuarios.
  • Metasploit no pude hacerlo funcionar de ningún modo, será que ¿Necesito clases personalizadas?
  • wpbf.py un gran script que nos puede ayudar en ciertas cosas, pero que al final no es la elección definitiva.
  • w3af es la mejor opción para enumerar usuarios...¿O por lo menos lo era hasta ahora?

¿Como funcionan estos programas para enumerar usuarios?

Manera 1:

Es realmente sencillo, hace tiempo se descubrió que wordpress tenia una "vulnerabilidad/utilidad" donde si uno pone en una pagina que este usando wordpress... pagina.com/?author=1 nos devuelve todas las entradas de este usuario, y claro en el cuerpo del html vendría el nombre de usuario.

También puede venir en el title, así es como lo maneja Flunym0us.

Entonces la manera obvia de obtener usuarios es ir iterando sobre este parámetro y si nos contesta el servidor exitosamente, buscamos el usuario (Esa es la lógica que varios de estos programas usan).

Manera 2:

Esta forma de obtener los usuarios es realmente el mismo que la manera 1, la única diferencia es que cuando ingresamos a pagina.com/?author=1 nos redirige a pagina.com/author/usuario de esta manera podemos obtener el usuario desde la URL, o también desde el cuerpo HTML.

Manera 3:

Podemos obtener los post de los usuarios con el parámetro pagina.com/?author_name=usuario donde usuario es el nombre del autor. Esta manera no es muy buena puesto que tendríamos que estar fuzzeando mucho, o con un diccionario ya bien establecido podríamos obtener algunos usuarios, pero no tiene para nada el mismo impacto que la manera 1.

Cada uno de los métodos es valido, complementario y funcional. El éxito del ataque dependerá de como el blog lo maneje y esto a su vez depende mucho del TEMA que el blog este usando, también depende del idioma y/o de si el blog se encuentra dentro de una carpeta que no sea la principal.

Y así nace: wp_users.sh

wp_users.sh a diferencia de los otros programas vistos anteriormente esta programado en Bash.

./wp_users enumera y obtiene los usuarios registrados en WordPress

Trate de que tenga la mayor compatibilidad posible con los sistemas (Las expresiones regulares son del tipo a-zA-Z y no a-Z para que no hubiera problemas en sistemas Mac OS), no usa muchos programas externos, sino al contrario usa muchos programas que ya vienen instalados en muchos sistemas *nix por default o de comandos internos. Por el momento fue probado en BackTrack 5 R3 sin ningún tipo de problema.

Hago uso de "echo, egrep, cut, tail, read, head, declare, let"

El único programa que podría no venir por default en tu sistema es "GET" que pertenece a las utilidades de "lwp-mirror - Simple Mirror Utility".

Características:

  • 100% Editable y personalizable
  • Tiene 2 maneras de poder Enumerar usuarios (Método 1 y 2)
  • Puede identificar si una pagina usa wordpress o no.
  • Identifica la Versión de wordpress si es posible.
  • Puedes definir cuantos INTENTOS (no usuarios) deseas realizar
  • Hace por defecto "User Agent Spoofing", el cual puedes modificar o eliminar desde el codigo.
  • A diferencia de los demás, wp_users DEVUELVE el ID de los usuarios encontrados
  • ES SOFTWARE LIBRE

Contras:

  • Puede ser muy lento, por la programación estructurada manejada y por el UA spoofing
  • Aun no es 100% compatible con todos los blogs (A mejorar las expresiones regulares en un futuro)

Ejemplos:

Ej1)

Lo corremos contra g3ekarmy.com con 40 intentos (Numero hasta donde llegara la iteración del ciclo).

Click Aqui para Agrandar

A diferencia de wpbf.py, wp_users.sh nos devuelve en 40 intentos mas usuarios que lo que logro wpbf.py, así mismo el formato es mas vistoso.

Ej2)

Recuerdan como flunym0us y w3af solo nos devolvía un usuario (admin) con el blog de daboblog.com? Veamos que hace wp_users.sh

Lo lanzamos con 100 intentos.

Click Aqui para Agrandar

Genial no? =) Sabia había mas usuarios de lo que w3af y flunym0us nos decía...Os empieza a gustar wp_users.sh o no?

Profundizando:

Debemos entender como funciona el método 1 y 2 explicados anterior mente e implementados en wp_users.sh

Cuando corremos wp_users.sh pagina.com #Intentos lo que hace el programa es pedir pagina.com/?author=#Intentos para cada pagina si nos contesta Ok, busca la palabra author-$USUARIO. Donde $USUARIO es lo que extraemos y obtenemos...

Sin embargo en varias paginas, nos contestara un 200, pero no nos devolverá nada... ¿Por qué? Por que puede que exista una redirección de pagina.com/?author=#ID a pagina.com/author/USUARIO en este caso wp_users identificara si lo que devuelve esta vacío y después de 10 intentos nos recomendara que usemos el método 2:

./wp_users.sh --inurl

En este método ingresaremos de nuevo la pagina y numero de intentos e intentara obtener los usuarios de una manera diferente...buscando ahora $web/author/$USUARIO/ y extrayendo $USUARIO, si encuentra esto nos devolverá los usuarios, de lo contrario también saldrá vacío y esto querrá decir que el programa no fue capaz de obtener los usuarios por que la pagina puede estar manejando la url de manera diferente:

Ej: Fallara si el blog en vez de redirigir a pagina.com/author/USUARIO, redirige a pagina.com/autor/USUARIO...(Próximamente se agregara mas compatibilidad)

Ejemplo de cuando usar el método 2 --inurl...Por ejemplo daboblog.com es una de esas paginas donde con el método 1 no obtendremos nada, pero con el 2 si.

Y esto señores es wp_users.sh, les parece ¿interesante? o ¿útil?.

Nota: Los blogs que fueron usados para ejemplos fueron sacados de los participantes en los premios bitácoras por mejor blog a seguridad parcial III http://bitacoras.com/premios12/clasificaciones/mejor-blog-sobre-seguridad-informatica/3 Espero ningún webmaster se moleste por esta situación, pero me pareció interesante probar mi herramienta con los blogs de seguridad que compiten y usan wordpress. Cualquier malentendido favor de tratarlo directamente conmigo (@hecky)

Comentarios finales:

¿Por qué escribiste wp_users?

Primeramente para demostrar que a veces las herramientas mas famosas no nos resuelven todo, y sirve de mucho INVESTIGAR, PROBAR y poder CREAR nuestras herramientas manualmente.

¿Por qué escribirlo en bash y no en python, perl, ruby?

Los que me conocen saben que soy fanático de Bash, y lo que intento demostrar desde hace tiempo es que no es nada difícil como muchos creen, que facilita muchísimas tareas y es sumamente útil aprenderlo.

¿Habrá actualizaciones?

Creo eso dependerá de la demanda, para mi esta muy bien así, y si necesito acoplarlo a un escenario en especifico no se tardara nada en hacerlo manualmente. La parte esencial del programa no pasa de unas 8 líneas, sin embargo creció tanto por manejo de errores, explicación del programa, etc...

¿Existe una manera de Protegerme?

¡SI! Hay dos maneras MEGA EFICIENTES para protegernos de que nos hagan este "dump" de usuarios...Pero eso lo quiero exponer en CampusParty México 4, si desean saber como, podrían apoyarme para dar la conferencia que tengo pensada como "Hardening WordPress - The technical,easy and useful way" donde dare varios tips de este tipo.

Pueden descargar wp_users.sh desde mi repositorio en github:

Articulo escrito por Hecky de Neobits.org para La Comunidad DragonJAR

Hecky es un apasionado e interesado en "Researching, Steganalysis, Hardening, Linux, Vulnerability Assesment & Digital Forensics", miembro de la comunidad DragonJAR y pueden ubicarlo en Twitter (@hecky)

Subir