Несколько слов о DDoS-атаках

DDoS-атаки - одна из самых простых форм кибератак, и тем не менее, Интернет все еще борется с ней. По мере того, как Интернет расширяется быстрыми темпами, увеличивается количество устройств IoT. Эти устройства IoT, если они настроены неправильно, могут быть использованы для проведения атак. DDoS-атаки могут вызвать простои компаний, что, в свою очередь, приведет к потере доходов. Важно бороться с DDoS-атаками, чтобы свести к минимуму перерывы в обслуживании, будь то на организационном или частном уровне. Attackalyzer - это сервис, позволяющий любому желающему отправить пакетный захват сетевого трафика. Оттуда захват анализируется на предмет возможных атак. Если будет обнаружена DDoS-атака, будет сообщено как можно больше информации. Такой уровень понимания позволяет легко выявлять атаки и бороться с ними.

Во время моей работы с Privacy Panther, VPN-сервисом, защищенным от DDoS-атак, который был запущен мной и несколькими друзьями, я отвечаю за контроль работоспособности и работоспособности наших серверов. Это включает в себя развертывание решений для решения проблем масштабируемости или кибербезопасности. Излишне говорить, что я отобрал, проверил и заблокировал бесчисленное количество DDoS-атак, нацеленных на нашу компанию. Когда это делается вручную, это может стать очень повторяющейся и утомительной задачей. Моя роль как программиста - автоматизировать рутинные задачи, чтобы улучшить свою жизнь, даже если для этого потребуется больше усилий. Я задумал разработать простой скрипт, который поможет мне агрегировать шаблоны трафика. В качестве неполного примера кода это выглядело примерно так:

capture = rdpcap(file)
ip_addresses = {}
lengths = {}
src_ports = {}
dst_ports = {}
payloads = {}
tcp_flags = {}
for pkt in capture:
 if IP in pkt:
 # We do not have to check whether or not the key exists, because we use get() with a default value of 0,
 # then increment that value by 1
 ip_addresses[pkt[IP].src] = ip_addresses.get(pkt[IP].src, 0) + 1
lengths[len(pkt)] = lengths.get(len(pkt), 0) + 1
transport_pkt = pkt[IP][UDP] if UDP in pkt else pkt[IP][TCP] if TCP in pkt else None
 if transport_pkt:
 src_ports[transport_pkt.sport] =  src_ports.get(transport_pkt.sport, 0) + 1
dst_ports[transport_pkt.dport] = dst_ports.get(transport_pkt.dport, 0) + 1
if TCP in pkt:
 flags_str = transport_pkt.flags
 tcp_flags[flags_str] = tcp_flags.get(flags_str, 0) + 1
if transport_pkt.payload and hasattr(transport_pkt.payload, ‘load’):
 payloads[transport_pkt.payload.load] = payloads.get(transport_pkt.payload.load, 0) + 1

Как видите, агрегированные данные хранятся в словарях Python. Эти данные считываются из файла захвата пакетов с помощью модуля scapy. Это очень упрощенная версия того, что вы можете увидеть как часть системы обнаружения DDoS на основе аномалий, поскольку необычные шаблоны могут указывать на атаку.

Включение подписей

Хотя сценарий, который объединяет атрибуты из этих пакетов, может быть полезен, существует больше возможностей для разработки лучшего решения. Такой подход просто помогает специалисту выполнять свою работу; по-прежнему требуется много ручной работы. Столкнувшись с множеством форм DDoS-атак за последние 2 года, я имел возможность собрать множество образцов трафика. Кроме того, я хотел знать, с какими атаками мы имеем дело каждый раз, поэтому, естественно, мне в голову пришла новая идея. Что, если мы возьмем все эти различные образцы атак и поместим их в базу данных, где последующие пакеты могут быть сопоставлены с ними? У этого есть несколько преимуществ:

  • Мета-информация, такая как названия атак, может храниться вместе с записями.
  • Нам не нужно хранить много информации о предыдущих тенденциях в структуре трафика, чтобы отличить конкретный пакет или набор пакетов от легитимного трафика.
  • В то время как ложные срабатывания часто могут возникать при обнаружении DDoS-атак на основе аномалий, гораздо более высокий уровень точности достигается, если мы можем различать определенные характеристики пакетов, которые никогда не должны быть обнаружены в не вредоносном трафике.

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

