Nueva oleada de ataques contra Wordpress. ¿Qué hacer?

Grave aumento de ataques de fuerza bruta

Severidad, naturaleza y objetivos de estos ataques

Tienes un blog auto-alojado y usas la plataforma que te ofrece Wordpress.org.

Por poco que lleves con esto, te habrás dado cuenta de que, por desgracia, el asunto de la seguridad en WP es absolutamente primordial. Es un tema antipático. Te quita tiempo para publicar entradas. Te calienta la cabeza buscando aquí y allá. Todo el esfuerzo que llevas dedicando a tu blog puede desaparecer de un plumazo, porque resulta que Wordpress es una de las plataformas de 'blogging' más atacadas del planeta...

Hay varios tipos predominantes de ataques contra webs o blogs como el tuyo, la mayoría automatizados mediante 'botnets' o 'robotitos', piezas de código malicioso que pululan a sus anchas por la Red. Hay p.e. los denominados DDoS o 'ataques distribuidos de denegación de servicio' -busca en Internet si te interesa- que persiguen manipular tu sitio sin que te des cuenta para, posteriormente, lanzar ataques coordinados a terceras webs más importantes. Luego están los denominados ataques de 'fuerza bruta', es decir destinados a romper tu usuario/contraseña o penetrar directamente en tu base de datos.

Estos son los dos principales tipos de ataques hacia blogs que usan Wordpress. Bueno, al menos los que ahora mismo están 'jodiendo' más activamente. Y en verdad:

Estamos en medio de una nueva y muy aumentada oleada de estos tipos de ataques a blogs Wordpress. Hoy en día es un problema ALARMANTE.

Clásicamente los ataques a sitios web que usan gestores de contenidos como Wordpress o Drupal emplean varios métodos o 'vectores' de ataque: que si XSS, que si inyección SQL, que si robo de 'cookies', que si intercepción del protocolo de transferencia FTP/SSH, que si a través de otras webs infectadas en tu mismo servidor compartido, que si el protocolo XMLRPC, yoquesé... Y todo esto 'te suena a chino', claro. Normal.

La actual oleada de ataques tiene mucho que ver con el protocolo XMLRPC (Wordpress lo utiliza mediante el archivo xmlrpc.php, situado en la raíz de la instalación). Mañana puede basarse en otro método -aunque hay que decir que este protocolo era, es y parece que seguirá siendo vulnerable un buen tiempo, de modo que los malos hackers seguirán 'encontrándole las cosquillas'-.

Creo que previamente debes entender un par de cosas (o tres):

  • Wordpress recibe tantos ataques, porque es una de las plataformas gratuitas de blogueo -o CMS en inglés- más usadas en todas partes. En el fondo esto no habla del todo mal de WP. Aunque...
  • Me sumo a quienes opinan que, precisamente debido a esto, los desarrolladores de Wordpress deberían poner más empeño en el tema de la seguridad, que creo que es PRIORITARIO por las infinitas molestias con que se encuentra tarde o temprano el usuario.
  • Vivimos un impresionante auge de la actividad del cibercrimen organizado. Porque eso es lo que hay detrás: aparentemente chavales o 'teenagers' muy hábiles con la informática, aparentemente inteligencias talentosas, pero en realidad unos pobres desgraciados medio-psicópatas y desintegrados familiar y socialmente -algunos ya tienen 30 y pico años, cuidado-, pero en realidad... utilizados y manipulados por una gentuza superior a ellos, verdaderas mafias organizadas que buscan secuestrar el máximo de webs posible -igual que el máximo de ordenadores posible-. El objetivo primero de estas bandas ciber-criminales disfrazadas de 'New Age' y cuyos ataques parten en su mayor parte de países como Rúsia, Ucrania, China o Turquía, pero últimamente también de EEUU., Francia u Holanda es hacer dinero. ¿Cómo? Simplemente vendiendo todos los datos de las cuentas de servidores que recolectan y rompen. Miles de millones de € o de $. El objetivo último, sin embargo, suele ser el de poder lanzar ataques DDoS sin conocimiento del usuario hacia objetivos concretos y estratégicos cuando convenga. (Hay Estados o Gobiernos detrás de esto, que vienen ejerciendo un auténtico terrorismo de Estado, guardándose así un as bajo la manga ante la actual y brutal confrontación geopolítica mundial por los recursos naturales del planeta). Como sucede en la vida real, el ingenio de estos criminales va siempre varios pasos por delante de quienes se esfuerzan en protegerse de ellos.

