SIK10.rst

Sieci Komputerowe

Ataki sieciowe

DDos

Atak DoS (ang. Denial of Service) jest to atak polegający na odcięciu zasobów takich jak serwer sieciowy/ serwis sieciowy etc. Zwykle wykonany poprzez wykonanie ogromnej liczby zapytań w tym samym czasie, co powoduje crash serwera lub jego spowolnienie. Wyróżniamy dwa typy ataków

DoS - wykonany przez pojedynczy komputer.
DDos (Distributed DoS) - wykonane przez grupę komputerów często zainfekowanych złośliwym oprogramowaniem.

Przykłady ataków DoS:

Ping of Death

Sposób ataku na serwer internetowy za pomocą wysłania zapytania ping (ICMP Echo Request) w pakiecie IP o rozmiarze większym niż 65 535 bajtów. Zapytanie to jest niezgodne ze specyfikacją protokołu IP i powodowało błędy w starszej generacji systemów windows.

Smurf

Ten typ ataku polega na wysyłaniu bardzo dużej liczby zapytań (ICMP). Atak ten polega na technice fałszowania zapytań ping (ICMP Echo Request), poprzez zamianę adresu źródła tych zapytań na adres atakowanego serwera. Tak spreparowane pakiety ping, wysyłane są na adres rozgłoszeniowy sieci zawierającej wiele komputerów. Pakiety zostają rozesłane do wszystkich aktywnych systemów w sieci, co powoduje przesłanie przez nie pakietów ICMP Echo Reply na sfałszowany wcześniej adres źródłowy atakowanej ofiary. Np. w sieci o 255 hostach zwielokrotnia to każde zapytanie 255 razy.

SYN flood

Atak polega na wysyłaniu dużej ilości pakietów z ustawioną w nagłówku flagą synchronizacji (SYN) i najczęściej ze sfałszowanym adresem IP nadawcy (IP spoofing). Pakiety TCP z ustawioną flagą SYN służą do informowania zdalnego komputera o chęci nawiązania z nim połączenia. Podczas takiego ataku serwer, który otrzymał pakiet z flagą SYN na port, który jest otwarty, odpowiada na każdy pakiet zgodnie z zasadami protokołu TCP wysyłając pakiet z ustawionymi flagami synchronizacji (SYN) i potwierdzenia (ACK) do komputera, który w tym wypadku nie istnieje, istnieje, ale nie zamierzał nawiązywać połączenia z atakowanym hostem lub jest to komputer atakującego, który specjalnie nie odpowiada. Powoduje to przesyłanie dużych ilość danych i obciąża łącze sieciowe.

Ponadto w innych atakach tego typu wykorzystuje się fakt że atakowany alokuje zasoby pamięci w celu obsługi nowej sesji TCP, która nigdy nie jest konktynuowana.

Do wykonania w systemie Linux za pomocą programu hping.

Teardrop

Ten typ ataku korzysta z dużych pakietów, które są niepoprawnie pofragmentowane. Klient zawiesza się próbując połaczyć wybrane pakiety w jeden. Problem dotyczył starszych systemów takich jak systems Windows 3.1x, Windows 95, Windows NT oraz Linux kernel wcześniejsze niż 2.1.63.

ARP spoofing

Atak sieciowy w sieci Ethernet pozwalający atakującemu przechwytywać dane przesyłane w obrębie segmentu sieci lokalnej. Przeprowadzony tą metodą atak polega na rozsyłaniu w sieci LAN odpowiednio spreparowanych pakietów ARP zawierających fałszywe adresy MAC. W efekcie pakiety danych wysyłane przez inne komputery w sieci zamiast do adresata trafiają do osoby atakującej pozwalając jej na podsłuchiwanie komunikacji.

Wizualizacja:

DNS spoofing

Technika phishingu polegająca na wykonaniu przez atakującego przesłania do serwera DNS fałszywej informacji kojarzącej nazwę domeny z adresem IP. Serwer DNS zapamiętuje ją na pewien czas (do kilku godzin) i zwraca klientom zapamiętany adres IP, czego skutkiem jest przeniesienie na fałszywą stronę.

Tworzenie pakietów w Python

W celu dokonania ataku musimy spreparować pakiety TCP i przesłać je do atakowanego hosta.

Dostosowane do potrzeb pakiety TCP mogą być tworzone z wykorzystaniem tzw. surowych gniazd (ang. RAW sockets).

Przykłady w C:

Python:

Niestety nie każdy język wspiera obsługę RAW socketów (np Java). Ponadto, aby móc dostać się do takiego socketa i wysłać komunikat musimy mieć prawa administratora na naszym komputerze.

