Skip to main content

Evaluación de seguridad de WordPress con Wazuh

Introducción

Esta guía te ayudará a configurar y utilizar Wazuh para evaluar la seguridad de una instalación de WordPress. Wazuh es una plataforma de seguridad de código abierto que permite realizar evaluaciones de configuración de seguridad (SCA) para identificar posibles vulnerabilidades en tu sitio de WordPress.

Requisitos Previos

Antes de comenzar, asegúrate de tener lo siguiente:

  1. Un servidor con WordPress instalado.
  2. Acceso root o permisos de administrador en el servidor.
  3. Docker instalado (si decides usar la versión en contenedores).
  4. WP-CLI instalado en el servidor (herramienta de línea de comandos para WordPress).

Instalación de Wazuh

Opción 1: Instalación en Docker

Si prefieres usar Docker, sigue estos pasos:

Clona el repositorio de Wazuh Docker:

git clone <https://github.com/wazuh/wazuh-docker.git> -b v4.9.2
cd wazuh-docker/single-node

Genera los certificados para el indexador:

sudo docker compose -f generate-indexer-certs.yml run --rm generator

Inicia los contenedores de Wazuh:

sudo docker compose up -d

Accede a la interfaz de Wazuh en tu navegador:

https://localhost   #credenciales por defecto  admin:SecretPassword

image.png

Opción 2: Instalación Manual

Si prefieres instalar Wazuh manualmente, sigue la guía oficial de la AGETIC:

Configuración de WP-CLI

Para que Wazuh pueda interactuar con WordPress, necesitas tener WP-CLI instalado en el servidor. Sigue estos pasos:

curl -O <https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar>
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Verifica que WP-CLI esté instalado correctamente:

wp --info

Creación de Políticas de Seguridad para WordPress

Paso 1: Crear el Archivo de Políticas

Crea un archivo YAML para definir las políticas de seguridad que Wazuh evaluará en tu instalación de WordPress.

sudo su
mkdir /home/local_sca_policies/
touch /home/local_sca_policies/custom_wordpress_policy.yml
nano /home/local_sca_policies/custom_wordpress_policy.yml

Pega el siguiente contenido en el archivo:

# Security Configuration Assessment
# Hardening policies for WordPress installations

policy:
  id: "wordpress_assessment"
  file: "custom_wordpress_policy.yml"
  name: "Evaluación de configuración de seguridad para instalaciones de WordPress."
  description: "Guía para establecer una configuración segura en instalaciones de WordPress."
  references:
    - https://wordpress.org/support/article/hardening-wordpress/
    - https://wpsecuritychecklist.org/items/

requirements:
  title: "Verificar que el endpoint sea un host de WordPress y que tenga instalada la herramienta wp-cli."
  description: "Requisitos para ejecutar el escaneo de SCA contra la política de configuración de WordPress."
  condition: all
  rules:
    - 'f:$wp_install_dir/wp-config.php'
    - 'c:wp --info --allow-root -> r:^WP\pCLI\sversion\p'

variables:
  $wp_install_dir: /var/www/html # Example: /var/www/html
  $wp_host:  http://172.19.0.5:8000/ # Examples: https://example.com 
  $wp_user: admin # Example: admin
  $wp_security_plugin: wordfence # Example: wordfence 

