Desactiva XML-RPC para mejorar la seguridad de WordPress

Un ataque de fuerza bruta consiste en probar todas las combinaciones posibles de usuarios y contraseñas hasta conseguir el acceso al administrador de WordPress. El número de combinaciones es muy alto por eso los atacantes buscan técnicas para acelerar el ataque.

Usando ataques de fuerza bruta amplificados un atacante puede probar cientos o miles de combinaciones simultáneamente donde antes realizaba un intento. Solo están limitados por la memoria disponible del servidor y son mucho más efectivos y difíciles de detectar. En este artículo te enseño como detectarlos revisando los registros del servidor y como mitigarlos en WordPress.

Para entender como funciona un ataque de fuerza bruta amplificado hay que conocer qué es y cómo funciona el api XML-RPC de WordPress.

Qué es XML-RPC

El api XML-RPC de WordPress proporciona una forma de dar ordenes remotas a WordPress y sin necesidad de entrar al escritorio. Para usarlo hay que enviar una petición HTTP a xmlrpc.php con un documento XML que contiene las ordenes a WordPress.

Usando el api es posible controlar casi todos los aspectos de WordPress: los posts, las taxonomías, los archivos multimedia, los comentarios, las opciones y los usuarios.

Puedes hacerte una idea de sus posibilidades mirando los comandos que tiene disponibles:

Posts 
    wp.getPost
    wp.getPosts
    wp.newPost
    wp.editPost
    wp.deletePost
    wp.getPostType
    wp.getPostTypes
    wp.getPostFormats
    wp.getPostStatusList

Taxonomies
    wp.getTaxonomy
    wp.getTaxonomies
    wp.getTerm
    wp.getTerms
    wp.newTerm
    wp.editTerm
    wp.deleteTerm

Media
    wp.getMediaItem
    wp.getMediaLibrary
    wp.uploadFile

Comments
    wp.getCommentCount
    wp.getComment
    wp.getComments
    wp.newComment
    wp.editComment
    wp.deleteComment
    wp.getCommentStatusList

Options
    wp.getOptions
    wp.setOptions

Users
    wp.getUsersBlogs
    wp.getUser
    wp.getUsers
    wp.getProfile
    wp.editProfile
    wp.getAuthors

El api XML-RPC esta activo por defecto en todoas las instalaciones de WordPress a partir de la versión 3.5 y lo utilizan algunos clientes como Jetpack para controlar WordPress remotamente.

Ataque de fuerza bruta con XML-RPC

En general el acceso al API está protegido por usuario y contraseña para las operaciones que modifican datos.

Así, para realizar un ataque de fuerza bruta basta con realizar llamadas consecutivas al API probando distintos usuarios y contraseñas como parámetros.

Veamos un ejemplo de ataque que prueba un usuario y contraseña llevado a cabo desde la consola con curl:

# curl -0 http://example.org/xmlrpc.php \
-H 'Content-Type: text/xml' \
-d @- << EOF
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
 <param>
  <value>
   <string>admin</string>
  </value>
 </param>
 <param>
  <value>
   <string>password123</string>
  </value>
 </param>
</params>
</methodCall>
EOF

Si el usuario y la contraseña son incorrectos la respuesta del api será:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>403</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>Nombre de usuario o contraseña incorrecta.</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

Si simultáneamente observas los ficheros log del servidor durante un ataque verás como cada intento es registrado:

1.2.3.4 - - [22/May/2019:22:12:26 +0200] "POST /xmlrpc.php HTTP/1.1" 200 415 "http://example.org" "-"
1.2.3.4 - - [22/May/2019:22:12:27 +0200] "POST /xmlrpc.php HTTP/1.1" 200 415 "http://example.org" "-"
1.2.3.4 - - [22/May/2019:22:12:28 +0200] "POST /xmlrpc.php HTTP/1.1" 200 415 "http://example.org" "-"
1.2.3.4 - - [22/May/2019:22:12:29 +0200] "POST /xmlrpc.php HTTP/1.1" 200 415 "http://example.org" "-"
...