Ze względu na brak uprawnień administratora zamiast przesyłania socketem zapiszemy stworzony przez nas pakiet na dysku.

'''
        Raw sockets on Linux

        Silver Moon (m00n.silv3r@gmail.com)
'''

# some imports
import socket, sys
from struct import *

# checksum functions needed for calculation checksum
def checksum(msg):
        s = 0

        # loop taking 2 characters at a time
        for i in range(0, len(msg), 2):
                w = ord(msg[i]) + (ord(msg[i+1]) << 8 )
                s = s + w

        s = (s>>16) + (s & 0xffff);
        s = s + (s >> 16);

        #complement and mask to 4 byte short
        s = ~s & 0xffff

        return s

#create a raw socket


# tell kernel not to put in headers, since we are providing it, when using IPPROTO_RAW this is not necessary


# now start constructing the packet
packet = '';

source_ip = '192.168.1.102'
dest_ip = socket.gethostbyname('www.google.com')

# ip header fields
ip_ihl = 5
ip_ver = 4
ip_tos = 0
ip_tot_len = 0  # kernel will fill the correct total length
ip_id = 54321   #Id of this packet
ip_frag_off = 0
ip_ttl = 255
ip_proto = socket.IPPROTO_TCP
ip_check = 0    # kernel will fill the correct checksum
ip_saddr = socket.inet_aton ( source_ip )   #Spoof the source ip address if you want to
ip_daddr = socket.inet_aton ( dest_ip )

ip_ihl_ver = (ip_ver << 4) + ip_ihl

# the ! in the pack format string means network order
ip_header = pack('!BBHHHBBH4s4s' , ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, ip_check, ip_saddr, ip_daddr)

# tcp header fields
tcp_source = 8888   # source port
tcp_dest = 8888   # destination port
tcp_seq = 454
tcp_ack_seq = 0
tcp_doff = 5    #4 bit field, size of tcp header, 5 * 4 = 20 bytes
#tcp flags
tcp_fin = 0
tcp_syn = 1
tcp_rst = 0
tcp_psh = 0
tcp_ack = 0
tcp_urg = 0
tcp_window = socket.htons (5840)    #   maximum allowed window size
tcp_check = 0
tcp_urg_ptr = 0

tcp_offset_res = (tcp_doff << 4) + 0
tcp_flags = tcp_fin + (tcp_syn << 1) + (tcp_rst << 2) + (tcp_psh <<3) + (tcp_ack << 4) + (tcp_urg << 5)

# the ! in the pack format string means network order
tcp_header = pack('!HHLLBBHHH' , tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags,  tcp_window, tcp_check, tcp_urg_ptr)

user_data =  bytes('287046 ', 'utf-8')

# pseudo header fields
source_address = socket.inet_aton( source_ip )
dest_address = socket.inet_aton(dest_ip)
placeholder = 0
protocol = socket.IPPROTO_TCP
tcp_length = len(tcp_header) + len(user_data)

psh = pack('!4s4sBBH' , source_address , dest_address , placeholder , protocol , tcp_length);
psh = psh + tcp_header + user_data;

tcp_check = 1
#print tcp_checksum

# make the tcp header again and fill the correct checksum - remember checksum is NOT in network byte order
tcp_header = pack('!HHLLBBH' , tcp_source, tcp_dest, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags,  tcp_window) + pack('H' , tcp_check) + pack('!H' , tcp_urg_ptr)

# final full packet - syn packets dont have any data
packet = ip_header + tcp_header + user_data

#Send the packet finally - the port specified has no effect
f1=open('testfile.txt', 'wb+')
f1.write(packet)  # put this in a loop if you want to flood the target

print("poszlo")

Pobierz plik z kodem

Uruchomienie

python3 tcp.py

Uwaga! w Pythonie ważne są wcięcia, należy używać spójnego systemu kodowania wcięć, w pliku powyżej są to tabulatory (ale mogą to być też 4 spacje!) sprawdź zawsze koniecznie ustawienia edytora i to jakiej konwencji trzyma się plik!

Powyższy program zapisuje do pliku testfile.txt nagłowek TCP i IP jednego komunikatu o charakterze syn_flood na serwer www.google.com. Efekt ataku uzysaklibyśmy więc wykonując w pętli nieskończenie wiele wysyłań tego pakietu.

Chcielibyśmy móc podejrzeć ten plik w programie Wireshark w tym celu musimy najpierw zamienić go na postać binarną komendą od:

od -Ax -tx1 -v testfile.txt > wynik.txt

