Analisi di un plugin malevolo di WordPress
In questo articolo andremo ad analizzare un tipico plugin malevolo per WordPress. Scopo dell'analisi è individuare per tempo questo tipo di minacce ed intervenire tempestivamente sul sito compromesso.
L'attacco
Questo tipo di plugin solitamente viene generato automaticamente a seguito di un exploit da remoto eseguito con successo su un plugin o un tema vulnerabile. Poiché l'utenza che esegue PHP ha permessi di lettura e scrittura sulla directory /wp-content/plugins, viene creata una directory con un nome che può contenere il prefisso wp- allo scopo di spacciarsi per un plugin legittimo.
All'interno di questa directory si troverà il file PHP principale del plugin, spesso anch'esso con il prefisso ingannevole wp- . A questo punto il plugin malevolo è stato installato ed è immediatamente attivo sul sito compromesso.
Mimetismo
Il codice PHP del plugin si divide in due parti:
Creazione e gestione di una web shell
Rimozione visuale dello stesso plugin dall'elenco dei plugin mostrato in
/wp-admin.
Il tentativo di mimetizzarsi di questo plugin si concretizza sfruttando la action di WordPress pre_current_active_plugins, un hook che viene eseguito prima che venga generata la tabella dei plugin installati nella dashboard di WordPress.
Il plugin non deve fare altro che rimuovere se stesso dall'array delle voci presenti:
function WPD_Plugin() {
global $wp_list_table;
$hidearr = array('wp-evil/wp-evil.php');
$myplugins = $wp_list_table->items;
foreach ($myplugins as $key => $val) {
if (in_array($key,$hidearr)) {
unset($wp_list_table->items[$key]);
}
}
}
add_action('pre_current_active_plugins', 'WPD_Plugin');
In questo modo il plugin potrà essere individuato solo a livello di file system.
Web shell
Questo tipo di plugin è concepito per essere usato da remoto come web shell. Chi ha compromesso il sito invia una serie di richieste HTTP POST verso l'URL assoluto del plugin (ad esempio https://sito.tld/wp-content/plugins/wp-evil/wp-evil.php). Ciascun parametro annesso a queste richieste rappresenta un comando che viene eseguito dal codice PHP del plugin.
Per essere certi che la web shell sia sempre attiva, la routine della sua gestione viene associata all'hook radice di WordPress, init.
function WPD_init(){
// Gestione web shell
}
add_action('init', 'WPD_init');
Così facendo la routine della web shell è di fatto legata all'intero ciclo di esecuzione di WordPress, con danni facilmente immaginabili.
Ripristino
Cancellare il plugin dal file system.
Modificare le credenziali di accesso a WordPress.
Modificare le credenziali di accesso FTP.
Modificare le credenziali di accesso al database.
Esaminare il database se si sospetta che siano stati inseriti contenuti malevoli.
Aggiornare WordPress.
Aggiornare i temi.
Aggiornare i plugin.
Se necessario, modificare le credenziali di accesso al pannello di hosting o al server.
Effettuare una scansione antimalware sull'intero spazio web del sito.
Verificare che il plugin non abbia modificato ulteriormente il file system aggiungendo altri file e directory non solo all'interno della directory
/wp-content.
Conclusione
I punti da 6 a 8 rappresentano la fase di prevenzione che andrebbe sempre posta in essere quando si gestiscono siti in WordPress. Ometterla vuol dire di fatto esporsi a dei rischi non facilmente calcolabili.