Como puedes imaginar para que el ataque tenga éxito hay que probar un gran número de combinaciones que dejan muchos registros en los archivos de log. Por eso, este ataque es fácil de detectar y los atacantes tratan de minimizar sus huellas y pasar desapercibidos con ataques amplificados.

Ataque amplificado

Los atacantes amplificados explotan la propiedad system.multicall del api que permite dar múltiples órdenes en una sola petición HTTP.

Para saber si un WordPress acepta multicall, ejecuta este comando en la consola:

curl -0 https://example.org/xmlrpc.php \
-H 'Content-Type: text/xml' \
-d @- << EOF
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
	<methodName>system.listMethods</methodName>
</methodCall>
EOF

En este caso, la respuesta indica que system.multicall está habilitado:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <params>
    <param>
      <value>
      <array><data>
  ...
  <value><string>system.multicall</string></value>
  ...

La propiedad multicall fue ideada para realizar operaciones masivas sobre WordPress: editar múltiples entradas, comentarios o usuarios. Sin embargo, un atacante puede utilizarla para probar decenas o cientos de contraseñas en una única petición HTTP.

Bloquear xmlrpc.php

El api esta habilitado por defecto en WordPress. Es recomendable bloquear el acceso por completo al api para conseguir:

  • Reducir el consumo de CPU y memoria del sitio.
  • Eliminar ataques de fuerza bruta y pingback.
  • Reducir el efecto de ataques de denegación de servicio (DDoS).

En el caso de que algún plugin lo utilice —como Jetpack— al menos bloquea el uso del método multicall.

A continuación verás algunos métodos para bloquear el acceso al fichero xmlrpc.php que es el punto de entrada al api.

Prohibir las peticiones HTTP a xmlrpc.php

Añade estas líneas al fichero .htaccess del sitio para que el servidor devuelva un código 403 de acceso prohibido cuando alguien haga una llamada a xmlrpc.php.

# bloquear xmlrpc.php
<IfModule mod_alias.c>
	RedirectMatch 403 (?i)/xmlrpc.php
</IfModule>

Bloquear el fichero xmlrpc.php

Para bloquear la lectura del fichero xmlrpc.php añade estas líneas al fichero .htaccess:

# bloquear xmlrpc.php
<Files xmlrpc.php>
	Order Deny,Allow
	Deny from all
</Files>

Bloquar el método multicall

Los anteriores métodos bloquean por completo el uso del api. Con una función personalizada en el tema es posible bloquear solo los métodos del api que presentan más riesgo para la seguridad:

# métodos del api que presentan más peligro
system.multicall
system.listMethods
system.getCapabilities
pingback.extensions.getPingbacks
pingback.ping

Para bloquear estos métodos peligrosos añade estas líneas al fichero functions.php del tema activo:

function disable_xmlrpc_danger_methods($methods) {
	unset($methods[
		'system.multicall', 
		'system.listMethods', 
		'system.getCapabilities',
		'pingback.extensions.getPingbacks',
		'pingback.ping', 
		]);
	return $methods;
}
add_filter('xmlrpc_methods', 'disable_xmlrpc_danger_methods');

Crea un tema hijo para añadir tus propias funciones al functions.php

Verificar el bloqueo

Por último falta comprobar que el bloqueo está funcionando. Desde la consola de tu equipo ejecuta esta petición con curl:

# curl -0 https://example.org/xmlrpc.php \
-H 'Content-Type: text/xml' \
-d @- << EOF
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>
EOF

Y verás, que ahora la respuesta es 403 o prohibido.

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>

El Api XML-RPC es solo uno de los muchos aspectos a tener en cuenta de la seguridad de WordPress. En la Guía antihackeo para WordPress te explico otros apartados importantes para mantener seguro tu WordPress.

César Maeso


Creative Commons License

Esta obra está bajo una licencia de Creative
Commons Reconocimiento-NoComercial-CompartirIgual
4.0 Internacional
.