Posiblemente has tomado ya algunas medidas para (intentar) prevenir estos ataques. Quizás el uso de algún 'plugin' que afirma proteger el 'login' o área de registro para entrar a la administración de tu blog. Quizás hasta te has atrevido a introducir algún código en tu archivo '.htaccess' -¡bien por esto último!-. Debes saber que:

ningún plugin te protegerá de la sofisticación usada en la actual oleada de ataques contra blogs Wordpress. NINGUNO en absoluto.

¿Cómo saber si tu sitio está siendo utilizado para lanzar ataques?

Existe una herramienta 'online', ofrecida por una reconocida web dedicada a la seguridad, que te dará una buena pista. Introduce la URL de tu blog y... a ver qué te dice. Naturalmente sólo informa de lo que capturan SUS registros, no lo detectará absolutamente todo.

Qué pasa con el protocolo XMLRPC en Wordpress

Se reportan vulnerabilidades graves de seguridad en el protocolo XMLRPC desde hace varios años. Otros sistemas de blogueo como Drupal también lo sufren. Desde la aparición de Wordpress al menos ha habido tres grandes oleadas de ataques aprovechando debilidades de este subsistema.

Desde WP se esfuerzan en 'blindar' esto y 'parchean' cada vez que hay un serio ataque. La penúltima revisión de WP, la 3.9.2, iba enfocada esencialmente a proteger de la penúltima y reciente oleada de ataques DDoS usando XMLRPC. Pero ¿por qué nunca consiguen protegerlo del todo? Como he dicho, porque los ciber-criminales van siempre un paso por delante, y... porque el protocolo XMLRPC por su naturaleza abre puertas al sistema Wordpress.

¿Qué hace exactamente XMLRPC?

Pues gobierna cosas como los 'pingbacks' y 'trackbacks'. Permiten que tus contenidos se den a conocer a terceros -lo que te interesa para atraer más visitantes-, o bien responder con un enlace 'eco' a quienes enlazan un artículo tuyo desde su web -no hacerlo se considera a menudo de mala educación-.

También es necesario para el buen funcionamiento de algunos 'plugins', aunque no demasiados -esencialmente aquellos que necesitan comunicarse con otros servidores: galerías de imágenes, redes sociales, 'podcasts', seguimiento para estadísticas, etc.-, p.e. para ciertas funciones de los 'plugins' Jetpack, WordPress Mobile App, BuddyPress, o LibSyn. 'Plugins' que, por tanto, pueden verse afectados si se desactiva este protocolo.

Y también sirve para la publicación remota de entradas o contenidos en tu blog desde otros dispositivos, p.e. desde tu smartphone o en general desde aplicaciones de terceros. Esta funcionalidad es de gran uso actualmente. Y claro, los criminales ven esto como una creciente debilidad y se aprovechan de ella.

Mi -última- experiencia personal:

Mi blog WP auto-alojado contiene algunas medidas de protección. No soy ningún experto informático, quizás por eso he perdido bastantes horas investigando acerca de la mejor y más comprensible manera de proteger mi web. Una de las que utilizo es el plugin Limit Login Attempts (desactualizado, pero todavía funcional). Otra es ocultar la ruta de acceso al 'logueo' de la administración del blog, lo que no es sencillo.

Han pasado meses enteros sin que 'Limit Login Attempts' notificase ningún intento de 'hackeo' a mi usuario/contraseña de WP, mientras mucha gente seguía quejándose de decenas, centenares o incluso miles de intentos diarios de ataques de fuerza bruta bloqueados por este 'plugin'.

Hasta hace unos días.

