Millones de sitios web funcionan con WordPress y ocupa la primera posición, con un 62% de la cuota de mercado en el mundo de los CMS.

Un reciente informe de Acunetix sobre la vulnerabilidad de las aplicaciones web muestra que alrededor del 30% de los sitios de WordPress son vulnerables.

wp-vulnerability-report

Existen multitud de escáneres de seguridad en línea para escanear su sitio web. Sin embargo, si busca un software para instalar y escanear desde su servidor, entonces WPScan es su amigo. Es útil si su sitio web está en una red privada o Intranet donde Internet no está disponible. O si desea realizar pruebas en varios sitios en varias ocasiones.

WPScan es un software gratuito, le ayuda a identificar los problemas relacionados con la seguridad en su sitio WordPress. Hace varias cosas como:

  • Comprueba si el sitio utiliza una versión vulnerable de WP
  • Comprobar si un tema y un plugin están actualizados o se sabe que son vulnerables
  • Compruebe Timthumbs
  • Compruebe la copia de seguridad de la configuración, las exportaciones DB
  • Ataque de fuerza bruta

y mucho más…

Hay varias formas de utilizar WPScan.

  • Instalando en servidores Linux
  • Utilizando Docker
  • Utilizando una distro Linux preinstalada como Kali Linux, BackBox, Pentoo, BlackArch, etc.
  • Versión en línea

Uso en CentOS

Lo siguiente se ha probado en CentOS 7.x.

  • Inicie sesión en CentOS con root
  • Actualice el repositorio
yum update -y
  • Instale la última versión de Ruby y sus dependencias
yum -y install curl gpg gcc gcc-c make patch autoconf automake bison libffi-devel libtool patch readline-devel sqlite-devel zlib-devel openssl-devel && gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && curl -sSL https://get.rvm.io | bash -s stable --ruby
  • Instalar Ruby Nokogiri
yum -y install rubygem-nokogiri
  • Reinicie el servidor y luego instale WPScan utilizando el comando gem
gem install wpscan

Tardará unos segundos en instalarse, y una vez hecho; debería ver algo como esto

Terminada la instalación de documentación para ffi, get_process_mem, mini_portile2, nokogiri, concurrent-ruby, i18n, thread_safe, tzinfo, zeitwerk, activesupport, public_suffix, addressable, opt_parse_validator, ruby-progressbar, ethon, typhoeus, yajl-ruby, sys-proctable, cms_scanner, wpscan después de 32 segundos
20 gemas instaladas

WPScan está instalado y listo para usar ahora. Ejecute wpscan y debería ver que devuelve lo siguiente.

[root@lab ~]# wpscan
Se requiere una de las siguientes opciones: url, update, help, hh, version

Utilice --help/-h para obtener la lista de opciones disponibles.
[root@lab ~]#

Aquí está la salida de una de las pruebas del sitio.

