Распределенные атаки на отказ в обслуживании, которым подвергаются популярные сайты обычно происходят с тысяч и тысяч взломанных устройств. Эти атаки в основном направлены на подавление целевой системы масштабным трафиком, забиванием канала связи. Эти атаки относятся к layer 3 (сетевой уровень модели ISO/OSI) DoS/DDoS и характеризуются большим количеством пакетов, которыми атакуется ресурс. Layer 7 (прикладной уровень модели ISO/OSI) DoS/DDoS обычно направлен на "слабые" места веб-приложения.


Для начала приведу немного статистики из исследования компании Incapsula — начиная с 2016 года DoS/DDoS атаки на прикладном уровне превалируют над классическими атаками на отказ от обслуживания на сетевом уровне:


image

Сложность в определении таких атак в том, что веб-приложение не может легко отличить атаку от обычного трафика. Есть много факторов, которые способствуют этой трудности, но одним из наиболее важных является то, что по ряду причин IP-адреса не могут быть полезны в качестве идентификационных данных. При сетевой атаке можно различить нелегитимный трафик и заблокировать атакующие IP-адреса, в случае атак на уровень приложений это сделать затруднительно: необходимо определить именно атакующие признаки, не заблокировав легитимных пользователей. Также, простое использование ресурса (без атак), может привести к исчерпанию его ресурсов — это может быть известный здесь многим Хабраэффект.


Основные типы DoS/DDoS атак:


Volumetric: объемные атаки нацелены на переполнение полосы пропускания веб-приложения хостинговой инфраструктуры, направляя большие объемы сетевого трафика. Обычно такой трафик представлен UDP/ICMP флудом.


Layer 3: эти атаки нацелены на недостатки архитектуры стека протоколов TCP. Атакующий отсылает пакеты, предназначенные для переполнения, искажения или разрушения информация о состоянии соединения, вызывающие дополнительную работу для функций сетевой обработки на целевом устройстве и замедлении ответов. Наиболее распространенными векторами таких атак является TCP SYN flood, фрагментация TCP, teardrop и т.д.


Layer 7: эти атаки ориентированы на логику веб-приложения и нацелены на исчерпание ресурсов веб-сервера при обработке "тяжелых" запросов, интенсивных функций обработки или памяти.


Ресурсы приложения


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


Основные проблемы выглядят следующим образом: утилизация CPU — использование 99% CPU заставляет другие критические процессы останавливаться; RAM — недопустимое распределение памяти, утечки, исчерпание памяти — недостаток для других критичных процессов; процессы и потоки — deadlock (заморозка процессов), форки, race condition (состояние гонки); диск — переполнение диска.


Одним из важных ресурсов веб-сервера является RAM. Атаками на исчерпание этого ресурса могут быть следующие:


Рекурсия. Вот неплохой пример рекурсивного кода — include('current_file.php'). PHP выделяет новую память для каждого включения и повторяет процесс до тех пор, пока не останется памяти. Эту уязвимость можно обнаружить в виде классического LFI (local file inclusion).


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


XML-бомбы. Именованные сущности могут раскрываться не только в символьные строки, но и в последовательности других сущностей. Рекурсия запрещена стандартом, но ограничений на допустимую глубину вложенности нет. Это позволяет добиться компактного представления очень длинных текстовых строк (аналогично тому, как это делают архиваторы) и составляет основу атаки «billion laughs».


Десереализация. Сравнительно новый тип атак, но достаточно серьезный, что внесен в OWASP TOP 10 2017 A8-Insecure Deserialization. Представляет из себя процесс восстановление начального состояния структуры данных из битовой последовательности. При ненадлежащем контроле пользовательского ввода может привести к исчерпанию ресурсов.


Файловые заголовки. Манипулирование значениями файловых заголовков может привести к исчерпанию ресурсов. Если вычисление выполняется во входном файле, где размер файла находится в его заголовке. Это могут быть изображения, видеофайлы, документы и т.д. Пример — pixel flood attack.


Чтение бесконечных потоков данных. Чтение /dev/zero или /dev/urandom через LFI, использование 1TB speedtest и т.д.


Немаловажным параметром веб-сервера является CPU, атаки на исчерпание процессорных мощностей могут привести к неработоспособности веб-приложения.


reDOS — Regular Expression Denial of Service. Сравнительно свежий тип атаки, впервые был выявлен на Stackoverflow. Это была не атака злоумышленника, а действия пользователя, который включил 20 000 пробельных символов в фрагмент кода. Регулярное выражение было написано таким образом, что оно заставляло систему проверять строку из 20000 символов на в 200.010.000 шагов (20 000 + 19 000, +… + 2 + 1). Если веб-приложение позволяет использовать регулярные выражения — стоит тщательно проверять входящие данные.


SQL-инъекции. Эксплуатация SQL-инъекций может значительно снизить работоспособность веб-приложения, особенно при использовании функций типа sleep, benchmark и т.д.


Форк-бомбы. Процессы, которые повторяются снова и снова, используя все ресурсы системы. Наиболее известной является :(){ :|:& };:.


Злоупотребление ресурсами/функциями. Злоумышленник может выявить ресурсоемкую операцию на веб-приложении и послать множество запросов исчерпание ресурсов. Таким примером может служить злоупотребление функциями хэширования паролей.


SSRF. Эксплуатация server side request forgery уязвимостей может позволить злоумышленнику исчерпать ресурсы атакуемого веб-сервера.


Дисковое пространство также является критичным параметром веб-сервера.


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


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


Утилиты для тестирования веб-приложений:


Я намеренно не буду рассматривать узкоспециализированные утилиты типа LOIC/HOIC, нацеленные как правило на дестабилизацию работу определенных веб-приложений.


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


Slowloris — довольно известная утилита для тестирования. Существует nse скрипт для nmap.


HULK (HTTP Unbearable Load King) — генерирует большой поток уникальных запросов, который максимально потребляет ресурсы веб-сервера. Чтобы осложнить задачу по фильтрации потока, HULK для каждого запроса подставляет разные user agent, обфусцирует referrer, использует в запросах атрибуты no-cache и keep-alive, а также уникальные URL.


OWASP DoS HTTP POST — утилита от консорциума OWASP для генерации "медленных" http запросов.


GoldenEye HTTP Denial of Service Tool — эксплуатирует векторы HTTP Keep Alive + NoCache.


Превентивные меры защиты


Хорошей практикой превентивной защиты веб-приложения будет нагрузочное тестирование веб-ресурса. Для исследования времени отклика системы на высоких или пиковых нагрузках производится "стресс-тестирование", при котором создаваемая на систему нагрузка превышает нормальные сценарии её использования.


Основная цель нагрузочного тестирования заключается в том, чтобы, создав определённую ожидаемую в системе нагрузку (например, посредством виртуальных пользователей или их действий), наблюдать за показателями производительности системы. Это позволит выявить и усилить узкие/слабые места вашего веб-приложения и избежать возможных рисков недоступности приложения в будущем.

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


  1. namikiri
    26.01.2018 13:35

    Дополню, пожалуй, список утилит для тестирования самой, на мой взгляд, удобной — slowhttptest.