checks:
  - id: 100000
    title: "Fortalecimiento de WordPress: Asegurar que la versión de WordPress esté actualizada."
    description: "La versión instalada de WordPress debe ser la última versión disponible en https://wordpress.org/download/."
    rationale: "Pueden descubrirse nuevas vulnerabilidades en WordPress. Es importante actualizar a la última versión para evitar que se exploten vulnerabilidades descubiertas en versiones antiguas."
    remediation: "Actualizar WordPress a la última versión."
    condition: all
    rules:
      - c:runuser -l $wp_user -c "wp core check-update --path=$wp_install_dir" -> r:WordPress\sis\sat\sthe\slatest\sversion

  - id: 100001
    title: "Fortalecimiento de WordPress: Asegurar que los permisos del archivo .htaccess estén configurados en 644."
    description: "Esta política verifica los permisos del archivo .htaccess en el directorio raíz de la instalación de WordPress."
    rationale: "Usuarios no autorizados podrían leer el archivo .htaccess si los permisos no son lo suficientemente estrictos. Además, permisos demasiado restrictivos pueden causar errores al cargar un sitio de WordPress."
    remediation: "Establecer los permisos del archivo en 644 ejecutando el comando chmod 644 $wp_install_dir/.htaccess"
    condition: all
    rules:
      - c:stat -c '%a' $wp_install_dir/.htaccess -> r:644

  - id: 100002
    title: "Fortalecimiento de WordPress: Asegurar que la depuración de WordPress esté desactivada."
    description: "Esta política verifica si la depuración de WordPress está habilitada en el archivo wp-config.php."
    rationale: "Cuando WP_DEBUG está habilitado, se muestra información detallada sobre errores en las páginas del sitio web. Esto puede incluir información sobre errores, funciones obsoletas y código vulnerable que puede ser explotado por actores maliciosos."
    remediation: "Desactivar la depuración de WordPress estableciendo la variable WP_DEBUG en wp-config.php en false."
    condition: none
    rules:
      - c:runuser -l $wp_user -c "wp config list WP_DEBUG --path=$wp_install_dir" -> r:true|1

  - id: 100003
    title: "Fortalecimiento de WordPress: Asegurar que no haya archivos de respaldo (.zip, .back, .bac, .old) en el directorio raíz de la instalación de WordPress."
    description: "Esta política verifica si hay archivos de respaldo o comprimidos del sitio web o plugins en el directorio raíz de la instalación de WordPress."
    rationale: "Se pueden crear archivos de respaldo de algunos archivos de configuración sensibles, como wp-config.php.bak, antes de editar la configuración en vivo. Dado que estos archivos ya no terminan en .php, no son procesados por el motor de PHP y pueden ser leídos por cualquiera. Esto puede llevar a la divulgación de información sensible."
    remediation: "Realizar una limpieza de medios para eliminar bases de datos, archivos antiguos y de respaldo. Además, dejar solo los archivos necesarios en el directorio raíz de la instalación de WordPress."
    condition: none
    rules:
      - c:sh -c "cd $wp_install_dir; ls -la" -> r:.zip|.back|.backup|.bak|.old|.previous|.sql

  - id: 100004
    title: "Fortalecimiento de WordPress: Asegurar que no se utilicen nombres de cuentas administrativas comunes."
    description: "Esta política verifica si se utilizan nombres de cuentas administrativas comunes (por ejemplo, admin, administrator, webmaster)."
    rationale: "El uso de nombres de cuentas administrativas comunes aumenta la probabilidad de un ataque de fuerza bruta exitoso."
    remediation: "Renombrar todas las cuentas administrativas predeterminadas y utilizar nombres de cuentas administrativas poco comunes."
    condition: none
    rules:
      - c:runuser -l $wp_user -c "wp user list --field=user_login --path=$wp_install_dir" -> r:admin|administrator|backup|webmaster

  - id: 100005
    title: "Fortalecimiento de WordPress: Asegurar que la navegación de directorios esté deshabilitada."
    description: "Esta política verifica si se puede listar el contenido de directorios sensibles (por ejemplo, wp-includes, wp-admin, wp-content)."
    rationale: "Cuando la navegación de directorios está habilitada en un servidor web, puede llevar a la divulgación de información sensible y permitir el listado del contenido de directorios privilegiados."
    remediation: "Deshabilitar la navegación de directorios agregando 'Options All -Indexes' en el archivo .htaccess de esta instalación de WordPress."
    condition: all
    rules:
      - c:cat $wp_install_dir/.htaccess -> r:Options\sAll\s\.Indexes

  - id: 100006
    title: "Fortalecimiento de WordPress: Asegurar que los permisos de las carpetas de WordPress estén configurados en 755."
    description: "Esta política verifica los permisos de las carpetas en las instalaciones de WordPress."
    rationale: "El uso de permisos incorrectos en las carpetas de una instalación de WordPress puede dejar los archivos en esos directorios expuestos a modificaciones no autorizadas."
    remediation: "Establecer todas las carpetas en el directorio de WordPress en 755 usando el comando chmod."
    condition: all
    rules:
      - c:stat -c '%a' $wp_install_dir/wp-admin -> r:755
      - c:stat -c '%a' $wp_install_dir/wp-includes -> r:755
      - c:stat -c '%a' $wp_install_dir/wp-content -> r:755
      - c:stat -c '%a' $wp_install_dir/wp-content/plugins -> r:755
      - c:stat -c '%a' $wp_install_dir/wp-content/themes -> r:755

  - id: 100007
    title: "Fortalecimiento de WordPress: Asegurar que no haya plugins desactualizados."
    description: "Esta política verifica que no haya plugins de WordPress desactualizados en esta instalación de WordPress."
    rationale: "Los plugins desactualizados pueden tener vulnerabilidades que actores maliciosos pueden explotar para tomar el control de un sitio de WordPress y, posteriormente, del servidor."
    remediation: "Actualizar todos los plugins de WordPress."
    condition: none
    rules:
      - c:runuser -l $wp_user -c "wp plugin list --field=update --path=$wp_install_dir" -> r:available

  - id: 100008
    title: "Fortalecimiento de WordPress: Asegurar que no haya temas de WordPress desactualizados."
    description: "Esta política verifica que no haya temas de WordPress desactualizados en esta instalación de WordPress."
    rationale: "Los temas desactualizados pueden tener vulnerabilidades que actores maliciosos pueden explotar para tomar el control de un sitio de WordPress y, posteriormente, del servidor."
    remediation: "Actualizar todos los temas de WordPress."
    condition: none
    rules:
      - c:runuser -l $wp_user -c "wp theme list --field=update --path=$wp_install_dir" -> r:available

  - id: 100009
    title: "Fortalecimiento de WordPress: Asegurar que un plugin de seguridad esté instalado y activo."
    description: "Esta política verifica si el plugin de seguridad de WordPress especificado por la organización ($wp_security_plugin) está instalado."
    rationale: "Los plugins de seguridad pueden proporcionar una medida de protección contra exploits comunes dirigidos a sitios web de WordPress, como ataques de fuerza bruta e inyecciones SQL. La presencia de un plugin de seguridad reducirá significativamente la superficie de ataque."
    remediation: "Instalar y activar el plugin de seguridad $wp_security_plugin."
    condition: all
    rules:
      - c:runuser -l $wp_user -c "wp plugin is-active $wp_security_plugin --path=$wp_install_dir; echo $?" -> r:0

  - id: 100010
    title: "Fortalecimiento de WordPress: Asegurar que el archivo wp-config.php no sea accesible públicamente."
    description: "Esta política verifica si el archivo wp-config.php es accesible desde el navegador."
    rationale: "El archivo wp-config.php contiene credenciales y configuraciones críticas. Si es accesible públicamente, un atacante podría extraer información sensible."
    remediation: "Asegurar que el servidor web bloquea el acceso a wp-config.php mediante reglas en .htaccess o configuración de Nginx."
    condition: all
    rules:
      - c:curl -I $wp_host/wp-config.php -> r:403|404

  - id: 100011
    title: "Verificar si xmlrpc.php está accesible desde la web."
    description: "Si xmlrpc.php responde a solicitudes HTTP, podría ser un riesgo de seguridad."
    rationale: "Si este archivo no es necesario, es recomendable bloquear el acceso desde el servidor web."
    remediation: "Bloquear el acceso a xmlrpc.php en el servidor web configurando las reglas adecuadas en .htaccess o nginx."
    condition: all
    rules:
      - c:curl -s -o /dev/null -w "%{http_code}" $wp_host/xmlrpc.php -> r:^(200|403)$
  - id: 100012
    title: "Verificar si la API REST de WordPress expone usuarios."
    description: "Si el endpoint /wp-json/wp/v2/users devuelve datos en JSON y no un error de acceso, los nombres de usuario pueden ser extraídos."
    rationale: "Exponer usuarios a través de la API REST facilita ataques de fuerza bruta y enumeración de cuentas."
    remediation: "Restringir el acceso al endpoint o deshabilitar la API REST si no es necesaria."
    condition: all
    rules:
      - c:curl -s $wp_host/wp-json/wp/v2/users | grep -E '"id":| "name":' -> r:.* 

Paso 2: Configurar el Agente de Wazuh

  1. Instala el agente de Wazuh en tu servidor:
wget <https://packages.wazuh.com/4.x/apt/pool/main/w/wazuh-agent/wazuh-agent_4.9.2-1_amd64.deb>
sudo dpkg -i wazuh-agent_4.9.2-1_amd64.deb
sudo apt --fix-broken install

Edita la configuración del agente:

sudo nano /var/ossec/etc/ossec.conf

image (1).png

Agrega la siguiente configuración para habilitar SCA:

<policies>
    <policy>/home/local_sca_policies/custom_wordpress_policy.yml</policy>
</policies>

image (2).png

Reinicia el agente de Wazuh:

/var/ossec/bin/wazuh-control restart

image (3).png

Verificación de Resultados

Accede a la interfaz de Wazuh.

Navega a Security Configuration Assessment.

image (4).png

Verifica los resultados de la evaluación de seguridad para tu instalación de WordPress.

image (5).png

Sigue las recomendaciones proporcionadas por Wazuh para corregir las vulnerabilidades identificadas

image (6).png