Photo by Sora Shimazaki from Pexels

Premessa, un web server compromesso

Tra le mansioni che ho, a volte devo intervenire per sistemare e ripulire web server compromessi. Normalmente ciò avviene a causa di versioni obsolete di librerie o delle piattaforme CMS su cui poggiano i vari siti web. Nel caso odierno voglio portare come esempio un web server che ospita più siti web in cui sono stati trovati malware PHP e codice JS dannoso all’interno delle pagine iniettato direttamente nel database.

La particolarità sta nel fatto che, a quanto è emerso, uno dei siti pare sia stato usato come vettore iniziale. Purtroppo, a causa di una svista da parte di chi ha configurato il sistema, tutti i siti avevano le stesse credenziali di accesso al database, pertanto l’attaccante, una volta compromesso il primo sito, presto ha fatto ad inserire dati anche nei database relativi agli altri siti web.

Nello specifico era stato iniettato codice HTML con link spam e codice JS usato probabilmente per tecniche Black Hat SEO.

Cosa si dovrebbe fare in questi casi

Non potendo sapere con esattezza la portata del danno, la prassi sarebbe quella di creare e configurare un nuovo server nel quale ripristinare un database pulito, applicare tutte le patch di sicurezza disponibili e, soprattutto, adottare una politica di gestione password più attenta.

Cosa ho dovuto fare

Per svariati motivi ho concordato con il cliente di effettuare un intervento tampone, ripulendo il codice identificato sia nel file system che nel database ed incaricando l’IT del cliente nell’aggiornare il sistema e le password nella speranza che non ci siano altri vettori di ingresso nascosti da qualche parte.

Come l’ho fatto

A questo punto mi sono trovato con numerosi database contenenti dati sporchi e poco tempo per ripulirli. Così, dopo aver identificato i due pattern del codice HTML e JS da eliminare, ho preferito agire in modo molto semplice con alcuni script.

Per prima cosa ho effettuato un dump di tutti i database presenti nel server. Purtroppo non conosco nessun comando che in autonomia effettui il dump di un database MariaDB creando un file singolo per ciascun database, quindi ho usato uno script molto semplice per ottenere tali file:

$ mysql -N -e 'show databases' \
    -u UTENTE --password=PASSWORD | \
    while read dbname; \
    do mysqldump --complete-insert --routines --triggers \
    -u UTENTE --password=PASSWORD --single-transaction \
    "$dbname" > "$dbname".sql; done

In pratica per prima cosa prendo l’elenco dei database, e poi, per ciascuno, lancio il comando mysqldump per effettuarne il dump.

A questo punto, essendo stata alterata solo una tabella, e sempre la stessa, all’interno di tutti i database, per velocizzare le operazioni ho preferito estrapolare solo tale tabella in modo da ripulirla e reinserirla nel database.

A partire da un dump SQL, per estrarre una singola tabella basta il comando sed che ho scritto nell’articolo dedicato :

$ sed -n -e '/DROP TABLE.*`tabell/,/UNLOCK TABLES/p' nome_file_tabella.sql

Quindi con il comando perl (ma potevo usare anche sed) ho eliminato le stringhe che non volevo con un comando più o meno così:

$ perl -pe 's/<script>.*?<\/script>//g' nome_file_tabella.sql > nome_file_tabella_pulita_parziale.sql

ed uno così:

$ perl -pe 's/<span class=\\"keys_words.*?<\/span>//g' nome_file_tabella_pulita_parziale.sql > nome_file_tabella_pulita.sql

Ed infine ho eseguito lo script nome_file_tabella_pulita.sql con il client mysql:

$ mysql -u UTENTE --password=PASSWORD nome_database < nome_file_tabella_pulita.sql

Riassumendo, lo script finale per la pulizia dei dump SQL ed il ripristino delle tabelle l’ho scritto concatenando opportunamente i comandi appena visti:

for dbname in *.sql;
do
    echo 'Pulizia '$dbname' ...';
    sed -n -e '/DROP TABLE.*`tabella/,/UNLOCK TABLES/p' $dbname | perl -pe 's/<script>.*?<\/script>//g' | perl -pe 's/<span class=\\"keys_words.*?<\/span>//g' > $dbname'__tabella__clean.sql'
    NAME=`echo "$dbname" | cut -d'.' -f1`
    mysql -u UTENTE --password=PASSWORD $NAME < $dbname'__tabella__clean.sql'
done

Ovvie conclusioni sulla sicurezza informatica

La sicurezza dei sistemi informatici coinvolge molti aspetti sia tecnologici che di gestione. Ad esempio le password policy vanno rispettate, non solo definite, il sistema operativo ed i sofware devono essere aggiornati, e quando si raggiunge l’End Of Life (EOL) non si deve aspettare di essere bucati per fare un aggiornamento ad un sistema più moderno.

Purtroppo devo anche ammettere che in molti casi mancano proprio le risorse (umane ed economiche) per fare in modo che la sicurezza informatica sia un aspetto seguito a dovere.

Però ciò non toglie che al giorno d’oggi tenere puliti ed aggiornati i sistemi informatici is the new lavarsi i denti dopo aver mangiato.

Non si può più sottostimare l’importanza della sicurezza informatica visto che sul web viaggiano costantemente tutte le informazioni delle nostre vite, flussi finanziari, notizie che possono influire e modificare decisioni personali e politiche.

Se mancano risorse si deve fare in modo di trovarle da qualche parte. A partire dai sistemi governativi, fino al semplice server di un negozio o di una agenzia viaggi.

Tenere puliti ed aggiornati i sistemi informatici is the new “Lavarsi i denti tutti dopo mangiato”

Leonardo Finetti

Leonardo Finetti
Si occupa di informatica dalla metà degli anni novanta principalmente in ambito web con tecnologie Open Source. Esperto di Drupal e di SEO offre consulenze in tali ambiti e nel tempo libero si diletta scrivendo articoli di informatica ed anche di design, ergonomia, usabilità e sicurezza.

Se ti piace questo sito puoi usare il link di affiliazione Amazon cliccando qui.