Ataques de fuerza bruta

A diferencia de los hacks que se centran en las vulnerabilidades del software, un Ataque de fuerza bruta tiene como objetivo ser el método más simple para obtener acceso a un sitio: prueba los nombres de usuario y las contraseñas, una y otra vez, hasta que ingresa. A menudo se lo considera “poco elegante”, pueden tener mucho éxito cuando la gente usa contraseñas como “123456” y nombres de usuario como “admin”.

En resumen, son un ataque al eslabón más débil de la seguridad de cualquier sitio web … tú.

Debido a la naturaleza de estos ataques, puedes encontrar que la memoria de tu servidor se dispara, causando problemas de rendimiento. Esto se debe a que la cantidad de solicitudes http (es decir, la cantidad de veces que alguien visita tu sitio) es tan alta que los servidores se quedan sin memoria.

Este tipo de ataque no es endémico de WordPress, sucede con todas las aplicaciones web que existen, pero WordPress es popular y, por lo tanto, un objetivo frecuente.

Protégete a ti mismo

Un punto de ataque común en WordPress es martillar el archivo wp-login.php una y otra vez hasta que ingresan o el servidor muere. Puedes hacer algunas cosas para protegerte.

Ir arriba ↑

No uses el nombre de usuario “admin” o “administrador”

La mayoría de los ataques asumen que las personas están usando el nombre de usuario “admin” o “administrador” debido al hecho de que las primeras versiones de WordPress lo tenían como predeterminado. Si todavía estás usando este nombre de usuario, crea una nueva cuenta, transfiere todas las entradas y páginas a esa cuenta y cambia “admin” a un suscriptor (o elimínalo por completo).

También puedes utilizar el plugin Change Username para cambiar tu nombre de usuario.

Ir arriba ↑

Buenas contraseñas

El objetivo de tu contraseña es hacer que sea difícil de adivinar para otras personas y difícil que un ataque de fuerza bruta tenga éxito. Hay muchos generadores de contraseñas automáticos disponibles que se pueden utilizar para crear contraseñas seguras.

WordPress también cuenta con un medidor de seguridad de la contraseña que se muestra al cambiar tu contraseña en WordPress. Usa esto cuando cambies tu contraseña para asegurarte de que su fuerza sea adecuada.

Puede utilizar el plugin Force Strong Password para obligar a los usuarios a establecer contraseñas seguras.

Cosas que debes evitar al elegir una contraseña:

  • Cualquier permutación de tu propio nombre real, nombre de usuario, nombre de la empresa o nombre de tu sitio web.
  • Una palabra de un diccionario, en cualquier idioma.
  • Una contraseña corta.
  • Cualquier contraseña solo numérica o alfabética (una combinación de ambas es lo mejor).

Una contraseña segura es necesaria no solo para proteger el contenido de tu blog. Un pirata informático que obtenga acceso a tu cuenta de administrador puede instalar scripts maliciosos que potencialmente pueden comprometer todo tu servidor.

Para aumentar aún más la seguridad de tu contraseña, puedes habilitar la autenticación en dos pasos para proteger aún más tu blog.

Ir arriba ↑

Plugins

Hay muchos plugins disponibles para limitar el número de intentos de inicio de sesión realizados en tu sitio. Alternativamente, también hay muchos plugins que puedes usar para impedir que las personas accedan a wp-admin por completo.

Ir arriba ↑

Protege tu servidor

Si decides bloquear wp-login.php o wp-admin, es posible que obtengas un error 404 o 401 al acceder a esas páginas. Para evitar eso, deberás agregar lo siguiente a tu archivo .htaccess.

ErrorDocument 401 default

Puedes tener el punto 401 para 401.html, pero el punto es apuntarlo no a WordPress.

Para Nginx, puedes usar la directiva error_page pero debes proporcionar una URL absoluta.

error_page  401  http://example.com/forbidden.html;

En los servidores web IIS, puedes usar el elemento httpErrors en tu web.config, configura errorMode="custom":

<httpErrors errorMode="Custom">
<error statusCode="401"
subStatusCode="2"
prefixLanguageFilePath=""
path="401.htm"
responseMode="File" />
</httpErrors>

Ir arriba ↑

Proteger con contraseña wp-login.php

La protección con contraseña de tu archivo wp-login.php (y carpeta wp-admin) puede agregar una capa adicional a tu servidor. Debido a que la protección con contraseña de wp-admin puede romper cualquier plugin que use ajax en la interfaz, generalmente es suficiente proteger wp-login.php.