Następnie zamienić ten wynik na postać pcap zrozumiałą dla Wiresharka:

text2pcap -e 0x800 wynik.txt wynik.pcap

Plik wynik.pcap można już otworzyć w programie Wireshark. Uwaga! w związku z tym, że nasz pakiet nie zawierał nagówka Ethernetu musieliśmy go dodać w komendzie text2pcap (służy do tego przełącznik -e, dodając losowy nagłówek, 0x800 to kod nagłówka ethernetu mówiący o tym że kolejny po nim następuje nagłówek IP).

Uwaga! Ten sam efekt możemy uzyskać poprzez otwartcie w Wireshark Plik->ZaimportujHexDump i wpisanie w zaznaczenie pola Ethernet i wpisanie w nim kodu 0x800.

Alternatywnie możesz użyć programu hping do generowania pakietów:

Zadanie (10 pkt)

Wejdź na stronę

Podejrzyj w przeglądarce źródło strony (prawy przycisk myszy -> pokaż źródło strony / inspect page / ...). Podaj jakie informacje Janusz próbował ukryć przed swoimi uczniami.

Wejdź na tajny link Janusza. Odpowiedz na pytanie ze sprawdzianu1.txt.

Zadanie (10 pkt)

Stwórz i prześlij prowadzącemu pakiet TCP SYN_flood (czyli taki jak w przykładzie powyżej) zamień numer portu nadawcy na cztery pierwsze cyfry numeru indeksu a treśc danych na swój numer indeksu (Uwaga! Funkcja cheksum jest tak napisana że działa gdy liczba znaków jest parzysta, w razie konieczności dodaj spację.) Nagłowek Ethernet może być domyślny (wygenerowany przez text2pcap).

Prześlij plik na maszynę prowadzącego korzystając z netcata 150.254.78.69, na port 2222

nc 150.254.78.69 2222 < twoj_plik.pcap

odczekaj sekunde i wcisnij ctr+c (nc sam nie zakończy komunikacji po przesłaniu pliku, musisz zrobić to sam).

Aby sprawdzić czy udało nam się wykonać zadanie można wejść na stronę i odszukać swój wpis

Zadanie (30 pkt)

Stwórz i zapisz do pliku pakiet ARP Spoofing, jako victim adres MAC podaj aa:aa:aa:twoj_numer_indeksu, np. aa:aa:aa:28:70:46, victim komputer ma adres IP 192.168.1.102, adres target to 192.168.1.10. Target adres MAC może być dowolny.

Można w ćwiczeniu wykorzystać kod z

Uwaga! Musimy zamienić kod wysyłający wiadomość - send na zapis jej do pliku! Zauważ że tym razem nagłówek ethernetu jest tworzony w kodzie!

Uwaga! Najlepiej skorzystać z Pythona w wersji 3 a do kodowania binarnie tekstu w Pythonie wykorzystujemy następującą komendę:

source_mac = b'\xce\x91\xce\x92\xce\x91\xce\x92' # sender mac address

Prześlij plik na maszynę prowadzącego korzystając z netcata 150.254.78.69, na port 3333

nc 150.254.78.69 3333 < twoj_plik.pcap

odczekaj sekunde i wcisnij ctr+c (nc sam nie zakończy komunikacji po przesłaniu pliku, musisz zrobić to sam).

Aby sprawdzić czy udało nam się wykonać zadanie można wejść na stronę i odszukać swój wpis

Zadanie (30 pkt)

Stwórz i zapisz do pliku pakiet do ataku typu Smurf, adresem atakowanym ma być 192.168.1.101, adres docelowy to adres rozgłoszeniowy 255.255.255.255. Nagłówek Ethernet może być domyślny (wygenerowany przez text2pcap). Danymi przesłanymi powinien być Państwa numer indeksu.

Można w ćwiczeniu wykorzystać przykład z góry strony (ten od TCP_SYN_flood) w połączeniu z kodem z

Prześlij plik na maszynę prowadzącego korzystając z netcata 150.254.78.69, na port 4444

nc 150.254.78.69 4444 < twoj_plik.pcap

odczekaj sekunde i wcisnij ctr+c (nc sam nie zakończy komunikacji po przesłaniu pliku, musisz zrobić to sam).

Aby sprawdzić czy udało nam się wykonać zadanie można wejść na stronę i odszukać swój wpis

Zadanie (10 pkt)

Opisz w 3-4 zdaniach na czym polega atak Fraggle

Zadanie (10 pkt)

Opisz w 3-4 zdaniach na czym polega atak Slowrolis (Slow HTTP DoS)