Buenas a todos, en la vida del auditor cada día de trabajo puede ser diferente, será normal que nos encontremos con cosas raras que nunca antes habíamos visto, portales con lenguajes usados de pascuas a ramos, etc. pero también en otras muchas ocasiones nos cansaremos de ver siempre los mismos portales, gestores de contenidos, gestores documentales, wikis… Creo que el que más veces me he encontrado en auditorías ha sido WordPress, y es normal, porque lo que empezó siendo como un sistema de blogs ha crecido para convertirse en uno de los mayores motores de desarrollo de portales web, cada vez más avanzados.
En Flu Project hemos dedicado varias entradas ya a auditar WordPress, pero nos ha parecido interesante publicar una serie de artículos enumerando algunos pasos lógicos útiles que haría un pentester para auditar estos CMS, al igual que hicimos ya con la Biblia del Footprinting (en la que por cierto acabamos de superar las 20.000 descargas de la versión en libro PDF, sin contar las versiones que circulan por la red tanto en PDF como en otros formatos como epub, etc. ¡gracias!)
Si os fijáis a esta cadena no le he puesto fin (parte I de X…), porque poco a poco iremos aprendiendo nuevas posibles vulnerabilidades que será interesante analizar desde aquí.
Después de la parrafada… vamos al lio
Cuando realizamos un Test de Intrusión (recordando principios básicos), lo primero que realizaremos será la fase de Footprint, es decir, la recoleción de información pública. Y otra cosa no, pero información pública un WordPress deja… ¡y mucha!
Lo primero que deberemos hacer en una auditoría de WordPress es comprobar la versión. La instalación por defecto de WordPress deja un fichero en la carpeta raíz, llamado “readme.html”. Este archivo tiene la siguiente pinta:
Como véis, se trata de un fichero html que podréis visitar sin problemas desde el navegador, y que muestra la información sobre la versión de WordPress que se encuentra instalada (obviamente será uno de los primeros archivos a eliminar tras instalar un WordPress, pero la inmensa mayoría no lo hace…).
Sabiendo la versión ya podréis googlear en busca de exploits que afecten a dicha versión de WordPress, pero eso lo dejaremos para la fase de explotación de vulnerabilidades, por ahora seguimos footprinteando
El siguiente paso será analizar el código fuente de algunas de las páginas del WordPress y buscar parámetros o comentarios que nos puedan dar más datos de la versión de WordPress para contrastarlos con el obtenido del readme.html (que podrían haber modificado a propósito para engañarnos)
Cómo veis en este caso nos encontramos con un WordPress versión 3.4.1.
Al igual que ya hablamos en la biblia del Footprinting, una de las primeras cosas que realizaremos en un test de intrusión es utilizar el parámetro “site” de Google Hacking, para ver que sabe Google del sitio web, es muy posible que haya indexado imágenes, en cuya ruta sale el típico “wp-content” que nos certificará que se trata de un WordPress (lo veremos a continuación).
En una instalación de WordPress habrá algunas carpetas importantes, la clave de todas ellas es la carpeta wp-content, y bajo la que colgarán las carpetas de la instalación de plugins o la de themes. Esto quiere decir que si buscamos en Google con el parámetro “inurl”, por textos como “wp-content”, “plugins” o “themes”, encontraremos mucha información de utilidad. Además, podríamos acompañarlo del texto “index of” para ver si gentilmente nos ceden los fuentes de su wordpress en un listado de directorios:
Si hay algo que WordPress no hace muy bien (y los programadores de plugins no mejoran…) es gestionar los errores. Por ejemplo, si realizáis una petición a un archivo PHP de un plugin que espera recibir una serie de parámetros, y no le pasáis dichos parámetros, es muy posible que se produzca un error inesperado, que acabe en un Path Disclosure, con el que podremos ver la ruta de instalación del WordPress, lo que nos ayudará a ver si se trata de una instalación realizada en un Windows, un Linux, etc. entre otras cosas.
Además, si por casualidad, los bots indexan estos errores, nos encontraremos con problemas como el siguiente, al que llegaremos combinando las búsquedas anteriores con “Fatal error” o “Fatal error: Call to undefined function”, por ejemplo:
Google Hacking es nuestro amigo, así que le sacaremos el máximo partido en las auditorías
Una parte muy importante en un proceso de auditoría a WP será averiguar que plugins tiene instalados, ya que la mayor parte de las vulnerabilidades vendrán por ahí. WordPress es un CMS usado por millones de usuarios y por tanto, muy probado, y a pesar de que cada pocos meses sale una nueva versión corrigiendo alguna vulnerabilidad, son una minoría en comparación con las que nos encontraremos en los plugins, a veces programados por desarrolladores que no tienen la experiencia suficiente en WordPress y que conlleva a que comentan errores en la toma de medidas de seguridad en el código.
Hace varios meses programamos la herramienta Flunym0us, que permite listar los plugins de WordPress y Moodle, mediante un ataque de Fuzzing por diccionario (tenemos una versión más completa de Flunym0us en pruebas, esperamos poder publicarla pronto). Con esta herramienta tendremos un listado con la mayoría de los plugins que tendrá instalado WordPress, lo que nos permitirá googlear de nuevo en busca de posibles exploits para esos plugins que nos permitan acceder a la BBDD o a la parte interna del portal.
Flunym0us como muchos ya sabréis se encuentra desarrollado en python, por lo que necesitaréis un intérprete de python. Podéis descargar Flunym0us desde aquí.
Una vez descargado lo debéis descomprimir, abrir una consola y ejecutar la siguiente instrucción:
python flunym0us.py -wp http://domain wp-plugins.lst
Fácil ¿no? Y nos devolverá un resultado como el siguiente en el que se mostrarán los plugins instalados:
A continuación os dejo un listado con los plugins que más veces me suelo encontrar:
all-in-one-seo-pack
contact-form-7
akismet
add-to-any
google-analytics-for-wordpress
wp-postviews
tweetmeme
maintenance-mode
feedburner-plugin
wp-security-scan
secure-wordpress
get-recent-comments
gtranslate
login-lockdown
wordpress-firewall-2
absolute-privacy
stealth-login
most-commented
wp-polls
continuaremos con la cadena de articulos sobre auditoría de WordPress hablando sobre la enumeración de usuarios registrados en el CMS.
WordPress permite a través de los parámetros “?author_name=nombre” y “?author=ID”, añadidos a la raíz de la web (http://www.miwordpress.com/?author=1) ver la información y los artículos publicados por un usuario registrador. Nosotros lo utilizaremos con otro fin, el de comprobar si existe un usuario o no.
Podremos programarnos algunos scripts sencillos que recojan de un diccionario números y palabras con las que probar posibles nombres, pero para que la tarea sea más sencilla, W3af tiene ya entre sus utilidades un plugin para enumerar los usuarios, llamado “wordpress_enumerate_users“.
A continuación os mostramos como funciona:
Una vez que hayamos enumerado los usuarios del WordPress ¿qué podremos hacer con ello?. Pues como ya os imagináis, los utilizaremos para intentar autenticarnos con ellos en el portal, bien intentando averiguar la contraseña por lógica o ingeniería social, probando algunas de las contraseñas más utilizadas o el propio nombre de usuario por ejemplo, o bien haciendo un ataque de fuerza bruta. En próximos posts de la cadena os explicaré como realizar un ataque de fuerza bruta con Metasploit para intentar averiguar las claves y por supuesto, también daremos algunos consejos para hacer que nuestro wordpress no sea vulnerable a los ataques de fuerza bruta.
Además del listado de usuarios, también podremos intentar registrar un usuario en el portal (si la configuración así lo permite), para ello solo tendremos que ir a la url http://www.miwordpress.com/wp-admin y pulsar en el link “Registrarse” (si existe).
Una vez registrado un usuario podremos ver si es posible acceder a una sección limitada de la zona interna en la que se muestren estadísticas, los plugins instalados… o quizás, si por defecto está configurado WP para que los usuarios se registren con permisos de administración, podríamos acceder al control de todo el portal, o si los usuarios se crean con permisos de author, a escribir y editar posts.
continuaremos la cadena sobre auditoría de WordPress hablando sobre algunas herramientas que nos permitirán realizar un fingerprint a nuestro wordpress e incluso escanear posibles vulnerabilidades.
Además de Flunym0us, en el mercado encontramos otras herramientas de gran calidad que nos permitirán automatizar ciertas labores a la hora de auditar un WordPress. Una de ellas es Nmap, con el plugin http-wp-plugins que permite listar plugins mediante fuzzing por diccionario al igual que hace Flunym0us. Aunque mis dos preferidas son Plecost (python), de nuestros amigos de Iniqua, @ggdaniel y @ffranz (alguno de sus integrantes nos debe una versión especial de Flu… guiño guiño) y WPScan (ruby), ambas disponibles en Backtrack (entre otras).
Empecemos por Plecost. Plecost nos va a permitir listar los plugins existentes en una instalación de WordPress, además proporcionará la versión y procederá a compararla con la versión actual para verificar si es la última, a continuación devolverá los CVE correspondientes a la vulnerabilidad, en caso de ser conocida.
A continuación os mostramos un ejemplo de Plecost en el que analizamos un portal WordPress y obtenemos, entre otros, los CVE de Akismet. En este caso el portal tenía una versión más actual que la tomada por Plecost como la última, imaginamos que porque no contábamos con la última versión del programa:
En el caso de WPScan, podremos utilizarlo para enumerar usuarios y bruteforcear las claves, para ello podemos pasarle diccionarios con palabras. WPScan también nos recuperará la versión actual de WordPress y el tema instalado:
No quería despedirme hoy sin nombrar la herramienta cms-explorer, no está entre mis preferidas porque es más lenta que las anteriores (aunque no por ello es más mala), pero lo bueno que tiene es que no solo permite auditar wordpress, si no también portales Joomla y Drupal. Podéis descargarlo desde la página oficial.