Mostrando entradas con la etiqueta plugins seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta plugins seguridad. Mostrar todas las entradas

02 julio 2013

Cazando bugs: plugin NextGen Gallery (CVE-2013-3684)

Esta es la historia de la caza de un bug. Revisando los cientos de casos de phishing que asolan la seguridad de los Internautas encontré que el 90% de los sitios reportados usaban CMS populares, repartiéndose a partes iguales Wordpress y Joomla! las tareas de albergar las copias fraudulentas de las entidades afectadas. Generalmente los 'malos' buscan sitios con estos CMS para explotarlos y meter su código. Esto no significa que Wordpress o Joomla! sean vulnerables; en la mayor parte de los casos son los administradores los que convierten un buen software en una puerta trasera para los phishers y botnets.

En algunos casos terminan sacando las cuentas de los administradores probando pequeños diccionarios (os sorprenderían los usuarios admin con contraseña admin que hay por ahí), o obteniendo las contraseñas con algunos de los cientos de troyanos que siguen activos. Pero el mayor vector de ataque son los plugins y temas desactualizados que se van dejando por ahí.

Durante mis investigaciones me encuentro con bugs conocidos y públicos  como el infame timthumb que 2 años después de su publicación sigue causando estragos, pero otras veces me encontraba con sitios comprometidos que aparentemente estaba correctamente actualizados.

Tras mirar decenas de casos empecé a encontrar patrones (seguro que solo estaban en mi cabeza) y ver que muchas de las instalaciones de Wordpress tenían plugins en común. Uno de ellos era NextGen Gallery, con mas de 7 millones de descargas. Un buen sitio donde empezar a mirar. Así que descargué la última version (1.9.12 en aquel momento) desde la página de Wordpress, donde todavía podréis encontrar versiones antiguas.

Imaginaba que el fallo no podría ser muy complicado; necesitaba algo que permitiera ejecución de código PHP remoto o subida de ficheros. Así que la primero que podría hacer era buscar algo que permitiera la subida de ficheros y saltarme las restricciones que tuviera. Un simple find me daría la primera pista:

Ignoremos los .js de momento, no busco explotar un XSS o similar en el navegador. Pero vamos a echar un vistazo a ese admin/upload.php. Cuando miro estos scripts voy buscando el código que me interesa y los leo en diagonal para intentar no perder tiempo leyendo miles de lineas que no aportan nada a mi objetivo. Si es necesario, los vuelvo a mirar cuando necesito saber más del código, así que eliminaré las partes que, de momento, no me interesan y lo marcaré con [... snip ...]:

El comentario es de la cabecera es prometedor. Un pequeño fichero donde comprueba que existe una cookie de validación (según el comentario swfupload puede eliminarla) y la sesión (volveremos a esto más tarde) y una llamada nggAdmin::swfupload_image(), pero nada de código que permita subir. Lo que si me llama la atención es que este script no es una librería ni una clase, su codigo se ejecuta cuando se invoca. También veo que necesita que la constante NGGALLERY_ABSPATH este fijada, por lo que no parece que se pueda invocar directamente, parece que en algún lugar se hace un include del fichero. Y vemos también que lee el parámetro galleryselect del POST.

Pero antes, hay que asegurarse si este script realiza la función que dice y me pongo a revisar nggAdmin::swfupload_image(). Debería estar en admin/functions.php ya que es el único include que hay:


Vemos que trata con la variable superglobal $_FILES y que ejecuta la función move_uploaded_file(). $_FILES guarda los ficheros enviados en un POST con Content-Type multipart/form-data que se usa cuando existe un elemento input del tipo file. Cuando PHP recibe esta petición descarga el fichero en una ubicación temporal y rellena $_FILES. Usando la función move_uploaded_file() trasladamos ese fichero a la ubicación que deseemos. Así que efectivamente admin/upload.php hace lo que dice. Vemos que el parámetro galleryselect le llega a esta función como $galleryID y que tiene que ser un numero entero.

 Para obtener este id válido es fácil si navegamos por las galerías del sitio y observamos los links del código HTML:


En el id del primer div podemos ver que el ID de la galería es el 1 y el post el 68. Y en la etiqueta <a href> de la imagen vemos que la galería se llama test. Así que ya tenemos un id de galería que pasarle a galleryselect y la ruta donde va a quedar el fichero que subamos (wp-content/gallery/test)
Pero todavía nos enfrentamos a 2 restricciones. La primera es saltarse la validación de sesión, la segunda es como invocar admin/upload.php con nuestros datos.

Saltarse la validación de sesión que debería ser lo más complicada se vuelve trivial e incluso divertida cuando volvemos a revisar el script:

Lo primero que hace es validar la cookie usando wp_validate_auth_cookie(). Se supone que esta función comprueba si el usuario esta autentificado o si la cookie a expirado, pero el autor del script, en caso de que la cookie este comprobada, la vuelve a comprobar. Vale, es extraño de por si, pero si os fijais bien, en caso de que la cookie no sea válida y wp_validate_auth_cookie() devuelva falso... ¡No hace nada! O lo que es lo mismo, deja continuar con la subida de ficheros. ¡Premio!

Ahora solo queda investigar como explotar esta vulnerabilidad. Haciendo un par de greps por upload.php nos damos cuenta de que el único sitio donde se llama a upload.php es en nggallery.php, el fichero principal del plugin:


El include del fichero vulnerable lo realiza en la función handle_upload_request() y esta es añadida a la acción init, que Wordpress ejecuta antes de procesar cada petición. La función handle_upload_request() comprueba si el parámetro nggupload existe. Si es así, se procede a ejecutar la subida de ficheros y salir limpiamente. Funciona con cualquier URL válida dentro de Wordpress: en un post, en el index, en /wp-admin, etc. donde se incluya en el GET el parametro nggupload. Debido al bug que hemos encontrado, no comprobará el usuario. Así que nuestro exploit esta listo para ser escrito:


A este bug se le asigno el CVE-2013-3684 y se reportó a los autores y en 2 semanas publicaron la versión 1.9.13 con una escueta frase en el Changelog indicando que la vulnerabilidad estaba solucionada:
Secured: Ensure that only logged in users can upload images

Pero como la vida es un camino duro y difícil  este no era el bug que estaba buscando. Dejo a las intrépidas mentes de los lectores revisar el código y descubrir que hace que este fallo no permita subir código ejecutable.

----------------------------------

Artículo cortesía por Marcos Agüero (wiredrat @ gmail.com)
Leer más...

21 mayo 2013

Better WP Security: Completo plugin de seguridad para Wordpress



A la hora de diseñar un sitio web o un blog, frameworks como Joomla, Drupal o Wordpress ayudan a tener un punto de partida o base, que permite añadir páginas, con diverso contenido y con la posibilidad que los usuarios interactúen dejando comentarios.

Sin embargo, cuando se trata de colgar una página web a Internet, cualquier medida de seguridad que se tome es poca. Son incontables las amenazas existentes, tanto de forma intencionada, como por bots automáticos que, incansablemente acechan la red, en busca de vulnerabilidades o malas configuraciones en direccionamiento público. 

En Security By Default ya hemos analizado, en vidas pasadas, diferentes formas de ayudar a proteger  Wordpress. Incluso, para evitar el acceso "de raíz" al panel de administración pusimos a vuestra disposición un módulo Apache para permitir, en modo "lista blanca", accesos desde direcciones IP dinámicas, listadas en un registro DynDNS, a URIs como la del panel de administración de Wordpress.

Sin embargo, buscando herramientas existentes que aporten seguridad a la instalación, dí con un plugin que me ha parecido de lo más completo y he querido compartir con vosotros.

Se trata de Better WP Security, un plugin que permite gestionar diferentes parámetros que mejoran la seguridad. La forma de visualizar y configurar cada parte es mediante pestañas, en el panel de administración de Wordpress, en una sección llamada Seguridad.

La primera de las pestañas es un Dashboard, un resumen donde podemos ver el estado actual de la seguridad de Wordpress, en base a una "auditoría" que nos muestra la herramienta, destacando cada uno de los puntos por colores, dependiendo de "lo bien o mal" que estén, así como la criticidad de los mismos. Además, si queremos modificar un punto en concreto, para arreglar el problema señalado, hay un acceso directo desde la misma línea.



En cada una de las pestañas, nos da un pequeño resumen de ayuda sobre los parámetros que podemos modificar desde la misma.

La pestaña User nos permite cambiar el nombre del usuario admin y el ID (que por defecto es el 1 para dicho usuario)



