Стресс тестирование с использованием DNS Amplification DDoS

DNS Amplification это один из видов DDoS атак, который основан на усилении атаки с помощью сторонних, легитимных, DNS серверов. Принцип атаки построен на том, что злоумышленник создаёт короткий запрос к стороннему DNS серверу, но этот запрос отправляется от имени жертвы (IP spoofing, протокол UDP не проверяет отправителя), а DNS сервер отправляет ответ в сторону жертвы, который в несколько раз больше запроса. Это и позволяет провести атаку DNS Amplification, увеличив объём трафика в разы с помощью чужих DNS серверов.

В рамках нагрузочного тестирования можно извлечь из данной атаки пользу. Например для проверки оборудования, которое должно защищать от DoS атак. Естественно для этого в качестве усиливающих DNS серверов нужно использовать только те сервера, владельцы которых дали согласие на подобное «использование» их серверов.

Для проведения тестирования нам потребуется:

  • Рабочая станция с установленной ОС Linux (в примерах используется Linux Debian);
  • Python 2.x;
  • Scapy;
  • Внешний IP адрес(проведение тестирования не возможно через NAT, т.к. UDP пакеты с подменённым адресом будут отфильтрованы при передаче их через NAT).

Поставим все требуемые пакеты:

Теоритическая часть

Для начала, попробуем вручную сделать несколько запросов к DNS серверу, для этого запустим утилиту манипулирования пакетами — Scapy (пакеты нужно отправлять из-под root пользователя):

Сформируем пакет с DNS запросом:

Использованные параметры:
Секция IP.
dst — получатель пакета;
Секция UDP (используются UDP пакеты).
sport — порт отправителя;
dport — порт получателя;
Секция DNS.
rd — требуется рекурсия;
qnameDNS запрос;
qtype — тип DNS запроса.

Отправим его:

sr1 — отправить один пакет и ждать ответа.

В мы получили ответ от DNS сервера с которым можем ознакомиться.

Теперь посмотрим размер отправленного запроса и полученного пакета, для этого получим ответ в переменную, а не в STDOUT:

Сравним размеры пакетов.
Отправленный пакет:

Полученный пакет:

Мы получили ответ в 2,71 (152/56) раза больше чем запрос.

Если мы найдем маленький запрос с большим ответом, то коэффициент может получиться гораздо больше (10 и более раз).
DNS запросы с большим размером пакета:

  • запрос корневой зоны DNS (.);
  • запрос доменного с множеством «A» записей (A);
  • запрос больших «TXT» записей;
  • и т.д.

Другие варианты запросов вы можете поискать самостоятельно.
В случае успешно подобранного запроса мы получим разницу в 11 раз (из потока в 10 мб/с мы можем получить 110 мб/с, но правда часть уйдёт на накладные расходы так что коэффициент усиления будет немного ниже). На этом и строится атака DNS Amplification.

Теперь нужно проверить не блокирует ли нас DNS сервер после множественных запросов (это один из методов защиты). Для этого сделаем отправку 500 пакетов без ожидания ответа и после этого отправим контрольный пакет с ожиданием ответа.

Отправка 500 пакетов:

Использованные параметры:
send — отправить без ожидания;
inter — интервал между отправкой пакетов (0-минимальный);
verbose — без отображения;
count — количество пакетов.

Отправляем контрольный пакет:

Использованные параметры:
timeout — время ожидания ответа в секундах.

Если сервер ответил то, скорее всего, он может использоваться для DNS Amplification.

Остается сделать последний штрих. Отправить пакет с поддельным IP адресом в заголовке, чтобы ответы пришли тестируемому серверу, а не нам.

для этого создадим новый пакет:

Использованные параметры:
srcIP адрес отправителя.

и запускаем отправку пакетов (отправка пакетов с поддельным отправителем должна производиться с устройства имеющего внешний IP адрес, потому что NAT будет блокировать отправку с неизвестных IP адресов):

Использованные параметры:
loop — бесконечная отправка пакетов.

Остановить отправку можно с помощью комбинации CtrlC.

У нас получилось создать усиление нашего трафика в 2,71 раза с помощью DNS Amplification.

Автоматизация процесса

Нужно автоматизировать 3 процесса:

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

Для автоматизации я написал 3 скрипта.

Скачать их можно на GitHub (https://github.com/BlackDiverX/DNSAmplification):


dnsamplscan.py
— скрипт сканирования сети для поиска уязвимых DNS серверов;
dnsamplcheck.py — скрипт проверки DNS серверов на возможность DNS Amplification;
dnsamplification.py — скрипт для многопоточной отправки DNS запросов с возможностью спуфинга IP адреса.

dnsamplscan.py

dnsamplscan.py сканирует сегмент сети и создает список серверов с большим коэффициентом усиления.

Синтаксис:

Параметры:
-ip — диапазон IP адресов для поиска DNS серверов;
-queryDNS запрос (По умолчанию: .) (требуется);
-querytype — тип DNS запроса (A,MX,PTR и т.д.) (По умолчанию: A);
-timeout — время ожидания ответа от DNS сервера (По умолчанию: 10 сек.);
-aratio — требуемый коэффициент усиления (По умолчанию: 0);
-output — файл со списком найденных серверов (требуется).

Пример запуска:

На выходе мы получим файл servers.txt со списком серверов у которых DNS ответ в разы больше чем запрос.

dnsamplcheck.py

dnsamplcheck.py проверяет список серверов на возможность использования для DNS Amplification.

Синтаксис:

Параметры:

-input — входной файл со списком DNS серверов для проверки (требуется);
-timeout — время ожидания ответа от DNS сервера (По умолчанию 2 сек.);
-output — выходной файл со списком проверенных серверов (требуется).

Пример:

Этот скрипт возьмет список серверов из файла servers.txt (который создан с помощью скрипта dnsamplscan.py), проверит на возможность использования в DNS Amplification и запишет подходящие сервера в файл good-servers.txt.

dnsamplification.py

dnsamplification.py запускает нагрузочное тестирование с использованием DNS Amplification. Для проведения атаки требуется список серверов.

Синтаксис:

Параметры:

-targetIP адрес тестируемого сервера (требуется);
-servers — файл со списком DNS серверов для усиления (требуется);
-timeout — время тестирования (в секундах) (По умолчанию: 10 сек.);
-threads — количество потоков для отправки DNS запросов (По умолчанию: 10).

Пример:

Непосредственное начало атаки для стресс тестирования. В примере запускается тестирование в 20 потоков для адреса 192.168.1.2 с использованием серверов из файла good-servers.txt на 100 секунд.

Не стоит использовать чужие DNS сервера для проведения тестирования. Используйте для этого только сервера, которые разрешили использовать их владельцы.

Заказать Аудит Безопасности или Пентест Вашей IT-инфраструктуры

Быть уверенным в своей IT-инфраструктуре — это быть уверенным в завтрашнем дне.

Для того, чтобы сделать заказ:

Заполните форму обратной связи и мы обязательно с вам свяжемся:
Форма обратной связи
Позвоните нам по телефону:
+7(909)952-44-33
Напишите нам на электронную почту:
order@blackdiver.net
Напишите нам в Telegram:
Telegram
Другие способы связи Вы сможете найти в разделе Контакты.