Individuare vulnerabilità in WordPress con WPScan

Individuare vulnerabilità in WordPress con WPScan

WordPress, il popolare sistema di gestione dei contenuti (CMS), alimenta circa il 43% di tutti i siti web in circolazione su Internet. Questo significa che milioni di siti in tutto il mondo utilizzano WordPress come piattaforma principale per il loro sito.

Con la crescente popolarità di WordPress, aumenta anche l’interesse degli attaccanti. Il CMS, insieme ai suoi plugin, temi e database, possono presentare vulnerabilità che mettono a rischio la sicurezza del nostro sito web.

Fortunatamente, esiste uno strumento gratuito chiamato WPScan, che può aiutare a identificare e risolvere questi problemi di sicurezza. WPScan è disponibile per una vasta gamma di sistemi operativi, tra cui Debian, Ubuntu, CentOS/RHEL 8, Fedora, Arch Linux e viene preinstallato su Kali Linux. Inoltre WPScan è disponibile direttamente sul beckend di WordPress utilizzando il plugin dedicato.

Una volta installato WPScan, è possibile utilizzarlo per eseguire una scansione completa di qualsiasi sito web basato su WordPress per individuare varie vulnerabilità, inclusi problemi nei file core, nei plugin e nei temi. Inoltre, WPScan verifica password deboli, presenza di HTTPS, elementi di intestazione e cerca file sensibili come debug.log e file di backup wp-config.php e molto altro ancora.

Installazione di WPScan e Prima Scansione

In questa guida utilizzeremo WPScan su Kali Linux da riga di comando. WPScan viene preinstallato di default su Kali Linux, quindi non è necessario installarlo manualmente. Tuttavia, nel caso in cui non sia già presente nel nostro sistema operativo, apriamo il nostro terminale e digitiamo il seguente comando per procedere con l’installazione:

 sudo apt install wpscan

Se già abbiamo installato WPScan e abbiamo intenzione di aggiornarlo alla versione più recente, possiamo farlo tramite il seguente comando, utilizzando sempre il terminale di Kali.

wpscan --update

Una volta installato, siamo pronti per eseguire la nostra prima scansione di base all nostro sito web, con il seguente comando:

WPScan in azione , analisi di un sito WordPress
wpscan --url https://www.il-tuo-sito-web.it/

Di default, WPScan non mostrerà informazioni sulle vulnerabilità nei risultati. Per accedere a questa funzionalità, dovremo generare un API Token. Per farlo, visitiamo il sito ufficiale di WPScan e selezioniamo il piano gratuito per la registrazione.

WPScan API Token

Dopo aver effettuato la registrazione e ottenuto il nostro API Token, copiamolo e utilizziamolo insieme al comando seguente:

wpscan --url https://www.il-tuo-sito-web.it/ --api-token la tua-chiave-api

Nota: sostituisci il testo “tua chiave API con il tuo API Token appena generato. Con il piano gratuito possiamo effettuare fino a 25 richieste API al giorno.

Se tutto è andato a buon fine, avremo eseguito la nostra prima scansione all nostro sito.

Modalità di Scansione WPScan

Per esplorare i vari comandi e opzioni disponibili con WPScan, ci basta aprire la sezione di aiuto con il seguente comando:

wpscan -h

Questo comando ci fornirà un elenco completo dei comandi e delle opzioni disponibili per l’utilizzo di WPScan.