En la pestaña Away, podemos "cerrar con llave" el acceso a la pantalla de administración de una forma programada, es decir,... No queremos que se pueda acceder al panel, en determinado horario. Esto es útil en caso que tengamos claro que no tendremos que acceder para nada, pero puede derivar en un Auto-DoS si no podemos acceder al panel de administración y por una emergencia, se necesita 



La pestaña Ban, nos permite añadir direcciones IP o User-Agents que, directamente, no queremos permitir que accedan al framework Wordpress. Si no tenemos una lista de IPs actualizada con la que podamos alimentar manualmente una lista negra, se puede confiar automáticamente en la que provee Hackrepair.com, que se integra de forma automática con el plugin.




La ruta por defecto donde se almacena mucho contenido que se utilizará en el blog o sitio web, está tras el directorio /wp-content. Si, por una configuración relajada, Apache permitese el Directory Listing, se podría acceder directamente a todos los ficheros contenidos en él. Desde aquí se permite modificar el directorio, tanto a nivel de sistema de ficheros, como las referencias que haya desde cualquier parte de Wordpress.  





En la pestaña Backup, existe la posibilidad de ejecutar backups periódicos que se enviarán por correo a una cuenta especificada o que se almacenarán en la propia aplicación. Es algo recomendable disponer de backups para poder recurrir a ellos en caso de catástrofe.





Al igual que ocurría con el directorio wp_content, las tablas de base de datos que utiliza Wordpress, por defecto, empiezan por "wp_". Esto, en caso de descubrirse un SQL Injection para Wordpress, permitiría a un atacante, hacer operaciones sobre las tablas, o al menos tener un punto de entrada conocido. Por aquello de ponerlo más complicado, esta herramienta nos permite cambiar el prefijo por lo que nosotros queramos, diferente de "wp_"




Para la administración de Wordpress, se accede a /admin. En el post en el que liberamos el módulo mod_dynip, un lector preguntaba, en los comentarios, si existía forma de modificar el /admin por un valor arbitrario. Pues, por lo visto, Better WP Security, permite en la pestaña Hide, cambiar el valor de /login, /register y /admin.



La sección Detect permite identificar y correlar aquellas direcciones IP que escaneen el servidor web haciendo pruebas de diccionario o fuerza bruta, en base a los errores HTTP 404 Not Found, devueltos por el servidor. La herramienta nos permite definir umbrales de hits fallidos por unidad de tiempo. En base a esto el plugin añadirá en la lista negra a las direcciones IP atacantes durante un tiempo predefinido.
Asimismo, en esta misma pestaña podemos configurar la detección de modificaciones de la integridad de los ficheros Wordpress. Si algún fichero cambia, y no hemos añadido/modificado nada, y nos llega un coreo con modificaciones, puede que tengamos alguna visita en el servidor. En mi caso, no lo tengo habilitado, puesto que ya utilizo AFICK a nivel de servidor completo, por lo que me resulta redundante e innecesario hacerlo también a nivel Wordpress. 




Igual que hacíamos anteriormente a la hora de detectar ataques de enumeración de directorios o ficheros en base a monitorizar las respuestas HTTP 404 Not found, en la pestaña Login, podemos indicar los parámetros de configuración para detectar ataques de fuerza bruta/diccionario ante la autenticación de usuarios.  



Si permitimos acceso HTTPS y HTTP, a nivel de servidor, puede ser útil forzar el uso de SSL para los accesos, así como pantallas en las que haya que introducir credenciales. En la sección SSL, podemos forzar que esto así sea.




La sección Tweaks, permite habilitar otras medidas de seguridad que no encajan en otras pestañas. Por ejemplo, es muy típico identificar la versión de Wordpress utilizada por un servidor en base a recuperar el fichero readme.html, donde ésta viene mencionada. Este fichero se añade, cada vez que se hace una actualización de Wordpress, aunque lo hayas borrado de la instalación anterior. Para evitar que nos puedan pedir según qué tipo de ficheros, podemos habilitar el check correspondiente.

Tened cuidado si ya tomáis ciertas medidas sobre el propio Apache o si utilizáis algún plugin que haga labores de WAF, puesto que puede dar más de un problema habilitar el último check aquí.  