De repente 'Limit Login Attempts' empieza a informarme de unos cuantos intentos de 'hackeo' del 'login'. No muchos, unos 6 o 7 al día, todos suponiendo 'admin' como nombre de usuario y variaciones de contraseñas más o menos sencillas -lo que hace pensar que son ataques automatizados -llamados 'bots'- y basados en diccionarios preestablecidos- pero, la verdad, ponen MUY NERVIOSO. Investigo un poco y me doy cuenta de que, realmente, no han dado con la ruta modificada al 'login' de mi WP. No les hace falta. Resulta que existe un modo de 'ir probando' usuarios y contraseñas utilizando el dichoso protocolo XMLRPC que viene por defecto en la instalación de WP.

Anda que no...

¿Qué hacer?

Tienes dos opciones:
  1. Deshabilitar completamente el protocolo XMLRPC, valorando antes si puedes prescindir de él. Hasta que un día o año de estos, desde Wordpress, anuncien que lo han protegido completamente. O no se lo toman bastante en serio, o es de verdad muy complicado.
  2. Deshabilitarlo parcialmente, es decir sólo para la función concreta que utilizan actualmente los malos 'hackers'. Actualmente. Es decir que esta medida durará hasta que encuentren otro modo de atacarte, posiblemente otra debilidad distinta del mismo protocolo XMLRPC. Y esto puede ocurrir más pronto que tarde, me temo.
La gente que está 'hasta los coj...' de tanto ataque suele optar por la primera opción. Quienes necesitan mucho este protocolo, p.e. para publicar remotamente, o no quieren renunciar al uso de 'pingbacks' y 'trackbacks', optarán quizás por la segunda -el riesgo es que puede que en poco tiempo ya no dé suficiente protección-.

Vamos a por las soluciones concretas:

1.- Desactivar COMPLETAMENTE xmlrpc en WP.

Se trata de añadir el siguiente código:

add_filter('xmlrpc_enabled', '__return_false');

a un archivo de tu instalación WP. Generalmente se aconseja añadirlo al archivo functions.php del tema que estés usando: editas el archivo y pegas el código hacia el final del mismo, antes de la expresión '?>' si existiese. Aunque en vez de eso también puedes añadirlo al archivo wp-config.php situado en la raíz de la instalación de tu WP: lo editas y pegas el código justo antes de una de las últimas líneas, la que incluye la expresión 'ABSPATH'.

2.- Desactivar PARCIALMENTE xmlrpc en WP (esto anula el método malicioso usado en la ACTUAL oleada de ataques; pero CUIDADO: puede que no sirva para la próxima).

Se trata de aplicar el siguiente código:

add_filter('xmlrpc_methods', function($methods) {
  unset($methods['wp.getUsersBlogs']);
  return $methods;
 });

al archivo functions.php del tema que estés usando: edita este archivo e introduce el código hacia el final del mismo, antes de la expresión '?>' si existiese.

Otras medidas para proteger tu blog Wordpress

Dicen que 'cada maestrillo tiene su librillo'. Hay por ahí un montón de entradas acerca de 'cómo proteger tu blog Wordpress'. El 90% de ellas repiten exactamente lo mismo. Muy pocas se ocupan de contrastar de verdad lo que proponen. Aun así en general no son malos consejos, así que intenta aplicar los que puedas. MI ADVERTENCIA PERSONAL: no confies tanto en el uso de 'plugins' como en otro tipo de medidas; los más conocidos y aparentemente completos 'plugins' dedicados a la seguridad -tipo Wordfence y otros- no son aconsejables si estás en un alojamiento compartido, ya que suelen consumir muchos recursos de CPU y/o RAM del sistema. En general cuantos más 'plugins' uses más problemas vas a tener.

(Por cierto, un alojamiento compartido o 'shared server' en inglés, a menudo te ofrecerá ancho de banda de transferencia ilimitado, almacenamiento web ilimitado, mensajes de correo electrónico ilimitados o dominios ilimitados. Esto SIEMPRE es falso. Por definición un 'shared hosting' es siempre LIMITADO en todo lo que ofrece).

En esta web (en inglés) hallarás consejos acerca de algunos 'plugins' que deberías evitar instalar para que tu proveedor de alojamiento no te acabe suspendiendo la cuenta. En esta otra los usuarios informan también de 'plugins' de WP que quizás hay que evitar.

