Saltar al contenido

Análisis de vulnerabilidades en WordPress

WPScan es un escaner black-box de vulnerabilidades sobre la plataforma de WordPress y puede ser utilizado para reconocer instalaciones WordPress para encontrar fallas de seguridad. Al usar WPScan, puedes escanear un sitio web de WordPress en busca de vulnerabilidades conocidas dentro de la versión principal, complementos y temas. También puedes averiguar si hay contraseñas débiles, usuarios y problemas de configuración de seguridad. La base de datos en wpvulndb.com se utiliza para buscar software vulnerable y el equipo de WPScan mantiene la lista cada vez mayor de vulnerabilidades.

Wpscan es una herramienta que viene instalada por defecto en Kali Linux. Por tanto, lo primero que haremos será iniciar nuestra máquina Kali.

El primer paso será actualizar el escaner de wordpress para que tenga actualizada la base de datos de las vulnerabilidades:

wpscan --update

Si queremos ver el manual que nos ofrece la ayuda lo haremos con:

wpscan -h

Desde la versión 3.7.0 de la herramienta WPScan, si deseas mostrar datos de vulnerabilidad, los usuarios deberán usar y configurar un token de API para recuperar los últimos datos de vulnerabilidad de la API de WPVulnDB.

Todas las demás funciones de la herramienta WPScan funcionarán normalmente si no usas o configuras un token de API WPVulnDB, pero cuando se detecta una versión de WordPress, una versión de complemento o una versión de tema, no obtendrás los datos de vulnerabilidad asociados, ya que proviene de la API WPVulnDB.

Funcionalidades como la enumeración de versiones de WordPress, la enumeración de complementos, la enumeración de temas, la enumeración de archivos de copia de seguridad, el forzamiento bruto de contraseña débil, la enumeración de Timthumb y todas las demás funcionalidades de WPScan CLI funcionarán normalmente, sin la necesidad de un token API.

El beneficio para los usuarios de utilizar la API WPVulnDB es que obtendrán los datos de vulnerabilidad inmediatamente después de que ingresemos a la base de datos. En este momento, con la implementación actual, los usuarios tienen que esperar hasta la mañana siguiente para usar los últimos datos de vulnerabilidad.

La API permitirá a los usuarios realizar 50 solicitudes diarias de forma gratuita.

Es por esto que resulta muy interesante que obtengamos una API desde la página oficial registrándonos de forma gratuita:

https://wpvulndb.com/api

Una vez que tengamos nuestra API, para mantener el token API en un archivo de configuración y no tener que suministrarlo a través de la CLI cada vez, crearemos un archivo yml dentro de la carpeta .wpscan:

~ / .wpscan / scan.yml

que contenga lo siguiente:

cli_options:

api_token: YOUR_API_TOKEN

A continuación, vamos a apuntar la aplicación WPScan a un sitio web de WordPress. Con unos pocos comandos, podemos revisar el sitio web en busca de temas, complementos y usuarios vulnerables.

Para encontrar sitios que trabajen con WordPress podemos utilizar Wappalyzer como vimos en este artículo:

Para escanear una URL usaremos:

wpscan -urlhttp://www.ejemplo.com

He ocultado el nombre de la página web auditada por motivos de seguridad. Esta información se publica sólo con fines educativos. Cualquier tipo de escaneo a un portal que no sea de nuestra propiedad o sin disponer de la autorización requerida para llevarlo a cabo es ilegal.

El resultado del escaneo es el siguiente:

[+] URL: http://xxxxxxxxxx.es/

[+] Started: Fri Jan 17 10:58:45 2020

Interesting Finding(s):

[+] http://xxxxxxxxxx .es/

| Interesting Entries:

| – Server: nginx

| – X-Powered-By: Loading

| Found By: Headers (Passive Detection)

| Confidence: 100%

[+] http://xxxxxxxxxx .es/robots.txt

| Interesting Entries:

| – /wp-admin/

| – /wp-admin/admin-ajax.php

| Found By: Robots Txt (Aggressive Detection)

