Vulnerabilidad XMLRPC en WordPress

> El archivo xml-rpc.php (Remote Procedure Call, o llamada a procedimiento remoto en XML) es un componente que permite interactuar de forma remota con un...

# ¿Qué es el archivo XML-RPC.php?

El archivo xml-rpc.php (Remote Procedure Call, o llamada a procedimiento remoto en XML) es un componente que permite interactuar de forma remota con un sitio web de WordPress mediante el protocolo XML-RPC, permitiendo así realizar diferentes operaciones.

Entre estas funciones permite:

  • Publicación remota: Permite a los usuarios publicar contenido en su sitio de WordPress desde aplicaciones externas.

  • Gestión de Contenidos: Se pueden realizar tareas como editar y eliminar publicaciones, gestionar comentarios y categorías, entre otras.

  • Compatibilidad: Facilita la integración con otros servicios web y aplicaciones que utilizan el protocolo XML-RPC.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

# | Detectar y Explotar XML-RPC

En el siguiente ejemplo voy a utilizar la máquina Mr. Robot1 para mostrarles el método de detección y explotación de XML-RPC. Como experiencia personal, en entornos reales está vulnerabilidad suele ocurrir frecuentemente.

Por seguridad, siempre que descarguen una máquina de Vulnhub asegúrese de comprobar la salida del hash y compararla con el repositorio oficial. Esto garantizará la integridad del archivo.

$ Get-FileHash -Algorithm MD5 .\mrRobot.ova

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Una de las formas más fácil de saber si el archivo XML-RPC se encuentra disponible es haciendo uso de WPScan.

$ wpscan --url http://example.com

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

O el método más simple, realizar un fuzzing pero aplicando un filtro con archivos ".php".

$ dirb http://example.com /usr/share/wordlists/dirb/common.txt -X '.php'

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Si accedemos al archivo del navegador podemos ver que solamente acepta peticiones a través del método POST.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Con el comando curl podemos enviar una petición mediante POST:

$ curl -X POST http://example.com/xmlrpc.php

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Soy un usuario que le gusta mucho manejar la terminal antes que cualquier interfaz gráfica, pero cuando se trata de aplicaciones web es indispensable usar Burp para estas pruebas.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Para aprovecharse de esta vulnerabilidad se tiene que jugar con las requests, la idea es mandar una petición para enumerar información del wordpress que hay por detrás. Es tan sencillo con hacer una búsqueda en google y acceder a algunos payloads. Por ejemplo: https://github.com/kh4sh3i/xmlrpc-exploit

Al invocar el método system.listMethods devuelve una lista de funcionalidades disponibles en el servidor XML-RPC.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Del lado del Response:

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Una de las primeras funcionalidades que nos permite realizar un ataque de fuerza bruta contra los usuarios de WordPress es el uso del archivo wp.getUsersBlogs.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

El siguiente payload XML permite realizar un ataque de fuerza bruta, primero se le especifica el usuario y por útlimo la contraseña.

$ <?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
 <param>
  <value>
   <string>admin</string>
  </value>
 </param>
 <param>
  <value>
   <string>password</string>
  </value>
 </param>
</params>
</methodCall>

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Para enumerar los usuarios podemos hacer uso de WPScan o mandar la petición al Intruder y modificarla desde allí.

Con WPScan:

$ wpscan --url http://example.com --enumerate u

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

No siempre se tiene suerte con la enumeración de usuarios en WPScan, pero en caso de encontrar alguno se podría probar fuerza bruta con los parámetros:

$ wpscan --url http://example.com --passwords /ruta/a/tu/wordlist.txt --usernames USUARIO

En el módulo Intruder nos ubicamos en Positions, limpiamos haciendo clíc en Clear§. Seleccionamos el usuario y le damos en Add§, lo mismo con la contraseña.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

En el "tipo de ataque" seleccionamos modo Cluster bomb, este modo permite ir iterando en ambas posiciones del diccionario para probar todas las combinaciones.

image
image 🔍 click para ampliar

Luego de haber hecho lo anterior, nos dirijimos nuevamente a Intruder > Payloads. El Payload 1 indica que el primer diccionario es para descubrir el usuario y en el tipo de payloads lo dejamos en lista simple.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Ya deberíamos contar con un diccionario propio o descargar uno. Por ejemplo, SecList es un repositorio completo que contiene muchos diccionarios de usuarios, contraseñas, payloads, etc.

En la posición de Payload 2 indicamos el segundo diccionario para descubrir la contraseña.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

El siguiente paso será ir a Intruder > Payloads > Settings y en la sección de "Grep Match" damos en Clear. En "Add" agregamos un mensaje que devolverá si la contraseña o usuario es incorrecta.

image
image 🔍 click para ampliar

Y por último, desactivan el proxy Intercep OFF, y en Intruder le dan a "Start Attack".

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

En este caso vemos que el usuario es Elliot y la contraseña es ER28-0652. Estas credenciales fueron ingresadas intencionalmente solo para desmostrar el procedimiento. Por defecto WordPress tiene un panel de administración ubicado en /wp-admin o /wp-login.php, pero los desarrolladores suelen desactivarlo y por lo tanto no se podría realizar fuerza bruta con WPScan o Hydra, de ahí la ventaja de probar el XML-RPC (siempre y cuando este activado).

El error más común de WordPress es decirnos que el usuario es correcto, pero la contraseña no. Aquí ya tenemos una pista para empezar la fuerza bruta, dado que el usuario es reconocido.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

La vulnerabilidad XML-RPC no solamente sirve para enumerar usuarios o realizar fuerza bruta, hay otros módulos como pingback.ping que son útiles para realizar ataques de denegación de servicio distribuido (DDoS) o ataques XSPA. Esto último lo pueden ejecutar a través de las requests.

# MITIGAR VULNERABILIDAD XML-RPC

La forma más sencilla de mitigar la vulnerabilidad XML-RPC es editando el archivo de wp-config.php con la siguiente línea de código:

$ add_filter('xmlrpc_enabled', '__return_false');

Si tienen permisos para editar el fichero .htaccess también puede desactivarlo desde ahí:

$ # START XML RPC BLOCKING
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
# FINISH XML RPC BLOCKING

Otra de las medidas que recomiendo para su sitio en WordPress es instalar el plugin "Stop User Enumeration" para evitar que usuarios malintencionados enumeren usuarios.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Finalmente, otros de los tantos plugins que no pueden faltar es "WPS Hide Login", éste último ayuda a ocultar/reemplazar la ruta de acceso /wp-admin o /wp-login.php por otra.

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Ilustración del procedimiento
Ilustración del procedimiento 🔍 click para ampliar

Advertencia: Todo el contenido de este artículo es estrictamente educativo. No nos hacemos responsables del mal uso de esta herramienta o información. Practica únicamente en entornos controlados y con autorización.
× Imagen ampliada