+-----------+--------------------+---------------+
|   name    |       protocol     |  source port  |
+-----------+--------------------+---------------+
|    WSD    |         UDP        |     3702      |
|    NTP    |         UDP        |      123      |
| Memcached |         UDP        |     11211     |
+-----------+--------------------+---------------+

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

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

Ускорение процесса

Как вы могли заметить из предоставленного начального фрагмента кода, для обработки пакетов используется Python. Как бы мне ни нравился Python за то, насколько легко читать или быстро писать код, за это удобство действительно приходится платить. Python - это язык программирования высокого уровня, что означает, что он выполняется на более высоком уровне абстракции от ЦП. В свою очередь, код становится менее эффективным. Это становится проблематичным, когда вы должны обрабатывать сотни тысяч пакетов в секунду. В моем случае scapy был неспособен анализировать захват больших пакетов с приемлемой скоростью.

Изучая эталонный тест от libtins, становится очевидным, что… scapy - не самая быстрая библиотека для синтаксического анализа пакетов в Интернете. На самом деле он в 1326 раз медленнее, чем libpcap! Из-за этого я сократил свои потери и переместил исходный код Attackalyzer на C ++ и использовал другую библиотеку синтаксического анализа пакетов. Как вы понимаете, производительность приложения намного выше.

Предложение Attackalyzer как услуги

На этом этапе некоторые люди проявили интерес к приобретению аналогичного программного обеспечения для анализа DDoS-атак. Проект расширился, чтобы не только агрегировать шаблоны трафика и обнаруживать аномалии, но и использовать сопоставление на основе сигнатур. Также были добавлены два других типа обнаружения; один для нацеливания на наводнения, которые злоупотребляют трехэтапным подтверждением TCP (3WHS), такие как SYN-флуды, а другой для обнаружения типичных DoS-атак. Понимая, что конечный результат был очень ценным, не только из-за его явных возможностей, но также из-за тщательной базы данных сигнатур атак, я понял, что никто не сможет выкопать достаточно денег для такого инструмента. Также была необходимость защитить мою интеллектуальную собственность, поскольку была вероятность того, что другие попытаются перепродать или распространить мою работу.

Чтобы решить эти проблемы, на основе программного обеспечения для анализа ядра Attackalyzer был разработан микросервис. Это позволило бы мне создавать пользователей и управлять ими, а также вводить ограничения на использование для предотвращения злоупотреблений. Исходный код был защищен, поскольку доступ ко всему осуществлялся через эту веб-службу. Также имело смысл проводить анализ на машинах, специально предназначенных для этой задачи. Очевидно, что анализ можно выполнить быстрее на более качественном оборудовании. Это конечный продукт для потребителя, поэтому необходимо создавать удобные для потребителя услуги.

Почему это называется потребительским?

Очевидно, что крупные хостинг-провайдеры, предлагающие защиту от DDoS-атак, уже реализуют своего рода обнаружение или анализ DDoS-атак. Это делается на уровне инфраструктуры, обычно выборка пакетов осуществляется с помощью sFlow или других технологий. Есть одна проблема: многие люди хотят знать, что может влиять на их системы, но не у всех есть контроль над сетью или устройствами, ответственными за доставку трафика в их систему. Здесь на помощь приходит Attackalyzer.

Приведенное выше уведомление исходит от Privacy Panther. После обнаружения DDoS-атаки наши VPN-серверы автоматически проверяют ее. Оттуда он отправляется в Attackalyzer через API, где результаты анализа обрабатываются и затем отображаются в предупреждении о DDoS-атаке. Это обнаружение DDoS-атаки может затрагивать инфраструктуру нашего хостинг-провайдера или в некоторых случаях может включать в себя собственное решение. Privacy Panther - лишь один из примеров того, как можно использовать возможности Attackalyzer для автоматического анализа DDoS-атак.