Wykorzystywanie ICMP do zrywania połączeń TCP

Z artykułu dowiesz się jak przetestować swój system operacyjny na wypadek luk w implementacji stosu TCP. Autor zakłada, że posiadasz podstawową wiedzę z zakresu działania i komunikacji w sieciach routowalnych.
Przypomnę..
ICMP - Internet Control Message Protocol - Internetowy Protokół Wiadomości Sterujących - jest protokołem warstwy trzeciej (model OSI).
IP nie ma on wbudowanych procedur zapewniających dostarczenie danych w sytuacji, gdy wystąpią problemy z komunikacją sieciową. Jeśli awarii ulegnie urządzenie pośredniczące, na przykład router, lub jeśli urządzenie docelowe zostanie odłączone od sieci, dane nie zostaną dostarczone. Poza tym nie ma w podstawowych założeniach protokołu IP żadnego mechanizmu umożliwiającego poinformowanie nadawcy o niepowodzeniu transmisji danych. Z tego powodu właśnie wprowadzono ICMP.
Pakiet ICMP składa się z kilku głównych pól: Typ, Kod, Suma kontrolna oraz Dane ICMP- różne w zależności od typu komunikatu. Specyfikacja ICMP znajduje się w RFC 792. Dla przykładu program 'ping' wysyła pakiet "ICMP echo request" - typ 8, a odbiera "ICMP echo reply" - typ 0.
W artykule przedstawie jak można wykorzystać wspomniany protokół do sprawdzenia podatności swojego systemu na błędną implementacje stosu protokołu wyższej warstwy - TCP.
Do testów wykorzystamy pakiet ICMP typ 3 (destination unreachable), kod 2 (protocol unreachable).
Aby przeprowadzić eksperyment, potrzebujemy dwóch komputerów programu netcat(również pod Windows) oraz programu SING(Send ICMP Nasty Garbage) - http://sourceforge.net/projects/sing SING przeznaczony jest do wysyłania praktycznie każdego rodzaju pakietów ICMP. Musimy wykorzystać także sniffer, aby określić port źródłowy połączenia, np: ethereal. Idealnym środowiskiem dla w/w programów jest Linux, np: Gentoo, Slackware.
Aby zerwać połączenie TCP między dwoma komputerami przy pomocy ICMP musimy znać IP i porty obu komputerów między którymi jest nawiązane połączenie TCP.
Do dzieła...
IP1: 10.0.0.10 - Linux IP2: 10.0.0.20 - Windows
Uruchamiamy na naszym komputerze(Linux) skrypt w bashu:
#!/bin/sh for TMP in `seq 1 99999`; do echo $TMP #Skrypt wyświetla co sekunde kolejna liczbę z przedziału 1-99999 sleep 1; done
oraz przekierowujemy jego strumien wyjściowy do Netcata, poleceniem:
$ ./skrypt.sh | nc -l -p 31337
Netcat będzie nasłuchiwał na porcie 31337.
Teraz na naszym testowanym komputerze musimy połączyć się z Linux'em.
C:\>nc 10.0.0.10 31337
Jeżeli połączenie zostało nawiązane, powinniśmy zobaczyć na ekranie kolejne liczby przesyłane z skrypt.sh.

Uruchamiając sniffer'a możemy zobaczyć jak w sieci zostało nawiązane połączenie. Teraz musimy uruchomić naszego Ethereal. Jak widać połączenie zostało nawiązane. Musimy jednak określić port źródłowy połączenia. Widoczny on jest na początku kolumny 'Info' na wysokości adresów IP naszego połączenia. Określiliśmy np, że port źródłowy połączenia to 1122. Teraz już mamy wszystkie dane potrzebne do zerwania połączenia, przypomnę:
IP1: 10.0.0.10: 31337 IP2 10.0.0.20: 1122
Zrywamy połączenie...
Używamy do tego celu programu SING, poleceniem:
# sing -du -prot-unreach -psrc 1122 -orig 10.0.0.10 -pdst 31337 10.0.0.20
- -psrc <port_źródłowy> - port źródłowy połączenia, w naszym wypadku port 1122
- -pdst
- port docelowy połączenia, u nas 31337 - -orig
- IP docelowe połączenia - 10.0.0.20 - IP źródłowe połączenia
Należy pamiętać, że przy tak podanych danych, Windows otrzyma pakiet którego nadawcą jest Linux.
Po wysłaniu pakietu ICMP przy pomocy w/w polecenia widzimy, że Ethereal zanotował pakiet taki jak nadaliśmy. Pora zobaczyć co się stało z połączeniem. Jeżeli widzimy na Windows'ie kolejne wyświetlające się kolejne cyferki, to możemy być pewni, że ten rodzaj ataku nas nie obezwładni. Natomiast jeżeli widzimy znak zachęty, to znaczy, że połączenie zostało zerwane.
Zabezpieczenie...
Obrona przed tym atakiem jest możliwa i stosunkowo prosta. Najprostszym zabezpieczeniem Windows'a jest zainstalowanie odpowiedniej łatki. Ten typ i kod pakietu ICMP można także wyfiltrować na firewall'u, jednak nie zawsze jest to możliwe, gdyż może spowolnić działające usługi w sieci, np. Sendmail'a i używany przez niego port 113. Generalnie nie ma na to uniwersalnej metody, jednak myślę, że po poznaniu zagrożenia, każdy administrator sieci jest w stanie dopasować zabezpieczenia do zarządzanej przez siebie infrastruktury sieci.
Podatne systemy Microsoftu:
- Microsoft Windows 2000 Service Pack 3 and Microsoft Windows 2000 Service Pack 4
- Microsoft Windows XP Service Pack 1 and Microsoft Windows XP Service Pack 2
- Microsoft Windows XP 64-Bit Edition Service Pack 1 (Itanium)
- Microsoft Windows XP 64-Bit Edition Version 2003 (Itanium)
- Microsoft Windows Server 2003
- Microsoft Windows Server 2003 for Itanium-based Systems
Łatki do tych systemów można sciągnąć przez link:
http://www.microsoft.com/technet/security/bulletin/MS05-019.mspx
Odporne systemy Microsoftu:
- Microsoft Windows Server 2003 Service Pack 1
- Microsoft Windows Server 2003 with SP1 for Itanium-based Systems
- Microsoft Windows Server 2003 x64 Edition
- Microsoft Windows XP Professional x64 Edition
Podsumowanie...
Opisany atak można wykorzystać do zerwania praktycznie każdego połączenia TCP co może być groźne dla poprawnego funkcjonowania sieci. To, że nie jesteśmy żadną ze stron połączenia które chcemy zerwać nie stoi na przeszkodzie aby takie połączenie było przez nas zerwane.-Jest to bardzo istotne zagrożenie. Wiedząc jakie połączenie chcemy zerwać i między kim, oznacza, że znamy oba adresy IP oraz port docelowy połączenia TCP. Nieznajomość portu źródłowego nie jest przeszkodą, gdyż możemy napisać prosty skrypt w bash'u próbujący przyjąć pokolei każdy port źródłowy z danego zakresu. Zakresy te w wiekszości Windows'ów są powszechnie znane.
W artykule specjalnie nie zamieszczałem oczywistych szczegółów, gdyż nikomu z nas nie potrzeba dodatkowych problemów ze Script Kiddies.
Aby dodawać komentarze musisz być zalogowany!