┌──(kali㉿kali)-[~]
└─$ wpscan -h
______________________________________________________________________________________________________________________
      __       _______   _____
     \ \     / /  __ \ / ____|
      \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
       \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
        \  /\  /  | |  ____) | (__| (_| | | | |
         \/  \/   |_| |_____/ \___|\__,_|_| |_|

      WordPress Security Scanner by the WPScan Team
                      Version 3.8.25
                                                 
    @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
______________________________________________________________________________________________________________________

Usage: wpscan [options]
    --url URL                              The URL of the blog to scan
                                               Allowed Protocols: http, https
                                               Default Protocol if none provided: http
                                               This option is mandatory unless update or help or hh or version is/are supplied
    -h, --help                                 Display the simple help and exit
    --hh                                     Display the full help and exit
    --version                                Display the version and exit
    -v, --verbose                             Verbose mode
    --[no-]banner                            Whether or not to display the banner
                                               Default: true
    -o, --output FILE                         Output to FILE
    -f, --format FORMAT                       Output results in the format supplied
                                               Available choices: cli-no-colour, cli-no-color, json, cli
    --detection-mode MODE                    Default: mixed
                                               Available choices: mixed, passive, aggressive
    --user-agent, --ua VALUE
    --random-user-agent, --rua               Use a random user-agent for each scan
    --http-auth login:password
    -t, --max-threads VALUE                   The max threads to use
                                               Default: 5
    --throttle MilliSeconds                  Milliseconds to wait before doing another web request. If used, the max threads will be set to 1.
    --request-timeout SECONDS                The request timeout in seconds
                                               Default: 60
    --connect-timeout SECONDS                The connection timeout in seconds
                                               Default: 30
    --disable-tls-checks                     Disables SSL/TLS certificate verification, and downgrade to TLS1.0+ (requires cURL 7.66 for the latter)
    --proxy protocol://IP:port               Supported protocols depend on the cURL installed
    --proxy-auth login:password
    --cookie-string COOKIE                   Cookie string to use in requests, format: cookie1=value1[; cookie2=value2]
    --cookie-jar FILE-PATH                   File to read and write cookies
                                               Default: /tmp/wpscan/cookie_jar.txt
    --force                                  Do not check if the target is running WordPress or returns a 403
    --[no-]update                            Whether or not to update the Database
    --api-token TOKEN                        The WPScan API Token to display vulnerability data, available at https://wpscan.com/profile
    --wp-content-dir DIR                     The wp-content directory if custom or not detected, such as "wp-content"
    --wp-plugins-dir DIR                     The plugins directory if custom or not detected, such as "wp-content/plugins"
    -e, --enumerate [OPTS]                    Enumeration Process
                                               Available Choices:
                                                vp   Vulnerable plugins
                                                ap   All plugins
                                                p    Popular plugins
                                                vt   Vulnerable themes
                                                at   All themes
                                                t    Popular 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
                                               Separator to use between the values: ','
                                               Default: All Plugins, Config Backups
                                               Value if no argument supplied: vp,vt,tt,cb,dbe,u,m
                                               Incompatible choices (only one of each group/s can be used):
                                                - vp, ap, p
                                                - vt, at, t
    --exclude-content-based REGEXP_OR_STRING  Exclude all responses matching the Regexp (case insensitive) during parts of the enumeration.
                                               Both the headers and body are checked. Regexp delimiters are not required.
    --plugins-detection MODE                 Use the supplied mode to enumerate Plugins.
                                               Default: passive
                                               Available choices: mixed, passive, aggressive
    --plugins-version-detection MODE         Use the supplied mode to check plugins' versions.
                                               Default: mixed
                                               Available choices: mixed, passive, aggressive
    --exclude-usernames REGEXP_OR_STRING    Exclude usernames matching the Regexp/string (case insensitive). Regexp delimiters are not required.
    -P, --passwords FILE-PATH                List of passwords to use during the password attack.
                                               If no --username/s option supplied, user enumeration will be run.
    -U, --usernames LIST                     List of usernames to use during the password attack.
                                               Examples: 'a1', 'a1,a2,a3', '/tmp/a.txt'
    --multicall-max-passwords MAX_PWD       Maximum number of passwords to send by request with XMLRPC multicall
                                               Default: 500
    --password-attack ATTACK                Force the supplied attack to be used rather than automatically determining one.
                                               Multicall will only work against WP < 4.4
                                               Available choices: wp-login, xmlrpc, xmlrpc-multicall
    --login-uri URI                        The URI of the login page if different from /wp-login.php
    --stealthy                              Alias for --random-user-agent --detection-mode passive --plugins-version-detection passive

[!] To see full list of options use --hh.

Funzionalità WPScan: Verificare la presenza di plugin vulnerabili

Questo comando eseguirà una scansione dei plugin installati sul nostro sito WordPress e utilizzerà la chiave API fornita per accedere ai dati sulle vulnerabilità dai server di WPScan.

wpscan --url https://www.il-tuo-sito-web.it/ --enumerate p --api-token la tua-chiave-api

Funzionalità WPScan: Verificare la presenza di temi vulnerabili

Questo comando eseguirà una scansione dei temi installati sul tuo sito WordPress e utilizzerà la chiave API fornita per accedere ai dati sulle vulnerabilità dai server di WPScan.

wpscan --url https://www.il-tuo-sito-web.it/ --enumerate t --api-token la tua-chiave-api

Funzionalità WPScan: modalità stealth

Questo comando avvierà WPScan in modalità stealth. Ciò aiuta a eseguire la scansione in modalità nascosta, impedendo al firewall dell’applicazione web di rilevare WPScan.

wpscan --url https://www.il-tuo-sito-web.it/ --stealthy

Funzionalità WPScan: Enumerare gli utenti registrati

Questo comando eseguirà una scansione per enumerare gli utenti registrati sul tuo sito WordPress.

wpscan --url https://www.il-tuo-sito-web.it/ --enumerate u

Funzionalità WPScan: Lanciare l’attacco a dizionario e testare la password

Dopo aver elencato i nomi utente, possiamo provare a eseguire un attacco di Brute force sull’utente individuato, per testare la sicurezza del nostro sito, digitando il comando:

wpscan --url https://www.il-tuo-sito-web.it/ --wordlist /path/dizionario/wordlist --username Nomeutente

WPScan inizierà a provare tutte le password presenti nel dizionario per il nome utente specificato. Una volta trovata quella giusta si bloccherà indicando il successo dell’operazione e mostrando una tabella con la password affiancata al nome dell’utente. Beh se hai questo risultato non è una bella notizia! Cambia la password impostandone una robusta!

Vi ricordo che scansionare i siti altrui a scopi non etici è illegale.