La pestaña Logs, nos permite ver un sumario de la actividad de detección/protección llevada a cabo por el módulo Better WP Security. Asimismo, podemos desbloquear direcciones IP que puedan ser falsos positivos por ejemplo.


En resumen, una herramienta imprescindible. Si administras un wordpress y quieres tener una mayor tranquilidad, incrementando la seguridad en diferentes aspectos, este es un buen plugin. Quizá me gustaría mencionar que la traducción al español no es completa o no es todo lo buena que debería, pero se entiende todo correctamente y como aplicación funciona bastante bien.
Leer más...

12 marzo 2010

Seguridad en Wordpress

Dentro del mundo blogger, una de las primeras cosas a tener en cuenta, después de la temática, es sobre qué tipo de gestor de contenidos estará funcionando el blog. Si se elige Wordpress como base, también tenemos varias opciones: utilizar Wordpress.org que nos proveerá de forma gratuita los servicios básicos para albergar nuestros contenidos (teniendo que pagar si queremos añadirle ciertos extras); o bajar Wordpress e instalarlo en un servidor web que ya tengamos (se recomienda Apache o Nginx).

Nada nuevo os voy a contar con que para mantener lo más segura posible una instalación de Wordpress es imprescindible contar con la última versión disponible y que la contraseña de administración ha de ser lo más compleja posible, con caracteres no alfanuméricos, aleatorios, etc....

Sin embargo, una de las riquezas de wordpress es el grado de personalización en forma de plugins desarrollados que existen, y entre ellos los hay también dedicados a la seguridad.

Entre otros podemos destacar:
  • WP Security Scan: Se crea una pestaña nueva llamada Security, desde la que nos aparece el resultado de un análisis de seguridad de caja blanca de diversos puntos a nivel de versionado, servidor, base de datos, usuarios (habilitar otro usuario administrador diferente al "Admin" por defecto), checks de seguridad por oscuridad (de versión, de prefijos de tablas), crear etc,...
  • Wordpress Exploit Scanner: Este plugin está más dedicado a saber si nuestra instalación ha sido o no comprometida, más que como recomendaciones o medidas preventivas. Si no tenemos la posibilidad de instalar en la máquina que alberga Wordpress sistemas de control de integridad de ficheros como AIDE o Afick, siempre podemos utilizar este plugin para analizar ciertos parámetros generales, ficheros, base de datos, permisos, etc,...
  • Wordpress Database Backup: Como administradores del blog debemos establecer una política de backups frecuentes, de manera que si el blog se ve comprometido, o una mala actualización provoca alguna catástrofe que nos haga necesitar restaurar un backup, tengamos esa posibilidad. Plugins como éste nos permiten generar backups bajo demanda o incluso programarlos con una determinada frecuencia y recibirlos en una cuenta de correo.
  • SI Captcha Antispam: A fin de evitar los molestos comentarios automatizados con Spam en los posts, y visto que la eficacia de Akismet (incluido de serie con Wordpress) no es gran cosa (genera un montón de falsos positivos) esta puede ser una buena opción.
Yo por mi parte, en el blog "El Sumidero", aparte de utilizar varios de los plugins que he comentado para analizar la seguridad del mismo, he implementado mecanismos de control de accesos para la administración de Wordpress dentro de la configuración del propio Apache, basados en la IP origen (Si quiero administrarlo o lo hago desde la red interna o vía VPN).

<Location /wordpress/wp-admin/>
Order deny,allow
Allow from 192.168.1.27
Deny from All
</Location>

En cuanto a las tareas de backup de base de datos, utilizo desde hace varios años una herramienta llamada mysqlblasy. Es un script hecho en Perl para hacer un backup de todas las bases de datos que queramos de un servidor MySQL.

Si además queremos auditar el estado de nuestro Wordpress como lo puede hacer cualquiera desde Internet, podemos utilizar una herramienta como Plecost, que además de hacer fingerprinting de la base de Wordpress que disponemos, reconoce los plugins y sus versiones y es capaz de mostrarnos vulnerabilidades con enlaces CVE incluidas en caso de encontrar algún plugin vulnerable. Un análisis con esta herramienta (que requiere la versión 2.4 de Python como mínimo para funcionar correctamente) puede ser la guinda del pastel para la securización de la instalación de Wordpress y sus plugins.
Leer más...