| Confidence: 100%

[+] http://xxxxxxxxxx .es/xmlrpc.php

| Found By: Link Tag (Passive Detection)

| Confidence: 30%

| References:

| – http://codex.wordpress.org/XML-RPC_Pingback_API

| – https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner

| – https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos

| – https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login

| – https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access

[+] http://xxxxxxxxxx .es/readme.html

| Found By: Direct Access (Aggressive Detection)

| Confidence: 100%

[+] http://xxxxxxxxxx .es/wp-cron.php

| Found By: Direct Access (Aggressive Detection)

| Confidence: 60%

| References:

| – https://www.iplocation.net/defend-wordpress-from-ddos

| – https://github.com/wpscanteam/wpscan/issues/1299

[+] WordPress version 5.2.5 identified (Latest, released on 2019-12-12).

| Detected By: Rss Generator (Passive Detection)

| – http://xxxxxxxxxx .es/feed/, <generator>https://wordpress.org/?v=5.2.5</generator>

| – http://xxxxxxxxxx .es/comments/feed/, <generator>https://wordpress.org/?v=5.2.5</generator>

[+] WordPress theme in use: azera-shop

| Location: http://xxxxxxxxxx .es/wp-content/themes/azera-shop/

| Latest Version: 1.1.17 (up to date)

| Last Updated: 2018-12-03T00:00:00.000Z

| Readme: http://xxxxxxxxxx .es/wp-content/themes/azera-shop/readme.txt

| Style URL: http://xxxxxxxxxx .es/wp-content/themes/azera-shop/style.css?ver=1.0.0

| Style Name: Azera Shop

| Style URI: http://themeisle.com/themes/azera-shop/

| Description: Azera Shop is an elegant free WooCommerce WordPress theme, perfect for building an one page online s…

| Author: ThemeIsle

| Author URI: http://themeisle.com/

|

| Detected By: Css Style (Passive Detection)

|

| Version: 1.1.17 (80% confidence)

| Detected By: Style (Passive Detection)

| – http://xxxxxxxxxx .es/wp-content/themes/azera-shop/style.css?ver=1.0.0, Match: ‘Version: 1.1.17’

[+] Enumerating All Plugins (via Passive Methods)

[+] Checking Plugin Versions (via Passive and Aggressive Methods)

[i] Plugin(s) Identified:

[+] contact-form-7

| Location: http://xxxxxxxxxx .es/wp-content/plugins/contact-form-7/

| Last Updated: 2019-11-30T13:01:00.000Z

| [!] The version is out of date, the latest version is 5.1.6

|

| Detected By: Urls In Homepage (Passive Detection)

|

| Version: 5.1.1 (100% confidence)

