Analytics

jueves, 14 de junio de 2018

Cómo proteger Wordpress (3/3): Seguridad por ocultación

Seguridad por ocultación en Wordpress
¿Cómo saber si un plugin está instalado en una web Wordpress?
Wordpress instala los plugins en el directorio web wp-content/plugins/
Una estructura habitual de encontrarnos por tanto en nuestro servidor web es:

/var/www/html/wordpress/wp-content/plugins/plugin_name_1
/var/www/html/wordpress/wp-content/plugins/plugin_name_2
/var/www/html/wordpress/wp-content/plugins/plugin_name_3

Y en el código html de la página se traducirá en:

http://www.dominio.com/wp-content/plugins/plugin_name_1
http://www.dominio.com/wp-content/plugins/plugin_name_2
http://www.dominio.com/wp-content/plugins/plugin_name_3

Una manera de identificar los plugins que tiene instalados una web hecha en Wordpress es revisar el código HTML de la web, en búsqueda de la cadena wp-content/plugins.

De esta manera podríamos ver sólo algunos plugins, digamos los que están en ejecución en ese momento. Pero podemos ver todos los instalados de otra manera. Esto es, podemos hacer peticiones, por diccionario, a dichas urls:

http://www.dominio.com/wp-content/plugins/*

Un diccionario de plugins para tomar como ejemplo sería éste.
Por ejemplo, si hacemos una petición como la siguiente:

curl -I http://www.dominio.com/wp-content/plugins/plugin_name 

y esta petición nos devolviera un 200 (OK) como retorno HTTP, tendríamos la confirmación de que dicho plugin está instalado. Si por el contrario recibiéramos un 404 (Not Found) tendríamos descartada su presencia.

¿Cómo saber la versión el plugin instalado?
Por consenso y estandarización, todos los desarrolladores de plugins han de incluir el fichero readme.txt. En dicho fichero se hace una descripción del plugin: su desarrollador, la versión, una descripción del mismo, o instrucción de instalación entre otras.

Si lanzamos una petición a dicho fichero:
http://www.dominio.com/wp-content/plugins/plugin_name/readme.txt

Podremos consultar en concreto la versión del plugin y, por extensión, las vulnerabilidades conocidas de dicha versión del plugin.

Este escenario conlleva un riesgo directo a la seguridad de cualquier website Wordpress puesto que anuncia públicamente sus componentes y versiones, y facilita enormemente el trabajo a un atacante.

¿Cómo ocultar los plugins de Wordpress instalados?
En el primer capítulo veíamos cómo denegar el acceso a ficheros sensibles mediante .htaccess.
Sin embargo no podríamos evitar la enumeración de plugins.

Aquí entra en escena el concepto de seguridad por ocultación. Lo que vamos a hacer es ponérselo un poquito más difícil a un posible atacante.

Sabemos que ante peticiones del tipo

curl -I http://www.dominio.com/wp-content/plugins/plugin_name

si el plugin plugin_name está instalado devolverá un http return code 200, y si no lo está será un 404. Asumiendo que no podremos evitar el 200, intentaremos evitar el 404. O dicho de otra manera, vamos a devolver siempre (sea cual sea el plugin consultado) un 200 para que el atacante reciba que tenemos tal cantidad de plugins instalados que no pueda discernir con sencillez cuáles son ciertos y cuáles no.

Para ello sólo bastaría crear una estructura de carpetas sobre

/var/www/html/wordpress/wp-content/plugins/

con los nombres de los plugins de nuestro diccionario. Ni más ni menos que 70.000 plugins pueden confundir lo suficiente a nuestro atacante. Cuando empiece el ataque probando nombres de plugins siempre recibirá un 200 suplantando la existencia real y no podrá saber por este método cuáles son ciertos y cuáles falsos.

¿Cómo ocultar la versión de los plugins realmente instalados?
Al tener bloqueada la respuesta a ficheros readme.txt en el fichero .htaccess como vimos en el capítulo 1, tampoco podrá saber sus versiones, ni de los falsos ni de los verdaderos.

¿Cómo saber si una plantilla está instalada en una web Wordpress?
Wordpress instala las plantillas en el directorio web wp-content/themes/

Saber la versión de la plantilla instalada es muy sencillo. Revisando el código HTML de una web Wordpress fácilmente encontraremos la ruta que delata el nombre de la plantilla en uso:

http://www.dominio.com/wp-content/themes/theme_name_1

¿Cómo evitar la ruta de instalación wp-content/themes/ para evitar la identificación de la plantilla?
Se puede hacer, requiriendo por parte del usuario un conocimiento alto acerca de Wordpress ya que requeriría modificar el código del CMS. Sin embargo existe un riesgo adicional. Muchos desarrolladores de plantillas y plugins utilizan enlaces mencionando explícitamente la carpeta wp-content en sus códigos, y en caso de instalarlos encontraríamos enlaces rotos puesto que nuestra ruta ya cambió de nombre, con lo que no funcionarían. En realidad la tarea de administración se puede complicar considerablemente. Es por ello que esta medida de seguridad requiere ser sopesada seriamente ya que puede no compensar lo suficiente.

¿Cómo saber la versión de la plantilla instalada?
Siguiendo el ejemplo anterior, una petición a:

http://www.dominio.com/wp-content/themes/theme_name/readme.txt 

nos devolverá el fichero del desarrollador donde se revela la versión de la plantilla.

Como vimos en el primer capítulo, mediante el bloqueo configurado en .htaccess del fichero readme.txt, el atacante no podrá acceder a dicho fichero y por tanto consultar la versión.

Aquí ponemos fin a esta serie de tres artículos:
  • En el primero vimos una serie de recomendaciones generales a alto nivel.
  • En el segundo entramos en algunas configuraciones más técnicas limitando el acceso a algunos recursos críticos.
  • En éste hemos aplicado el concepto de seguridad por ocultación en una instalación de Wordpress.
Conclusiones
Wordpress no es un gestor de contenidos más inseguro que otros. Quizás su principal virtud es a la vez su gran debilidad. Wordpress tiene una gran comunidad de desarrolladores generando contenido (plantillas y plugins), lo cual convierte su comunidad en una fuente muy rica y variada en componentes.

Sin embargo esto también supone su principal vulnerabilidad, ya que es frecuente encontrar plantillas y sobre todo plugins desarrollados con fallos graves de seguridad. Por tanto deberemos tener especial cuidado a la hora de integrar componentes nuevos en nuestra web.

Esperamos haber ayudado a mejorar la seguridad de las aplicaciones web de nuestros lectores. Sabemos que no existe la protección total, pero estamos convencidos de que las recomendaciones recopiladas en esta serie de artículos, constituyen un salto cualitativo en la seguridad de cualquier website hecho Wordpress.

Esperamos que sean de su agrado.



Autor: Gonzalo Sánchez Delgado
Dpto. Auditoría