Bueno, pues ahí va una pequeña selección de mis sugerencias, bastante contrastadas pese a que no lo documente aquí para no hinchar esta entrada. Cada una cubre un rango concreto de vulnerabilidades:

0.- Lo pongo como punto 'cero', porque muchos consejos en varias webs lo omiten, y es algo absolutamente básico: mantén tu PC, o tu 'smartphone', o tu dispositivo externo -con el cual te conectas a tu sitio web, ya sea vía FTP, SFTP, SSH o interfaz web de administración- lo más limpios posible de virus, de troyanos, de vulnerabilidades, etc. Ten cuidado también con el 'Wi-Fi' en tu casa y con todo lo que se conecte a él: procura que su 'firewall' integrado sea efectivo y esté activado. Naturalmente, ten mucha precaución al publicar remotamente o conectarte directamente al servidor de tu sitio web desde redes 'Wi-Fi' de terceros o dispositivos que no controlas y cuyo grado de seguridad/privacidad desconoces, mejor evítalo si puedes.

1.- El ya mencionado plugin 'Limit Login Attempts'. Es el único que verdaderamente hace 'algo' eficiente, sin grandes defectos y sin sobrecargar el servidor. Lleva un par de años sin actualizarse, lo cual parece preocupante -da la impresión de que su autor, activo en el área de soporte, lo pondrá al día uno de estos días-, pero sigue funcionando bastante bien y lo usan webs de cierto renombre, lo cual es una garantía.

2.- El plugin 'Block Bad Queries' o BBQ, literalmente 'bloqueador de peticiones maliciosas'. No sé hasta qué punto es efectivo, pero proviene, entre otros, del creador de la web 'perishablepress', un tipo muy interesado en todo lo concerniente al archivo .htaccess, y observo que no hay demasiadas quejas de los usuarios de este 'plugin', lo cual es un punto a favor.

3.- Ya he sugerido que utilizo bastante el archivo .htaccess, una herramienta utilísima aun si estás en un alojamiento compartido o 'shared server' y tienes acceso a él -de lo contrario, te sugiero cambiar YA de alojamiento-. Puedes introducir en él algunas líneas de código, que pueden ayudar MUY eficazmente a proteger tu weblog. Están en Internet. Si sabes un poco de inglés (encontrarás mucha mejor info), aquí te doy pistas para aplicar algunas (busca como 'htaccess + lo que sea') (también puedes probar con 'wordpress + htaccess + lo que sea'). Aquí van unos cuantos 'lo que sea', aplica sólo los que logres entender mínimamente:

- Disable the server signature

- Deactivate browsing directory (muy importante, impide que puedan listar los contenidos de cualquier directorio de tu web)

- Protect htaccess and wp-config.php files (bastante importante también)

- Protect wp login from brute force login attacks based on server protocol (deniega el uso del protocolo HTTP 1.0, prescindible para ti pero bastante usado por una parte de los ataques)

- Denies any request using methods TRACE TRACK DELETE

- Deny Access to No Referer Requests (está en una página oficial del codex de WP)

- Protect comments login xmlrpc from bad bots using POST method (es una ampliación de la regla anterior, la cual excluye a los visitantes que esconden el Referer). En realidad consiste sólo en cambiar de esa regla la siguiente línea:

RewriteCond %{REQUEST_URI} .wp-comments-post\.php*

por esta otra:

RewriteCond %{REQUEST_URI} .(xmlrpc|wp-comments-post|wp-login)\.php*

(Tras hacer esto, comprueba si sigues pudiendo publicar remotamente desde tu smartphone o lo que sea; si no, deshaz el cambio)

- Denies POST requests by blank user agents

- Denies requests that dont contain a HTTP HOST Header

- Denies any POST request that doesnt have a Content-Length Header

- Denies any POST request with a content type other than application x-www-form-urlencoded multipart form-data

No es poca cosa... Requerirá un esfuercito de comprensión por tu parte, pero te aseguro que estas medidas aportan mucha protección.

4.- De todas las medidas de seguridad para proteger tu WP que encontrarás por ahí repetidamente en un montón de blogs, aconsejo básicamente las siguientes:

- Cambiar el usuario por defecto 'admin' a cualquier otro nombre. Es sencillo, entras a la administración de tu WP, menú 'usuarios', submenú 'añadir nuevo usuario', añades un nuevo usuario con nivel de administrador, le das un nombre distinto a 'admin' y algo difícil de suponer, guardas, vuelves al submenú  'todos los usuarios' y borras el anterior usuario 'admin'. (NOTA: si en 'usuarios' te aparecía más de uno aparte del 'admin' por defecto, con un nombre extraño, no has trasteado nunca con eso y eres el único administrador del blog, indica que posiblemente éste ha sido 'hackeado'. Deberás solucionar esto antes de aplicar nuevas medidas de protección).

IMPORTANTE 1: en 'Usuarios->Mi Perfil', comprueba que en el campo 'Mostrar nombre públicamente como' no conste el nombre de usuario usado para 'loguearte', sino otro bien distinto.

IMPORTANTE 2: averigua cómo cambiar el 'user_nicename' en tu base de datos: no debe coincidir con el nombre de usuario que utilizas para 'loguearte'. Pon una expresión cualquiera distinta a tu nombre de usuario, no necesita ser compleja, ni siquiera necesitarás recordarla. Wordpress tiene un defecto impresionante, y es la facilidad con que un 'hacker' puede obtener tu nombre de usuario -lo que significa que tendrá la mitad del trabajo hecho para romper el 'login'. Se trata de intentar evitarlo, aunque para evitarlo del todo, además, el tema que usas debe estar libre de cualquier línea de código que apunte al verdadero 'user' del login: vale la pena preguntarle directamente al desarrollador de ese tema.

- Cambiar de vez en cuando tu contraseña por otra realmente compleja, de más de 8 caracteres -idealmente de al menos 16-, diferente de la que usas para otros servicios o dispositivos y que, aparte de números y letras mayúsculas/minúsculas, incluya símbolos 'raros' como alguno de éstos:

_-/(#|\+;?!¿¡$&%='^@{}[]

Un consejo si deseas poder recordarla:

Puedes alterar o 'camuflar' una expresión/contraseña de un modo parecido a esto:

50fia_v1n0_a_c3nar

que puedes llegar a identificar como "Sofía vino a cenar", ¿verdad?. Es sólo un ejemplo, por favor no lo uses, crea el tuyo propio (en vez del subrayado bajo también puedes usar simplemente espacios). Entiende la dinámica: hay números que se asemejan a ciertas letras. Úsalos inteligentemente. Es simple ¿no?: pues te aseguro que hace a la contraseña bastante más difícil de romper.

Sin embargo, si decides hacer tu 'password' más complejo e irreconocible como expresión, esto comporta que ya no serás capaz de recordarlo de memoria. Es el pequeño precio a pagar por la seguridad de tu blog. Pero tranquilo/a, para eso están aplicaciones como KeePass o LastPass (aconsejo la primera) que harán por ti el trabajo de reconocer el formulario de ingreso e introducir automáticamente el usuario/contraseña. Vale la pena investigarlas.

- Cambiar la ubicación del archivo wp-config.php. Por defecto se halla en el directorio raíz o público (generalmente en /home/nombredeusuario/public_html o bien en /home/nombredeusuario/htdocs). Wordpress permite sacarlo de ahí y colocarlo un directorio 'antes' (generalmente será /home/nombredeusuario).

- Cambiar de vez en cuando las 'secret keys' incluidas en el mismo archivo wp-config.php, que en WP son ocho (AUTH_KEY, SECURE_AUTH_SALT y demás). En el mismo archivo 'wp-config.php' te dice cómo hacerlo.

- Cambiar el prefijo de la base de datos de tu blog WP, que por defecto viene como:

wp_

a cualquier otra expresión, del tipo:

e_U1q2-IO_

(No uses ésta del ejemplo; usa otros números y letras mayúsculas/minúsculas). No estoy seguro de qué caracteres 'raros' son aceptados a nivel de prefijo de la base de datos, por si acaso aconsejo usar sólo uno de estos dos símbolos: '-' o bien '_' (sin las comillas). Este último, sea como sea, además debe constar al final del prefijo. ¿Cómo aplicar este cambio? Internet es tu amigo...

5.- Mantén tu instalación Wordpress, tu tema y tus 'plugins' actualizados a sus últimas versiones. Sobra decir el por qué... O no: los 'malos hackers' están CONSTANTEMENTE escaneando webs como la tuya buscando versiones de WP/plugins/temas desactualizados -y por tanto desprotegidos- para 'hincarles el diente' con sus códigos de ataque.

6.- Ya he mencionado que en mi blog aplico la ocultación de la ruta de acceso al 'login' o formulario de ingreso al área de administración de mi blog. Eso implica que la url con el parámetro 'wp-login.php' queda modificada, pero cuidado, no sólo debería estarlo ésta, sino además otras con expresiones como 'wp-admin/...', 'action=register', 'action=rp&key=', 'loggedout=' y unas cuantas más, bien conocidas por los 'hackers' o 'crackers' maliciosos. Esto en teoría puede lograrse mediante un código algo complejo en el archivo .htaccess -el cual debe estar entonces muy bien protegido, idealmente fuera del directorio raíz público de tu sitio-, o bien mediante código PHP, como sería el caso de un 'plugin' (ver más abajo).

En teoría. Resulta que ocultar/ofuscar la ruta de acceso al formulario de 'login' de Wordpress está considerado por los -supuestos- expertos como un método 'parchoso', poco efectivo. En mi opinión son algo hipócritas. En realidad funciona bastante bien, cubriendo claro está un margen concreto de riesgo -recuerda que ningún método protege de todo-, y sospecho que es usado por un montón de webs de renombre, ya sea vía htaccess, ya sea vía 'plugin' de propia elaboración o adaptación.

Me dirás ahora: ¡Pásame igualmente el código de .htaccess o de PHP para ese ocultamiento del 'logueo' de WP! -y en verdad no lo encontrarás en Internet por más horas que le dediques, pero te aseguro que existe-.

Pues no.

¿Por qué? Pues porque:
  1. Mi código NO es perfecto. No está perfectamente elaborado ni debidamente contrastado. ¿Recuerdas?: no soy técnico informático.
  2. Ataques menos sofisticados puede que sigan bloqueados mediante este método. Pero la actual oleada de ataques deja en evidencia que es mejorable. Por esta responsable razón no me atrevo a compartirlo (quizás lo haría si te manejas bien con Apache y las reglas del archivo .htaccess, y además te acreditas debidamente via email, p.e. como administradorde@dominiocomprobable.loquesea).
  3. Como he mencionado, sé que algunas webs de renombre utilizan algún método elaborado de ofuscación de la url del 'login' de WP (es sencillo de comprobar: en alguna web que deduzcas que usa WP, apunta a dominio.com/wp-login.php a ver qué pasa...). Pero los muy cabr... no dicen nada acerca de cómo implementar esta medida, POR MIEDO A QUE los malos 'hackers' tomen nota de ello y 'contra-ataquen', y hablo por supuesto de blogs/webs dedicadas al tema de Wordpress, incluso algunas centradas en la seguridad. Hay un silencio y un cierto egoísmo en esto. Pero a la vez se entienden sus razones, si lo piensas bien.
  4. Yo también debo ser uno de esos 'cabr...' y debo sufrir ese mismo miedo. Qué le vamos a hacer, nadie es perfecto. Pero al menos me he tomado la molestia de ponerte sobre una pista creo que interesante.
  5. Vale, te paso una alternativa, que va mejorando bastante cada cierto tiempo. Se trata del plugin 'Rename wp-login.php' e intenta justo eso: ofuscar u ocultar la ruta a wp-login.php y derivados y, con ello, prevenir bastantes ataques de fuerza bruta a tu blog. Es EL ÚNICO plugin relativo a la ocultación del 'login' de WP que recibe un cierto esfuerzo continuado por parte de su autora, de modo que merece la pena aplicarlo o ir revisándolo de vez en cuando, a ver qué pasa con él y qué siguen opinando sus usuarios... Por supuesto no evita los ataques de la actual oleada basada en XMLRPC, pero menos da una piedra...

No hay comentarios:

Publicar un comentario

Resssopla aquí tu pregunta, tu respuesta, tu duda o tu fantasía...