[root@lab ~]# wpscan --url https://geekflaresg.com
_______________________________________________________________
         __ _______ _____
                  / / __ / ____|
             / / /| |__) | (___ ___ __ _ _ __ ®
            / / / | ___/ ___ / __|/ _` | '_ 
              / / | | ____) | (__| (_| | | | |
             / / |_| |_____/ ___|__,_|_| |_|

         Escáner de seguridad de WordPress por el equipo de WPScan
                         Versión 3.7.6
       Patrocinado por Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[ ] URL: https://geekflaresg.com/
[ ] Iniciado Wed Jan 8 21:14:16 2020

Hallazgo(s) interesante(s):

[ ] https://geekflaresg.com/
 | Entradas interesantes:
 | - Servidor: nginx
 | - X-Cache-Enabled: True
 | - Host-Header: 5d77dd967d63c3104bced1db0cace49c
 | - X-Proxy-Cache: MISS
 | Encontrado por: Cabeceras (Detección pasiva)
 | Confianza 100%

[ ] https://geekflaresg.com/robots.txt
 | Entradas interesantes:
 | - /wp-admin/
 | - /wp-admin/admin-ajax.php
 | Encontrado Por: Robots Txt (Detección Agresiva)
 | Confianza 100%

[ ] https://geekflaresg.com/xmlrpc.php
 | Encontrado por: Acceso Directo (Detección Agresiva)
 | Confianza 100%
 | Referencias:
 | - 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

[ ] https://geekflaresg.com/readme.html
 | Encontrado por: Acceso Directo (Detección Agresiva)
 | Confianza 100%

[ ] https://geekflaresg.com/wp-cron.php
 | Encontrado por: Acceso Directo (Detección Agresiva)
 | Confianza 60%
 | Referencias:
 | - https://www.iplocation.net/defend-wordpress-from-ddos
 | - https://github.com/wpscanteam/wpscan/issues/1299

[ ] WordPress versión 5.3.2 identificada (Última, publicada el 2019-12-18).
 | Encontrado por: Generador Rss (Detección pasiva)
 | - https://geekflaresg.com/feed/, https://wordpress.org/?v=5.3.2
 | - https://geekflaresg.com/comments/feed/, https://wordpress.org/?v=5.3.2

[ ] Tema de WordPress en uso: twentyseventeen
 | Ubicación: https://geekflaresg.com/wp-content/themes/twentyseventeen/
 | Última actualización: 2019-05-07T00:00:00.000Z
 | Léame: https://geekflaresg.com/wp-content/themes/twentyseventeen/README.txt
 | [!] La versión está desactualizada, la última versión es la 2.2
 | URL del estilo: https://geekflaresg.com/wp-content/themes/twentyseventeen/style.css
 | Nombre del estilo: Veintisiete
 | URI del estilo: https://wordpress.org/themes/twentyseventeen/
 | Descripción: Twenty Seventeen da vida a su sitio con vídeo de cabecera e imágenes destacadas inmersivas. Con un fo...
 | Autor: el equipo de WordPress
 | Autor URI: https://wordpress.org/
 |
 | Encontrado por: Urls In Homepage (Detección Pasiva)
 | Confirmado por: Urls en la página 404 (detección pasiva)
 |
 | Versión: 2.1 (80% de confianza)
 | Encontrado Por: Estilo (Detección Pasiva)
 | - https://geekflaresg.com/wp-content/themes/twentyseventeen/style.css, Coincidencia: 'Versión: 2.1'

[ ] Enumeración de todos los plugins (mediante métodos pasivos)

[i ] No se han encontrado plugins.

[ ] Enumerando las copias de seguridad de la configuración (mediante métodos pasivos y agresivos)
 Comprobando copias de seguridad de configuración - Tiempo: 00:00:01 <===================================================================================================> (21 / 21) 100.00% Tiempo: 00:00:01

[i ] No se han encontrado copias de seguridad.

[!] No WPVulnDB API Token dado, como resultado los datos de vulnerabilidad no se ha emitido.
[!] Puede obtener un token de API gratuito con 50 peticiones diarias registrándose en https://wpvulndb.com/users/sign_up

[ ] Finalizado: Wed Jan 8 21:14:28 2020
[ ] Peticiones realizadas: 51
[ ] Peticiones en caché: 7
[ ] Datos Enviados: 9.52 KB
[ ] Datos recibidos: 369.97 KB
[ ] Memoria utilizada 202.898 MB
[ ] Tiempo transcurrido: 00:00:12
[root@lab ~]# 

Nota: si necesita datos de vulnerabilidad en la salida, deberá utilizar su API.

Si está interesado en comprobar métricas específicas, entonces consulte la ayuda ejecutando wpscan con la sintaxis --help.

[root@lab ~]# wpscan --hh
_______________________________________________________________
         __ _______ _____
                  / / __ / ____|
             / / /| |__) | (___ ___ __ _ _ __ ®
            / / / | ___/ ___ / __|/ _` | '_ 
              / / | | ____) | (__| (_| | | | |
             / / |_| |_____/ ___|__,_|_| |_|

         Escáner de seguridad de WordPress por el equipo de WPScan
                         Versión 3.7.6
       Patrocinado por Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

Uso: wpscan [opciones]
        --url URL La URL del blog a escanear
                                                  Protocolos permitidos: http, https
                                                  Protocolo por defecto si no se proporciona ninguno: http
                                                  Esta opción es obligatoria a menos que se proporcione update o help o hh o version
    -h, --help Mostrar la ayuda simple y salir
        --hh Muestra la ayuda completa y sale
        --version Muestra la versión y sale
        --ignore-main-redirect Ignora la redirección principal (si existe) y escanea la url de destino
    -v, --verbose Modo detallado
        --[no-]banner Mostrar o no el banner
                                                  Por defecto: true
        --max-scan-duration SECONDS Abortar el escaneado si excede el tiempo proporcionado en segundos
    -o, --output FILE Salida a FILE
    -f, --format FORMAT Salida de los resultados en el formato suministrado
                                                  Opciones disponibles: cli-no-color, cli-no-color, cli, json
        --detection-mode MODE Por defecto: mixto
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --scope DOMAINS (sub)dominios separados por comas a considerar en el ámbito. 
                                                  Comodín(es) permitido(s) en el trd de dominios válidos, por ejemplo *.target.tld
                                                  Separador a utilizar entre los valores: ','
        --user-agent, --ua VALOR
        --headers HEADERS Cabeceras adicionales a añadir en las peticiones
                                                  Separador a utilizar entre las cabeceras: '; '
                                                  Ejemplos: 'X-Forwarded-For: 127.0.0.1', 'X-Forwarded-For: 127.0.0.1; Otro: aaa'
        --vhost VALOR El host virtual (cabecera Host) a utilizar en las peticiones
        --random-user-agent, --rua Utilizar un user-agent aleatorio para cada exploración
        --user-agents-list FILE-PATH Lista de agentes a utilizar con --random-user-agent
                                                  Por defecto: /usr/local/rvm/gems/ruby-2.6.3/gems/cms_scanner-0.8.1/app/user_agents.txt
        --http-auth login:password
    -t, --max-threads VALOR El máximo de hilos a utilizar
                                                  Por defecto: 5
        --throttle MilliSeconds Millisegundos a esperar antes de realizar otra petición web. Si se utiliza, el max threads se fijará en 1.
        --request-timeout SECONDS El tiempo de espera de la petición en segundos
                                                  Por defecto: 60
        --connect-timeout SECONDS El tiempo de espera de la conexión en segundos
                                                  Por defecto: 30
        --disable-tls-checks Desactiva la verificación de certificados SSL/TLS, y el downgrade a TLS1.0 (requiere cURL 7.66 para esto último)
        --proxy protocol://IP:port Los protocolos soportados dependen del <a href="https://geekflare.com/es/proxy-with-curl-and-wget/">cURL</a> instalado
        --proxy-auth login:password
        --cookie-string COOKIE Cadena de cookies a utilizar en las peticiones, formato: cookie1=valor1[; cookie2=valor2]
        --cookie-jar FILE-PATH Archivo para leer y escribir cookies
                                                  Por defecto /tmp/wpscan/cookie_jar.txt
        --cache-ttl TIME_TO_LIVE Tiempo de vida de la caché en segundos
                                                  Por defecto: 600
        --clear-cache Borra la caché antes del escaneo
        --cache-dir PATH Por defecto: /tmp/wpscan/cache
        --server SERVER Fuerza la carga del módulo de servidor suministrado
                                                  Opciones disponibles: apache, iis, nginx
        --force No comprobar si el objetivo está ejecutando WordPress
        --[no-]update Actualizar o no la base de datos
        --api-token TOKEN El token de la API WPVulnDB para mostrar los datos de vulnerabilidad
        --wp-content-dir DIR El directorio wp-content si es personalizado o no se detecta, como "wp-content"
        --wp-plugins-dir DIR El directorio de plugins si es personalizado o no se detecta, como "wp-content/plugins"
        --interesting-findings-detection MODE Utilice el modo suministrado para la detección de hallazgos interesantes. 
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --wp-version-all Comprobar todas las ubicaciones de versión
        --wp-version-detection MODE Utilice el modo suministrado para la detección de la versión de WordPress, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --main-theme-detection MODE Utilice el modo suministrado para la detección del tema principal, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
    -e, --enumerate [OPTS] Proceso de enumeración
                                                  Opciones disponibles:
                                                   vp Plugins vulnerables
                                                   ap Todos los plugins
                                                   p Plugins populares
                                                   vt Temas vulnerables
                                                   at Todos los temas
                                                   t Temas populares
                                                   tt Temas
                                                   cb Copias de seguridad de la configuración
                                                   dbe Exportación de bases de datos
                                                   u Rango de ID de usuario. p. ej.: u1-5
                                                        Separador de rango a utilizar: '-'
                                                        Valor si no se suministra ningún argumento: 1-10
                                                   m Rango de IDs de medios. p.ej. m1-15
                                                        Nota: El ajuste Permalink debe estar en "Plain" para que se detecten
                                                        Separador de rango a utilizar: '-'
                                                        Valor si no se suministra ningún argumento: 1-100
                                                  Separador a utilizar entre los valores ','
                                                  Por defecto: Todos los plugins, copias de seguridad de configuración
                                                  Valor si no se suministra ningún argumento: vp,vt,tt,cb,dbe,u,m
                                                  Opciones incompatibles (sólo se puede utilizar uno de cada grupo/s):
                                                   - vp, ap, p
                                                   - vt, at, t
        --exclude-content-based REGEXP_OR_STRING Excluye todas las respuestas que coincidan con la Regexp (insensible a mayúsculas y minúsculas) durante partes de la enumeración.
                                                  Se comprueban tanto las cabeceras como el cuerpo. Los delimitadores Regexp no son necesarios.
        --plugins-list LIST Lista de plugins a enumerar
                                                  Ejemplos: 'a1', 'a1,a2,a3', '/tmp/a.txt'
        --plugins-detection MODE Utilice el modo suministrado para enumerar los plugins, en lugar del modo global (--detection-mode).
                                                  Por defecto: pasivo
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --plugins-version-all Comprueba todas las ubicaciones de las versiones de los plugins según el modo elegido (--detection-mode, --plugins-detection y --plugins-version-detection)
        --plugins-version-detection MODE Utiliza el modo suministrado para comprobar las versiones de los plugins en lugar de los modos --detection-mode o --plugins-detection.
                                                  Por defecto: mixto
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --plugins-threshold THRESHOLD Lanza un error cuando el número de plugins detectados a través de ubicaciones conocidas alcanza el umbral. Establezca 0 para ignorar el umbral.
                                                  Predeterminado: 100
        --themes-list LISTA Lista de temas a enumerar
                                                  Ejemplos: 'a1', 'a1,a2,a3', '/tmp/a.txt'
        --themes-detection MODE Utilice el modo suministrado para enumerar los temas, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --themes-version-all Comprueba todas las ubicaciones de las versiones de los temas según el modo elegido (--detection-mode, --themes-detection y --themes-version-detection)
        --themes-version-detection MODE Utilice el modo suministrado para comprobar las versiones de los temas en lugar de los modos --detection-mode o --themes-detection.
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --themes-threshold THRESHOLD Provoca un error cuando el número de temas detectados a través de ubicaciones conocidas alcanza el umbral. Póngalo a 0 para ignorar el umbral.
                                                  Por defecto: 20
        --timthumbs-list FILE-PATH Lista de ubicaciones de timthumbs a utilizar
                                                  Por defecto: /root/.wpscan/db/timthumbs-v3.txt
        --timthumbs-detection MODE Utilice el modo suministrado para enumerar Timthumbs, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --config-backups-list FILE-PATH Lista de nombres de archivos de copias de seguridad de configuración a utilizar
                                                  Por defecto: /root/.wpscan/db/config_backups.txt
        --config-backups-detection MODE Utilice el modo suministrado para enumerar las copias de seguridad de configuración, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --db-exports-list FILE-PATH Lista de rutas de exportación de BD a utilizar
                                                  Por defecto: /root/.wpscan/db/db_exports.txt
        --db-exports-detection MODE Utilice el modo suministrado para enumerar DB Exports, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --medias-detection MODE Utilice el modo suministrado para enumerar las Medias, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
        --users-list LIST Lista de usuarios a comprobar durante la enumeración de usuarios a partir de los mensajes de error de inicio de sesión
                                                  Ejemplos: 'a1', 'a1,a2,a3', '/tmp/a.txt'
        --users-detection MODE Utilice el modo suministrado para enumerar usuarios, en lugar del modo global (--detection-mode).
                                                  Opciones disponibles: mixto, pasivo, agresivo
    -P, --passwords FILE-PATH Lista de contraseñas a utilizar durante el ataque de contraseñas.
                                                  Si no se suministra la opción --username/s, se ejecutará la enumeración de usuarios.
    -U, --usernames LIST Lista de nombres de usuario a utilizar durante el ataque por contraseña.
                                                  Ejemplos: 'a1', 'a1,a2,a3', '/tmp/a.txt'
        --multicall-max-passwords MAX_PWD Número máximo de contraseñas a enviar por petición con multicall XMLRPC
                                                  Por defecto: 500
        --password-attack ATTACK Fuerza que se utilice el ataque suministrado en lugar de determinar uno automáticamente.
                                                  Opciones disponibles: wp-login, xmlrpc, xmlrpc-multicall
        --stealthy Alias para --random-user-agent --detection-mode passive --plugins-version-detection passive

[root@lab ~]# 

Uso de WPScan en Kali Linux

Lo bueno de utilizar Kali Linux es que no tiene que instalar nada. WPScan está preinstalado.

Averigüemos cómo ejecutar el escáner.

  • Inicie sesión en Kali Linux con root y abra la terminal
  • Ejecute el escáner utilizando el comando wpscan
wpscan --url https://mysite.com

Usando Docker

¿Es un fan de Docker?

Por qué no, es fácil ponerlo en marcha. Asegúrese de tener instalado Docker.

  • Extraiga la imagen Docker de WPScan
docker pull wpscanteam/wpscan
  • Una vez extraído, ejecútelo como se indica a continuación.
docker run -it --rm wpscanteam/wpscan --url https://example.com

¿Fácil?

Escáner en línea alimentado por WPScan

Puede aprovechar las siguientes herramientas impulsadas por WPScan.

Geekflare

El escáner de seguridad de WordPress de Geekflare le permite averiguar rápidamente si un determinado sitio de WordPress tiene una versión vulnerable del núcleo, tema, plugin, etc.

wp-security-scanner

Además de las métricas de WPScan, también comprueba lo siguiente.

  • ¿Está expuesta la consola de administración?
  • Si está considerada segura por Google
  • Si es accesible a través de HTTPS
  • Si las bibliotecas JavaScript front-end son vulnerables

No es necesario que registre una cuenta; puede ejecutar la prueba a petición de forma GRATUITA.

Pentest-Tools

Una herramienta de Pentest-Tools le permite probar el sitio WP bajo demanda y producir el informe.

pentest-tools-wpscan

¿Y ahora qué?

¡Bien hecho! Si su sitio no es vulnerable. Sin embargo, si lo es, entonces trabaje en esos elementos de riesgo. Si no está seguro de cómo mitigarlos, entonces solicite ayuda profesional.