Para hacer esto, necesitarás crear un archivo .htpasswd. Muchos hosts tienen herramientas para hacer esto por ti, pero si tienes que hacerlo manualmente, puedes usar este generador htpasswd. Al igual que tu archivo .htaccess (que es un archivo que es solo una extensión), .htpasswd tampoco tendrá prefijo.

Puedes colocar este archivo fuera de tu carpeta web pública (es decir, no en /public_html/ o /domain.com/, dependiendo de tu host), o puedes colocarlo en la misma carpeta, pero querrás hacer algo trabajo de seguridad adicional en tu archivo .htaccess si lo hace.

Hablando de eso, una vez que hayas subido el archivo .htpasswd, debes indicarle a .htaccess dónde está. Asumiendo que has puesto .htpasswd en el directorio de inicio de tu usuario y tu nombre de usuario htpasswd es mysecretuser, entonces pon esto en tu .htaccess:

# Stop Apache from serving .ht* files
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
# Protect wp-login.php
<Files wp-login.php>
AuthUserFile ~/.htpasswd
AuthName "Private access"
AuthType Basic
require user mysecretuser
</Files>

La ubicación real de AuthUserFile depende de tu servidor, y el “usuario requerido” cambiará según el nombre de usuario que elijas.

Si estás utilizando Nginx, puedes proteger con contraseña su archivo wp-login.php usando HttpAuthBasicModule. Este bloque debe estar dentro de tu bloque de servidor.

location /wp-login.php {
auth_basic "Administrator Login";
auth_basic_user_file .htpasswd;
}

La ruta del nombre del archivo es relativa al directorio del archivo de configuración nginx nginx.conf

El archivo debe tener el siguiente formato:

  user:pass
user2:pass2
user3:pass3

Desafortunadamente, no hay una manera fácil de configurar un wp-login.php protegido con contraseña en Windows Server IIS. Si usas un procesador .htaccess como Helicon Ape, puedes usar el ejemplo de .htaccess mencionado anteriormente. De lo contrario, tendrás que pedirle a tu hosting que configure la autenticación básica.

Todas las contraseñas deben estar codificadas por la función crypt(3). Puedes utilizar un generador htpasswd en línea para cifrar tu contraseña.

Ir arriba ↑

Limitar el acceso a wp-login.php por IP

Si tú eres la única persona que necesita iniciar sesión en el área de administración y tienes una dirección IP fija, puedes negar el acceso a wp-login.php (y por lo tanto a la carpeta wp-admin/) a todos menos a ti a través de un .htaccess o archivo web.config. Esto a menudo se denomina lista blanca de IP.

Nota: Ten en cuenta que tu ISP o computadora puede estar cambiando tu dirección IP con frecuencia, esto se denomina direccionamiento IP dinámico, en lugar de direccionamiento IP fijo. Esto podría usarse por una variedad de razones, como ahorrar dinero. Si sospechas que este es el caso, averigüa cómo cambiar la configuración de tu computadora o comunícate con tu ISP para obtener una dirección fija a fin de utilizar este procedimiento.

En todos los ejemplos, debes reemplazar 203.0.113.15 con tu dirección IP. Tu proveedor de Internet puede ayudarlo a establecer tu dirección IP. O puedes utilizar un servicio en línea como What Is My IP.

También se proporcionan ejemplos de varias direcciones IP. Son ideales si usas más de un proveedor de Internet, si tienes un grupo pequeño de direcciones IP o cuando tienes un par de personas a las que se les permite acceder al Panel de control de tu sitio.

Crea un archivo en un editor de texto sin formato llamado .htaccess y agrega:

# Block access to wp-login.php.
<Files wp-login.php>
order deny,allow
allow from 203.0.113.15
deny from all
</Files>

Puedes agregar más de una dirección IP permitida usando:

# Block access to wp-login.php.
<Files wp-login.php>
order deny,allow
allow from 203.0.113.15
allow from 203.0.113.16
allow from 203.0.113.17
deny from all
</Files>

¿Está utilizando Apache 2.4 y el módulo de Apache mod_authz_host? Entonces tienes que usar una sintaxis ligeramente diferente:

# Block access to wp-login.php.
<Files wp-login.php>
Require ip 203.0.113.15
</Files>

Si deseas agregar más de una dirección IP, puedes usar:

# Block access to wp-login.php.
<Files wp-login.php>
Require ip 203.0.113.15 203.0.113.16 203.0.113.17
# or for the entire network:
# Require ip 203.0.113.0/255.255.255.0
</Files>

Para Nginx, puedes agregar un bloque de ubicación dentro de tu bloque de servidor que funcione igual que el ejemplo de Apache anterior.

