domingo, diciembre 29, 2013

Proteger WordPress frente ataques de fuerza bruta

En mi trabajo estoy encargado de gestionar varios sistemas Wordpress con las distintas páginas web de la empresa en que trabajo, y allí vivo bajo la alerta de miles de ataques de fuerza bruta automatizados que últimamente está sufriendo la página de login de este sistema. Es por ello que decidí implantar, ya hace tiempo, el un plugin que limita los intentos de login y te envía un e-mail cada cierto número de bloqueos que se definen en la configuración.

En los ataques basados en fuerza bruta, los avisos que llegan son habitualmente intentos a usuarios por defecto de este tipo de sistemas, como admin, administrator o root... hasta que un día me encontré la desagradable sorpresa de que uno de los ataques ya había acertado con mi usuario válido. En ese momento decidí, por si alguno de ellos llegaba a tener suerte con mi contraseña, instalar el plugin de Latch para Wordpress y evitar problemas. Así, aunque alguien lograra dar con ella no podría entrar nunca en el sistema sin mi aprobación.

Figura 1: SDKs y Plugins de Latch. El plugin de WordPress es el primero.

Me puse a investigar cómo habían averiguado mi nombre de usuario y me sorprendió que no me hubiera fijado antes en esto. En aquel entonces no lo sabía, pero tras leer un poco ahora ya sé que es una debilidad conocida desde hace mucho tiempo, y que incluso muchos scanners automatizan la búsqueda de los usuarios de WordPress por defecto, como WPScan. Tras horas de búsquedas por la red no encontré información específica de cómo poder resolverlo, y parece que es algo que se asume por casi todo el mundo como una "feature".

Figura 2: Opciones de enumeración de usuarios en WordPress con WPScan 

El problema ya fue publicado por aquí hace tiempo en el artículo que se tituló "Regístrate en WordPress y evalúa su seguridad". Se trata de llamar por URL a la variable “author” y buscar el “id” manualmente comenzando por 1 y así sucesivamente para ver a qué nombre de usuario redirige y qué nombre de usuario aparece en el campo title de la página destino.

Figura 3: ?author=1 redirige a /author/admin

Cualquier usuario con privilegios de administrador normalmente estará entre los diez primeros, por lo que serán esos los que habrá que usar para hacer los ataques de fuerza bruta. El que puedan averiguar los nombres de los usuarios puede ser utilizado también para hacer ataques basados en contraseñas fijas y variaciones de usuarios, lo que me preocupaba bastante.

En primer lugar pensé que con cambiar el “alias” en la configuración de usuarios de WordPress - ya que el sistema asigna por defecto para el alias el mismo nombre del usuario del login dejándonos vendidos - bastaría para engañar a los malos que usen este tipo de scanners.

Figura 4: Alias cambiado a admin para ocultar el nombre de usuario administrador

Nada más lejos de la realidad. Después de poner un alias engañoso - lejos de este común "admin" - para el usuario válido administrator, comprobé que sí que se muestra en el title de la web el nuevo alias falso, pero no en la dirección URL, que sigue saliendo el usuario con el que se efectúa el proceso de login.

Figura 5: Cambiar el alias cambia el title pero no la URL

Después de mucho buscar y probar cosas como bloquear desde el fichero .htaccess, modificar código fuente del propio motor de WordPress, etcétera... Ninguna solución era efectiva y funcional, hasta que me di cuenta de que modificando un campo de la tabla “users” en la base de datos que utiliza el motor WordPress se solucionaba el problema. Antes de ponerme a intentar solucionar este problema ni me había fijado en que estaba ahí ypor supuesto no podría conocer para que se podía utilizar. Dicho campo es el “user_nicename”, es decir, el "nombre bonito" para un usuario.

Figura 6: Establecimiento de user_nicename a un userfalso

Con solo este cambio en la base de datos es posible solucionar la forma con la que nuestros WordPress muestran por defecto los nombres de usuarios. Si ahora hacemos la misma prueba, obtendremos que en el title aparece el alias, mientras que en la URL se puede ver en nicename del usuario.

