Prueba de Concepto: Realizar un Ataque DoS en WordPress

WordPress es un sistema de gestión de contenidos (Content Management System o CMS) lanzado el 27 de mayo de 2003, enfocado a la creación de cualquier tipo de página web. Originalmente alcanzó una gran popularidad en la creación de blogs, para luego convertirse en una de las principales herramientas para la creación de páginas web comerciales.


El archivo wp-cron.php es una de las piezas más utiles y, a la vez, más problemáticas de WordPress.

WordPress necesita ejecutar ciertas tareas programadas (como publicar un post a una hora fija, buscar actualizaciones o enviar correos), pero no tiene acceso al programador de tareas del servidor (Crontab en Linux).

Para solucionar esto, WordPress usa un programador de tareas que:

  • Cada vez que alguien visita tu web, WordPress lanza una petición interna al archivo wp-cron.php.
  • El archivo revisa la lista de tareas pendientes, y si hay algo que hacer lo ejecuta.
¿Por qué es vulnerable a un ataque DoS?

La vulnerabilidad no es un fallo de codigo (bug), si no más bien un problema de diseño en su ejecución. Un atacante puede explotarlo de la siguiente manera:
  1. Ejecución pública: Por defecto, el archivo es accesible desde https://urldelsitio.com/wp-cron.php. No requiere de contraseña.
  2. Carga de recursos: Cada vez que se llama a este archivo, el servidor web debe de arrancar el motor de PHP, conectar con la Base de Datos y cargar el núcleo de WordPress para verificar las tareas.
  3. The Flood: Si un atacante envía 100 peticiones por segundo a esa url específica, el servidor intentará abrir 100 procesos PHP simultaneos.
El resultado: El Procesador (CPU) llega al 100% de uso y la memoria RAM se llena intentando gestionar tantas conexiones. La web dejara de responder para los usuarios que la visiten (Denegación de Servicio).

Tras comprobar que el archivo wp-cron.php es accesible, podemos lanzar el ataque de la siguiente forma:

$ ab -n 5000 -c 50 -k -H "Accept-Encoding: gzip, deflate" https://urldelsitio.com/wp-cron.php

El comando ab es una herramienta para evaluar el rendimiento de tu servidor Apache:

  • -n: Número de solicitudes que se realizarán durante la sesión de evaluación comparativa. Por defecto, se realizará una sola solicitud, lo que suele generar resultados de evaluación comparativa poco representativos.
  • -c: Número de solicitudes simultáneas que se pueden realizar. Por defecto, se realiza una solicitud a la vez.
  • -k: Habilita la función HTTP KeepAlive, es decir , realiza varias solicitudes dentro de una misma sesión HTTP. Por defecto, KeepAlive está desactivado.
  • -H: Agrega encabezados adicionales a la solicitud. El argumento suele tener la forma de una línea de encabezado válida, que contiene un par campo:valor ( es decir , "Accept-Encoding: gzip, deflate").
Tras haber lanzado el ataque veremos que la web queda totalmente bloqueada.

SOLUCIÓN
Se recomienda desactivar Wp-Cron y crear un cronjob real en el host que ejecute las acciones necesarias a intervalos regulares sin que cause problemas, y para una capa de seguridad adicional, puedes bloquear el acceso directo a wp-cron.php desde el exterior mediante tu archivo .htaccess o reglas de firewall (WAF).