Vi ricordate il fumetto Lucky Luke, la pistola più veloce del West?
Sparava più veloce della sua ombra!
È l’immagine che mi è venuta in mente quando ieri pomeriggio mi è arrivata un’allarme del plugin di sicurezza Sucuri, che mi segnalava un file anomalo all’interno del sito di un mio cliente.
Insospettito dal nome del file (.query.php
) e dalle caratteristiche (file nascosto e salvato nella cartella wp-includes
), mi sono collegato al server via SSH, per verificare il contenuto del file…
sorpresa!!! 🙂
Una shell PHP remota…
Ho subito contattato il responsabile informatico dell’azienda cliente, per chiedere delucidazioni, visto che avevano installato loro sia il server virtuale (VPS) che WordPress.
Il sistemista un po’ concitato mi ha assicurato che l’installazione era stata eseguita secondo le procedure stabilite e che era impossibile che il sito fosse stato hackerato, visto che il server virtuale era appena stato creato, installando il solito sistema operativo (Ubuntu 20.04) con le solite procedure di messa in sicurezza, e che WordPress era stato installato in automatico, utilizzando l’ultimissima release (5.9.2) che non c’era nessun plugin installato e utilizzava il tema base 2022…Com’è possibile che il sito fosse stato hackerato?!
La faccenda stava diventando sempre più intricata…
L’unico modo per scoprirlo era guardare il file di log del server Web (Nginx in questo caso) e cercare eventuali segni di compromissione!
Et voilà!!
Analisi attacco
Guardiamo nel dettaglio ogni singolo passaggio:
1) “GET /wp-admin/install.php HTTP/1.1” 200 13315 “-” “curl/7.74.0”
Viene richiamata con successo (HTTP 200) la pagina di installazione di WordPress
2) “POST /wp-admin/install.php?step=2 HTTP/1.1” 200 5176 “-” “curl/7.74.0”
Viene eseguita con successo l’installazione di WordPress
3) “POST /wp-login.php HTTP/1.1” 302 5 “-” “curl/7.74.0”
Viene eseguito con successo il login alla dashboard di WordPress
4) “GET /wp-admin/plugin-install.php?tab=upload HTTP/1.1” 200 26399 “-” “curl/7.74.0”
Viene richiamata la pagina per il caricamento manuale di un plugin
5) “POST /wp-admin/update.php?action=upload-plugin HTTP/1.1” 200 17887 “-” “curl/7.74.0”
Viene installato il plugin Form Maker
6) “GET /wp-content/plugins/contact-form-maker/contact-form-maker.php?a=0&b=930015466278503187 HTTP/1.1” 200 5 “-” “curl/7.74.0”
Tramite il plugin Form Maker viene richiamata la shell PHP
7) “POST /wp-includes/.query.php HTTP/1.1” 200 40 “-” “Go-http-client/1.1”
La shell PHP (.query.php) viene copiata nella cartella di sistema wp-includes
Guardando gli orari dei vari passaggi, si vede che l’attacco è iniziato alle 14:25:23 ed è finito alle 14:25:28, il ché significa che l’hacker ci ha messo 5 secondi a manomettere il sito!!
Per quelli di voi abituati all’analisi di siti manomessi, avrete già capito che si tratta di un attacco chiamato “WPsetup” ormai in giro da molti anni.
Cosa fare se si è stati colpiti da questo attacco
1) Bloccare l’indirizzo IP dell’hacker
Il primo accorgimento è bloccare l’accesso al sito e possibilmente al server stesso, da parte dell’IP dell’hacker.
A livello di sito potete farlo utilizzando il file .htaccess
(in caso di server Apache) o il file di configurazione del sito (Nginx). Invece a livello di server, dovete inserire una regola deny
nel firewall (WAF, cloud firewall oppure firewall di sistema IPTables o ufw).
2) Spostare il file infetto
Tramite accesso SSH oppure FTP, spostare (non eliminare!) il file in una cartella nel vostro laptop. E’ opportuno tenere una copia del file, a titolo di prova nel caso vi venisse richiesto da eventuali autorità giudiziarie.
3) Reinstallare WordPress
In questi casi è consigliato reinstallare WordPress. Se avete accesso SSH al server virtuale, utilizzate la riga di comando di WordPress (wp-cli
). Se non avete accesso SSH, scaricate WordPress nel vostro laptop, decomprimete il file, e sostituite tramite cPanel oppure FTP, tutti i file di sistema di WordPress (file della cartella radice, NON sostituire il file wp-config.php
che contiene i parametri di configurazione del vostro sito, cartella wp-admin
e wp-includes
).
4) Eseguire un malware scan
Reinstallato WordPress, eseguite un malware scan tramite un plugin di sicurezza (Wordfence, Sucuri, Ninja malware, ecc.) e magari anche da Internet tramite il sito Sucuri site check (https://sitecheck.sucuri.net)
5) Salvare copia file di log
Tramite accesso SSH oppure richiedendolo al vostro fornitore di Hosting, fate una copia del file di log del server Web (Apache, Nginx o altro).
6) Denunciare l’accaduto
Tramite il comando whois IP_hacker
potete individuare il Maintainer dell’indirizzo IP in questione. Nell’output troverete l’indirizzo email da utilizzare in questi casi (abuse@dominio del maintainer
).
Scrivete un messaggio email ufficiale denunciando l’accaduto con tanto di dettagli tecnici (in particolare file di log). Facendo ricerche mirate su Internet, troverete dei modelli di messaggi da utilizzare.
Nel caso si tratti di un sito di un’azienda italiana, è obbligatorio secondo la normativa della Privacy, segnalare la manomissione al Garante della Privacy. Nel caso di un’azienda estera europea vige la normativa del GDPR, che prevede anche qui la notifica agli enti preposti.
Cosa fare per evitare di essere colpiti
Installazione WordPress
Quando installate WordPress possibilmente scegliete sempre l’installazione automatica (tramite Softaculous nei vari pannelli cPanel o altro).
Se per qualsiasi motivo preferite l’installazione manuale (scaricare il file latest.zip, decomprimerlo e poi collegarvi al sito per avviare l’installazione guidata) vi consiglio caldamente di iniziare ad usare la riga di comando di WordPress (wp-cli) che vi permetterà di automatizzare tutto il processo.
Se proprio non volete impelagarvi con l’ennesimo tool da imparare, oppure non avete accesso SSH al vostro server virtuale, PRIMA di decomprimere il file di installazione, create un file .htaccess
e salvatelo nella cartella radice del vostro sito.
All’interno del file, aggiungete le seguenti direttive:
deny from all
allow from VOSTRO_IP
Sostituite VOSTRO_IP, con l’IP pubblico del vostro router Internet (potete individuarlo collegandovi a questo sito: http://ipinfo.io/ip
Una volta finita l’installazione, non dimenticate di eliminare le direttive di blocco dal file .htaccess
!!
Conclusioni
Dopo quest’analisi approfondita, ho ricontattato il sistemista e gli ho comunicato quanto riscontrato. Gli è venuto in mente allora, che durante l’installazione automatica di WordPress non aveva inserito correttamente le credenziali per l’accesso al database, e quindi la pagina iniziale di setup di WordPress era rimasta disponibile su Internet.
Il tempo di aggiornare i dati all’interno del file wp-config.php
del sito (meno di un minuto…) è bastato perché il sito venisse manomesso in solo 5 secondi!!
Quindi cercate il più possibile di installare WordPress in modo automatico e soprattutto non mi stancherò mai di ripeterlo: monitorate costantemente il vostro sito!