Figura 7: Se ha conseguido ocultar el nombre de usuario en el title y en la URL

Tal vez existan otras soluciones, pero no me ha sido fácil encontrarla. Esta solución funciona perfectamente y me ha permitido que los últimos ataques de fuerza bruta no me afecten. Espero que  os sirva a todos los que no conocíais esta solución, y os evite unas horas trasteando como tuve que estar yo.

Si te sirve de algo mi experiencia, dedica tiempo a fortificar tu Linux, revisa los detalles de seguridad tu Apache, actualiza tu WordPress a la última versión y ponle pocos plugins que luego aparecen los bugs de XSS o CSRF a la mínima que te descuidas - protege también el listado de los plugins que tienes instalados -, pon un plugin que te alerte de los ataques de fuerza bruta  , activa Latch y pon un bonito nombre a tus usuarios de WordPress.

Saludos!
Autor: Oscar Mogarra Hita

15 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Buen trabajo Óscar. Tomando nota.

    Felices Fiestas.

    ResponderEliminar
  3. Muy interesante la entrada. Gracias por compartirla Oscar.

    Un saludo

    ResponderEliminar
  4. Buena info Oscar, gracias por compartirla.

    ResponderEliminar
  5. Muchas gracias por la información.muy muy útil.

    ResponderEliminar
  6. Muy útil, Óscar. Gracias por la aportación. Un saludo y felices fiestas

    (En mi comentario anterior no me fijé en el autor, disculpa)

    ResponderEliminar
  7. Interesante plugin.

    Pero si no usas comentarios o cosas muy dinamicas(solo publicación), pq no "httrack"iras o "wget"izas el wordpress?

    Arkanox

    salu2

    ResponderEliminar
  8. Enhorabuena por la publicación. El Latch de Eleven Path es una gran utilidad, que nos hará más fácil la vida, sin duda. No obstante, permíteme un pequeño apunte: para el caso concreto de Wordpress existe un plugin que permite utilizar un segundo factor de autenticación de un solo uso (OTP) que funciona de maravilla. En "Expertos en Sistemas" podéis consultar un artículo donde explico de forma muy básica cómo instalarlo: http://www.expertosensistemas.com/otp-one-time-password-contrasena-de-un-solo-uso/
    Gracias por el artículo.

    ResponderEliminar
  9. Muchas gracias a todos, y encantado de que os sea útil, saludos y felices fiestas!

    ResponderEliminar
  10. Oscar, hay un plugin de wordpress que se llama login lockdown y te permite limitar el número de inicios de sesión fallidos antes de bloquear la IP por un tiempo determinado.

    También puedes proteger el archivo wp-login.php y la carpeta /wp-admin/ por medio de un archivo .htaccess

    ResponderEliminar
  11. Oscar mogarra3/1/14 11:32 p. m.

    Santiago Bernal B, como ves al inicio del artículo precisamente comento lo de ese plugin o similares. La idea aquí era ocultar el nombre de usuario. Un saludo.

    ResponderEliminar
  12. Hola Oscar,

    Acabo de probarlo y al cambiar el nicename de la base de datos y luego volver a ejecutar el comando preguntando por el author:

    .../?author=1

    Directamente no me muestra ninguna web, me dice sitio no encontrado. Os ha pasado esto a alguien?

    Muchas gracias por todo,
    Un saludo,

    Oscar Padial

    ResponderEliminar
  13. Hola Oscar Padial. Pues nunca me he encontrado con ese problema que me comentas, y he cambiado bastantes wordpress con este sistema, quizá algo en la configuración del .htaccess?? Saludos.

    ResponderEliminar
  14. Gracias Oscar, al final era un tema de refrescar la caché por eso no se hacían efectivos los cambios. Ya funciona perfectamente, gracias de nuevo.

    ResponderEliminar
  15. El enlace del artículo plugin de Latch para Wordpress https://www.returngis.net/2013/12/integrar-wordpress-con-latch-de-eleven-paths/ se encuentra roto.

    ResponderEliminar