Programador PHP freelance

Como proteger el WordPress de un ataque DDOS mediante xmlrpc.php

Siempre empieza igual. O bien alguno de los monitores de sistema que tienes montado te avisa o lo hace el más rápido de ellos: Tus clientes. Y en este caso han sido ambos.

Estoy acabando de desayunar cuando aprovecho para quitar el modo avión del móvil. Empiezan a entrar whatsapps y emails. En los emails, notificaciones de que la web del cliente no está accesible. Al rato vuelve a estarlo y al rato a no estarlo. No pinta bien.
En el Whatsapp, el cliente comentando que algo anda mal.

Primera prueba, navegar el site. Efectivamente el tiempo de carga es lento. Te logueas en el servidor y te encuentras con un montón de procesos Apache2 lanzados y bastante sobrecarga en el demonio Mysql. A priori parece un ataque.

Se necesita más visibilidad para saber que está pasando así que si no lo tienes ya mejor instalar el Módulo mod_status de Apache, el cual nos va a permitir ver, entre otras cosas, que URLs se están pidiendo.

Pasos:

  1. Activar el módulo con sudo a2enmod status
  2. Editar /etc/apache2/mods-enabled/status.conf
  3. Configurar ExtendedStatus a On dentro de <IfModule mod_status.c>
  4. Dentro de <Location /server-status> añadir nuestra IP a la directiva Allow
  5. Reiniciar Apache con sudo service apache2 restart
  6. Acceder http://tuservidor.net/server-status

Aquí os dejo un ejemplo del informe que facilita. Por motivos de seguridad no es el de mi servidor 😉

El caso es que en el informe veo que hay 97 llamadas a dos de mis dominios con WordPress. En concreto a las urls http://dominiodelcliente.com/xmlrpc.php busco un poco por Google y me encuentro con un vulnerabilidad pingback que hace referencia a una vulnerabilidad de los pingback y la forma en la que un ataque Ataques DDOS a tu xmlrpc.php puede ser utilizado.

En el mismo artículo proponen una solución bastante sencilla e inmediata que pasa por añadir una regla en el .htaccess de los dominios afectados para devolver un error 403 a las peticiones hechas contra el fichero xmlrpc.php.

<Files xmlrpc.php>
Order allow,deny
Deny from all
</Files>

Con esto se ha paliado el ataque.