wordpress-brute-force

WordPress – Attacco brute force su xmlrpc.php

Indice dei contenuti

Attacco brute force su siti WordPress: vediamo insieme come proteggerci

[Aggiornamento articolo marzo 2017] WordPress è senza ombra di dubbio il cms più utilizzato, a partire da semplici siti di presentazione fino a progetti molto complessi. La sua popolarità lo ha reso però soggetto a diverse vulnerabilità.

Noi di Seeweb consigliamo di aggiornarlo sempre all’ultima versione facendo attenzione a tutti i temi e ai plugin installati, molto spesso questi ultimi portano con sé dei bug che risultano essere i responsabili di intrusioni. La prevenzione quindi, intesa come mantenimento del software aggiornato, in questi casi è la migliore cura.

In questo articolo però, vogliamo parlarvi di un altro problema molto comune, un attacco specifico che incide sul carico del server fino a renderlo inusabile: l’attacco brute force verso il file xmlrpc.php

Cosa è e quali funzionalità offre xmlrpc.php?

Il file xmlrpc.php è un file presente in tutte le versioni di WordPress ed è abilitato di default.

E’ il file responsabile delle chiamate RPC e sostanzialmente permette di accedere al sito tramite le applicazioni sviluppate per i dispositivi mobili di richiamare le funzioni di Pingback.

Qual è lo scopo dell’attacco?

Sicuramente quello di scovare le credenziali di accesso al sito, originariamente questo tipo di attacco veniva eseguito verso il file wp-login.php, l’evoluzione di questo attacco ha portato a far si che venga utilizzato il file xmlrpc.php in quanto l’attacco risulta più performante e più difficile da individuare.

wordpress

Quali sono gli effetti collaterali dell’ attacco?

Ci sono due effetti collaterali: il primo riguarda l’accesso al sito, il secondo è legato all’impatto dell’attacco sul server.

Poichè ad ogni chiamata viene invocato lo stack apache-php-mysql, ogni risposta è molto onerosa e può portare a un socraccarico del server rendendo inutilizzbile il sito o addirittura tutti i siti presenti sul server.

Perchè è possibile utilizzare xmlrpc.php per eseguire un attacco brute force sul sito?

L’attacco è attuabile poichè diverse chiamate rpc richiedono l’autenticazione. In particolare è possibile utilizzare il metodo wp.getUsersBlogs per autenticarsi. Di seguito un esempio di xml utilizzato per invocare il metodo in questione.

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
  <methodName>wp.getUsersBlogs</methodName>
  <params>
   <param><value>admin</value></param>
   <param><value>password</value></param>
  </params>
</methodCall>

Un xml di questo tipo viene spesso utilizzato da un malintenzionato per provare ad autenticarsi a WordPress, viene richiamato il metodo wp.getUsersBlogs e vengono passati i parametri username e password.

E’ possibile fare un veloce test di chiamata utilizzando curl:

curl -vd '<?xml version="1.0" encoding="iso-8859-1"?><methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value><string>admin</string></value></param><param><value><string>password</string></value></param></params></methodCall>' www.***************.it/xmlrpc.php

In questo caso la risposta del webserver sarà:

> POST /xmlrpc.php HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.********.it
> Accept: */*
> Content-Length: 231
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 200 OK
< Date: Wed, 16 Sep 2015 19:43:35 GMT
< Server: Apache/2.4.7
< X-Powered-By: PHP/5.5.9-1ubuntu4.6
< Connection: close
< Content-Length: 405
< Vary: Accept-Encoding
< Content-Type: text/xml; charset=UTF-8
<
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>403</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>Username o password non corrette.</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>
* Closing connection #0

C’è da notare che Apache risponde con codice 200 (OK) anche se nella riposta della chiamata nel valore value c’è il codice di errore 403 (Forbidden) questo perchè in questo caso abbiamo sbagliato username e password.

Nel caso in cui ci si autentichi correttamente la risposta alla medesima chiamata è:

<methodResponse>
  <params>
    <param>
      <value>
      <array><data>
  <value><struct>
  <member><name>isAdmin</name><value><boolean>1</boolean></value></member>
  <member><name>url</name><value><string>http://www.********.it/</string></value></member>
  <member><name>blogid</name><value><string>1</string></value></member>
  <member><name>blogName</name><value><string>Nome Cognome</string></value></member>
  <member><name>xmlrpc</name><value><string>http://www.******.it/xmlrpc.php</string></value></member>
</struct></value>
</data></array>
      </value>
    </param>
  </params>
</methodResponse>

Come è possibile verificare se si è stati attaccati?

Potete verificare direttamente se siete stati vittime di questo attacco analizzando i file di log del vostro sito, per i webserver Apache su linux il comando per visualizzare le chiamate in questione è:

egrep -e 'POST.*xml' access_log

Se avete come risultato una serie molto veloce di chiamate verso il file xmlrpc.php, come vi riportiamo di seguito, allora il vostro sito web è stato attaccato.

123.xxx.xxx.xxx - - [16/Sep/2015:10:30:13 +0200] "POST /xmlrpc.php HTTP/1.1" 200 688 "-" "-"

123.xxx.xxx.xxx - - [16/Sep/2015:10:30:13 +0200] "POST /xmlrpc.php HTTP/1.1" 200 688 "-" "-"

123.xxx.xxx.xxx - - [16/Sep/2015:10:30:14 +0200] "POST /xmlrpc.php HTTP/1.1" 200 688 "-" "-"

123.xxx.xxx.xxx - - [16/Sep/2015:10:30:14 +0200] "POST /xmlrpc.php HTTP/1.1" 200 688 "-" "-"

Come difendersi?

In questo caso il metodo più rapido per bloccare l’attacco, ammesso che non siate interessati alle funzionalità offerte da xmlrpc.php, è quello di inibire l’accesso al file inserendo nel file .htaccess di WordPress le seguenti direttive:

<Files xmlrpc.php>
order deny,allow
deny from all
</Files>

Oppure si può specificare che il file sia richiamabile solo da determinati ip inserendo la direttiva “allow from ” come illustrato di seguito (con XXX.XXX.XXX.XXX è necessario sostituire il proprio ip):

<Files xmlrpc.php>
order deny,allow
deny from all
allow from XXX.XXX.XXX.XXX
</Files>

In questo caso  continueranno ad arrivare al server web le richieste ma questo risponderà con il codice di errore 403 (Forbidden) senza richiamare lo stack apache-php-mysql e quindi senza sovraccaricare il server.

Se invece si è interessati ad utilizzare le funzionalità offerte da xmlrpc.php, la soluzione migliore è quella di installare e configurare fail2ban.

Con fail2ban è possibile analizzare i log di accesso al sito e bannare gli ip che stanno eseguendo molte chiamate verso xmlrpc.php, la sua configurazione dipende dal sistema operarativo e dalla configurazione del server, in rete è presente molto materiale al riguardo. Nel caso siate interessati ,il nostro reparto tecnico è disponibile ad una installazione personalizzata di fail2ban.

Per i dettagli inerenti xmlrpc.php potete consultare il manuale online:

https://codex.wordpress.org/XML-RPC_Support

https://codex.wordpress.org/XML-RPC_WordPress_API

CONDIVIDI SUI SOCIAL

2 risposte

  1. Io ho risolto il problema con il plugin gratuito per WordPress ( Authentication and xmlrpc log writer ) e implementando sul mio server fail2ban. Niente più problemi di questo tipo. Il plugin è altresì utile per preservare le perfomance del server in quanto blocca i tentativi multipli di accesso in una singola chiamata xmlrpc.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

9 + 1 =