error_page  403  http://example.com/forbidden.html;
location /wp-login.php {
  allow   203.0.113.15
  # or for the entire network:
  # allow   203.0.113.0/24;
  deny    all;
}

Ten en cuenta que el orden de deny/allow es de suma importancia. Es posible que tengas la tentación de pensar que puede cambiar el orden de las directivas de acceso y todo funcionará. De hecho, no es así. Cambiar el orden en el ejemplo anterior tiene como resultado denegar el acceso a todas las direcciones.

Nuevamente, en los servidores web IIS puedes usar un archivo web.config para limitar las direcciones IP que tienen acceso. Es mejor agregar esto en una directiva <location  adicional.

<location path="wp-admin">
<system.webServer>
<security>
<ipSecurity allowUnlisted="false"> <!-- this rule denies all IP addresses, except the ones mentioned below -->
<!-- 203.0.113.x is a special test range for IP addresses -->
<!-- replace them with your own -->
<add ipAddress="203.0.113.15" allowed="true" />
<add ipAddress="203.0.113.16" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
</location>

Ir arriba ↑

Denegar el acceso a solicitudes sin referencias

Extendido de Combatir comentarios no deseados, puedes usar esto para evitar que cualquier persona que no envíe el formulario de inicio de sesión acceda a él:

# Stop spam attack logins and comments
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .(wp-comments-post|wp-login)\.php*
RewriteCond %{HTTP_REFERER} !.*example.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) http://%{REMOTE_ADDR}/$1 [R=301,L]
</ifModule>

Nginx – Denegar el acceso a solicitudes sin referencias

location ~* (wp-comments-posts|wp-login)\.php$ {
      if ($http_referer !~ ^(http://example.com) ) {
           return 405;
      }
}

Windows Server IIS: denegar el acceso a solicitudes sin referencias:

<rule name="block_comments_without_referer" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{URL}" pattern="^/(wp-comments-post|wp-login)\.php" negate="false"/>
<add input="{HTTP_REFERER}" pattern=".*example\.com.*" negate="true" />
<add input="{HTTP_METHOD}" pattern="POST" /> </conditions>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="No comments without referrer!" />
</rule>

Cambia example.com a tu dominio. Si utilizas Multisitio con dominios asignados, querrás cambiar example.com a (example.com|example.net|example4.com) y así sucesivamente. Si estás utilizando comentarios de Jetpack, no olvides agregar jetpack.wordpress.com como referente: (example.com|jetpack\.wordpress\com)

Ir arriba ↑

ModSecurity

Si usas ModSecurity, puedes seguir los consejos de Frameloss – Detener los inicios de sesión por fuerza bruta contra WordPress. Esto requiere acceso de nivel raíz a tu servidor y puedes necesitar la ayuda de tu servidor web.

Si estás utilizando ModSecurity 2.7.3, puedes agregar las reglas en tu archivo .htaccess en su lugar.

Ir arriba ↑

Fail2Ban

Fail2ban es un daemon de Python que se ejecuta en segundo plano. Comprueba los archivos de registro que genera Apache (o SSH, por ejemplo) y, en determinados eventos, puede agregar una regla de firewall. Utiliza un filtro con una expresión regular. Si esa expresión regular ocurre, por ejemplo, 5 veces en 5 minutos, puede bloquear esa dirección IP durante 60 minutos (o cualquier otro conjunto de números).

La instalación y configuración de Fail2ban requiere acceso de root.

Ir arriba ↑

Listas de bloqueo

Parece que la mayoría de los ataques de fuerza bruta son de anfitriones de Rusia, Kazajstán y Ucrania. Puedes optar por bloquear las direcciones IP que se originan en estos países. Hay listas de bloqueo disponibles en Internet que pueden descargar. Con algunas secuencias de comandos de shell, puede cargar reglas de bloques con iptables.

Debes tener en cuenta que estás bloqueando tanto a los usuarios legítimos como a los atacantes. Asegúrate de poder apoyar y explicar esa decisión a tus clientes.

Además de las listas de bloqueo por país, hay listas con direcciones IP de spammers conocidos. También puedes usarlos para bloquearlos con iptables. Es bueno actualizar estas listas con regularidad.

La configuración de listas de bloqueo e iptables requiere acceso de root.

Ir arriba ↑

Servicios en la nube/proxy

Servicios como CloudFlare y Sucuri CloudProxy también pueden ayudar a mitigar estos ataques al bloquear las direcciones IP antes de que lleguen a tu servidor.

Ir arriba ↑

Ver también