| Detected By: Query Parameter (Passive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=5.1.1

| – http://xxxxxxxxxx .es/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.1.1

| Confirmed By:

| Readme – Stable Tag (Aggressive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/contact-form-7/readme.txt

| Readme – ChangeLog Section (Aggressive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/contact-form-7/readme.txt

[+] themeisle-companion

| Location: http://xxxxxxxxxx .es/wp-content/plugins/themeisle-companion/

| Last Updated: 2019-12-02T12:11:00.000Z

| [!] The version is out of date, the latest version is 2.8.14

|

| Detected By: Urls In Homepage (Passive Detection)

|

| Version: 2.8.0 (100% confidence)

| Detected By: Query Parameter (Passive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/themeisle-companion/obfx_modules/menu-icons/css/public.css?ver=2.8.0

| Confirmed By:

| Readme – ChangeLog Section (Aggressive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/themeisle-companion/readme.txt

| Style Comment (Aggressive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/themeisle-companion/core/assets/css/orbit-fox-admin.css, Match: ‘Version: 2.8.0’

[+] woocommerce

| Location: http://xxxxxxxxxx .es/wp-content/plugins/woocommerce/

| Last Updated: 2019-11-27T19:11:00.000Z

| [!] The version is out of date, the latest version is 3.8.1

|

| Detected By: Urls In Homepage (Passive Detection)

| Confirmed By: Meta Generator (Passive Detection)

|

| [!] 1 vulnerability identified:

|

| [!] Title: WooCommerce <= 3.6.4 – Cross-Site Request Forgery (CSRF) & File Type Check

| Fixed in: 3.6.5

| References:

| – https://wpvulndb.com/vulnerabilities/9428

| – https://plugins.trac.wordpress.org/changeset?reponame=&new=2116363%40woocommerce&old=2096035%40woocommerce

| – https://twitter.com/WooCommerce/status/1147543261814374401

| – https://woocommerce.wordpress.com/2019/07/02/woocommerce-3-6-5-security-release/

| – https://blog.ripstech.com/2019/woocommerce-csrf-to-stored-xss/

|

| Version: 3.5.7 (100% confidence)

| Detected By: Query Parameter (Passive Detection)

| – http://xxxxxxxxxx .es/wp-content/plugins/woocommerce/assets/css/woocommerce-layout.css?ver=3.5.7

| – http://xxxxxxxxxx .es/wp-content/plugins/woocommerce/assets/css/woocommerce-smallscreen.css?ver=3.5.7

| – http://xxxxxxxxxx .es/wp-content/plugins/woocommerce/assets/css/woocommerce.css?ver=3.5.7

| – http://xxxxxxxxxx .es/wp-content/plugins/woocommerce/assets/js/frontend/add-to-cart.min.js?ver=3.5.7

| – http://xxxxxxxxxx.es/wp-content/plugins/woocommerce/assets/js/frontend/woocommerce.min.js?ver=3.5.7

| – http://xxxxxxxxxx.es/wp-content/plugins/woocommerce/assets/js/frontend/cart-fragments.min.js?ver=3.5.7

| Confirmed By: Meta Generator (Passive Detection)

| – http://xxxxxxxxxx.es/, Match: ‘WooCommerce 3.5.7’

[+] wp-easy-gallery

| Location: http://xxxxxxxxxx.es/wp-content/plugins/wp-easy-gallery/

| Last Updated: 2020-01-16T05:01:00.000Z

| [!] The version is out of date, the latest version is 4.8.3

|

| Detected By: Urls In Homepage (Passive Detection)

|

| Version: 4.7.4 (80% confidence)

| Detected By: Readme – Stable Tag (Aggressive Detection)

| – http://xxxxxxxxxx.es/wp-content/plugins/wp-easy-gallery/readme.txt

[+] Enumerating Config Backups (via Passive and Aggressive Methods)

Checking Config Backups – Time: 00:00:01 <===> (21 / 21) 100.00% Time: 00:00:01

[i] No Config Backups Found.

[+] WPVulnDB API OK

| Plan: free

| Requests Done (during the scan): 6

| Requests Remaining: 44

[+] Finished: Fri Jan 17 10:58:59 2020

[+] Requests Done: 62

[+] Cached Requests: 9

[+] Data Sent: 14.852 KB

[+] Data Received: 421.383 KB

[+] Memory used: 185.965 MB

[+] Elapsed time: 00:00:13

Después de escanear el sitio vulnerable, el resultado muestra el servidor que está siendo utilizado por el sitio vulnerable, el tema de WordPress que usa el objetivo, los plugins que está utilizando e identifica todos aquellos que están desactualizados, algo que puede ser utilizado por un atacante.

Se muestran varias vulnerabilidades que se pueden usar en un ataque de escalado de privilegios en el que un hacker puede obtener acceso al objetivo. Y el segundo es la divulgación de archivos locales que puede mostrar la ruta del archivo webroot

El escaneo anterior muestra la versión de WordPress. Muestra la descripción del sitio web objetivo que se puede utilizar en la fase inicial de recopilación de información.

Las vulnerabilidades serán mostradas precedidas de un símbolo de exclamación[!], así como referencias donde podemos encontrar información sobre dicha vulnerabilidad. Por ejemplo:

| [!] Title: WooCommerce <= 3.6.4 – Cross-Site Request Forgery (CSRF) & File Type Check

| Fixed in: 3.6.5

| References:

| – https://wpvulndb.com/vulnerabilities/9428

Entrando en la url que nos indica podemos encontrar más detalles:

Hay diferentes webs donde podemos encontrar información relevante a las vulnerabilidades potenciales:

  • https://wpvulndb.com
  • https://packetstormsecurity.com
  • https://www.exploit-db.com
  • https://cve.mitre.org
  • http://www.securityfocus.com

Si la página web está alojada dentro del dominio worpress.com nos dará un error ya que estas páginas tienen un sistema de protección (loquesea.wordpress.com).

Si lo que queremos es buscar usuarios lo haríamos de la siguiente manera:

wpscan -e u --url http://www.ejemplo.com

y en el resultado nos mostrará una lista de usuarios de WordPress registrados para el host de destino. La enumeración de usuarios es el primer paso cuando un atacante quiere acceder a un objetivo específico.

Estas cuentas pueden poseer permisos elevados de administrador, por lo que, puede ser susceptible a un posible ataque de fuerza bruta.

Ya tendríamos el usuario de acceso a la web, ahora tendríamos que sacar la contraseña.

Para obtener la contraseña tendremos que utilizar un diccionario que podremos crear con crunch como vimos en este artículo:

Para obtener la contraseña utilizaremos el siguiente comando donde cambiaremos la url de la web, la ruta donde tenemos el diccionario y el nombre del mismo. También es conveniente poner un número de threads no mayor a 50 para no generar demasiado tráfico:

wpscan --url http://www.ejemplo.com --passwords /usr/share/wordlists/rockyou.txt --usernames usuario -threads 50

En mi caso he utilizado un conocido diccionario llamado rockyou.txt. El proceso comenzará y tardará más o menos tiempo dependiendo del tamaño del diccionario.

rockyou.txt

Una vez acabado el proceso, si la contraseña se encuentra entre las de nuestro diccionario, veremos un mensaje parecido a este:

[SUCCESS] – eladministrador / Contraseña sucontraseña

Usuario: eladministrador
Contraseña: sucontraseña

Una correcta protección del servidor que estemos usando o del hosting utilizaría un firewall que habría detectado el ataque y lo habría bloqueado en tiempo real, impidiendo a WPScan llegar a realizar ningún tipo de análisis, y, por supuesto, no llegaría a detectar el usuario y contraseña del WordPress. En ese caso veríamos un mensaje como este:

“Error: Request timed out.”

También es posible realizar una enumeración de plugins, temas, etc, utilizando el siguiente comando:

wpscan --url www.example.com --enumerate

Las opciones serían:

vp Vulnerable plugins

ap All plugins

p Plugins

vt Vulnerable themes

at All themes

t Themes

tt Timthumbs

cb Config backups

dbe Db exports

u User IDs range. e.g: u1-5

Range separator to use: ‘-‘

Value if no argument supplied: 1-10

m Media IDs range. e.g m1-15

Note: Permalink setting must be set to «Plain» for those to be detected

Range separator to use: ‘-‘

Value if no argument supplied: 1-100

Con estas opciones, si quisiésemos por ejemplo buscar plugins vulnerables lo haríamos de la siguiente forma:

wpscan --url www.example.com --enumerate vp

Donde podemos observar que el plugin de woocomerce está desactualizado y además tiene una vulnerabilidad.

Accederíamos a las referencias que nos proporciona:

https://wpvulndb.com/vulnerabilities/9428

veremos una descripción:

y una clasificación:

Si comprobamos esta descripción en CWE (Common Weakness Enumeration):

https://cwe.mitre.org/data/definitions/352.html

encontraremos información más que relevante de dicha vulnerabilidad:

“La aplicación web no verifica o no puede verificar suficientemente si una solicitud bien formada, válida y consistente fue proporcionada intencionalmente por el usuario que envió la solicitud.”

Información que ayudaría a un atacante a saber cómo podría explotar dicha vulnerabilidad.