Podszywanie ARP i adresy sprzętowe
Napisał: Patryk Krawaczyński
11/06/2009 w Bezpieczeństwo Brak komentarzy. (artykuł nr 69, ilość słów: 1982)
K
ażdy interfejs sieciowy (na przykład karta sieciowa) w komputerze lub innym urządzeniu posiada unikalny sprzętowy adres zaimplementowany przez producenta. ARP (Adress Resolution Protocol) – jest protokołem rozróżniania tych adresów. Jego zadaniem jest przetłumaczyć abstrakcyjny adres IP na bardzo konkretny adres sprzętowy urządzenia sieciowego. Kiedy host zamierza rozpocząć sesję, wysyła komunikat ARP z adresem IP komputera docelowego.
Dla usprawnienia komunikacji istnieje pamięć podręczna adresów ARP, pozwalająca na szybkie połączenie hostów bez konieczności rozsyłania komunikatu. To właśnie tę pąmieć podręczną wykorzystują agresorzy przy atakach z wykorzystaniem podszywania ARP, ponieważ zawiera ona tłumaczenia adresów IP na adresy sprzętowe. W uproszczeniu – ARP oznacza specjalny pakiet, który jest rozsyłany do wszystkich interfejsów sieci fizycznej. Zawiera on adres IP interfejsu, z którym nadawca pragnie się komunikować. Pozostałe komputery ignorują pakiet, zachowując jedynie informację o powiązaniu adresu IP z adresem sprzętowym nadawcy. Jednakże komputer, do którego ma dotrzeć wiadomość, odpowiada, podając swój adres sprzętowy MAC (Media Access Control Address) w celu zapisania go w buforze odpowiedzi. Przyszłe pakiety będą wysyłane już na właściwy adres fizyczny.
Z tym całym mechanizmem należy powiązać parę pojęć, które postaram się wytłumaczyć. Trzeba zdawać sobie sprawę z tego, że ARP nie jest protokołem internetowym, nie opuszcza sieci lokalnej i z tego powodu nie musi być routowany. Natomiast ARP jest rozsyłany do wszystkich interfejsów sieci lokalnej za pomocą pakietów. Odwrotnością do protokołu ARP jest RARP. Pozwala on komputerom rozprzestrzeniać ich adres sprzętowy, oczekując, że demon serwera zarządzającego adresami (np. DHCP) w sieci lokalnej odpowie, podając wolny adres IP. Dzięki temu bezdyskowe komputery i urządzenia sieciowe mogą otrzymywać własne adresy IP. To dzięki podmianie protokołów RARP oraz ARP agresor posiada możliwość pobierania adresu IP oraz korzystania z danej sieci w sposób bardzo trudny do wykrycia. Daje mu to także możliwość łączenia się ze stacjami, które dopuszczają tylko wybrane adresy IP. Jeśli chodzi o adres MAC – to adres ten identyfikuje fizyczne przyłączenie sieciowe (kartę sieciową, router) i wypalony jest w pamięci ROM (stąd nazwa adres wypalony – ang. burned-in address, BIA). Adres każdego przyłącza musi być niepowtarzalny, zwłaszcza w zakresie sieci lokalnej. Adres MAC składa się z 6 bajtów (48 bitów – 12 cyfr), np. 00-10-AB-27-AA-15, a jego podział jest następujący:
– pierwsze 24 bity to kod producenta (OUI) przyznawanego przez organizację IEEE różnym firmom,
– kolejne i ostatnie 24 bity to niepowtarzalny numer seryjny, przypisany przez producenta.
Kod producenta to istotna dla atakującego informacja i ważny element danych rozpoznania stacji docelowej. Na podstawie tej informacji można określić m.in. czy karta sieciowa będzie obsługiwała tryb pasywny, co pozwala na użycie ukrytego programu do przechowywania pakietów. Nie bez znaczenia są informacje o różnorodnych parametrach komunikacji, jak tryb duplex czy tryb nośnika.
W podszywaniu ARP, atakujący zatrzymuje swój adres sprzętowy ale przyjmuje adres IP hosta “zaufanego”. W tym celu wysyła błędne informacje o tłumaczeniu adresów zarówno do komputera atakowanego, jak i do pamięci podręcznej. Od tej pory pakiety z komputera atakowanego przesyłane są pod adres sprzętowy komputera atakującego. W ten sposób ofiara “wierzy”, że maszyna atakującego to właśnie “zaufany” host. Jednak ataki z podszywaniem ARP mają wiele ograniczeń. Niektóre inteligentne urządzenia sieciowe nie pozwalają na nich przeprowadzanie, jeśli pakiety wysyłane są poza segmenet sieciowy nadawcy. Co więcej, wpisy w pamięci podręcznej są krótkotrwałe (domyślnie aktualizowane są co 1 minutę w przypadku systemu Linux), a więc atakujący nie ma zbyt wiele czasu i musi często aktualizować pamięć podręczną własnymi wpisami. W jaki prosty sposób można się podszyć pod inny komputer?
ifconfig eth0 down ifconfig eth0 hw ether 00:20:4F:12:80:08 ifconfig eth0 192.168.0.7 route add default gw gate
Najpierw wyłączamy interfejs eth0, potem wydajemy właściwe polecenie zmieniające adres MAC, a w dwóch ostatnich poleceniach ustawiamy adres IP i routing do lokalnej bramy o nazwie “gate”. Następnie wystarczy z komputera “gate” wysłać ping do komputera, gdzie zmieniliśmy adres MAC. Na początku brama będzie miała kłopoty z odnalezieniem komputera, ponieważ wciąż posiada informację o starym adresie. Wyśle więc ona kolejne żądanie ARP. Po chwili uzyska
odpowiedź z nowym adresem MAC i może już uzyskać odpowiedź na swój ping (w celu weryfikacji wystarczy wydać polecenie: arp -vna). Jak widać, zmieniliśmy nie tylko końcówkę adresu sprzętowego, ale również część opisującą producenta, co już na pewno jest pogwałceniem standardów. Pocieszającą informacją jest, że nie wszystkie karty dopuszczają zmianę adresu MAC. Tym niemniej około połowa sterowników NIC (Network Interface Card – kart Ethernet) umożliwia zmianę adresu MAC kart za pomocą odpowiedniego oprogramowania, co pozwala włamywaczowi złamać niezmienne odwzorowanie adresów MAC na IP przy użyciu nowego, losowego adresu MAC. W celu odnalezienia kart obsługujących funkcję zmiany adresu może pomóc przeszukanie sterowników na obecność sekwencji set_mac_address. Prawdopodobnie także sterowniki przeznaczone dla innych systemów wspierają zmianę adresu MAC. W systemie Windows odpowiednią informację można znaleźć korzystając z Właściwości Otoczenia sieciowego wybierając Właściwości danej karty sieciowej oraz przegląd jej opcji i funkcji.
Istnieje kilka sposobów na zabezpieczenie się przed podszywaniem ARP. Najlepiej po prostu zapobiec modyfikacjom pamięci podręcznej ARP poprzez zapisaniu tłumaczenia adresów na stałe. Czasami jest to dość kłopotliwe i czasochłonne, ponieważ wymaga to aktualizowania pamięci ręcznie przy każdej zmianie adresu sprzętowego. Ale uzyskane bezpieczeństwo jest warte takiego wysiłku. Najprościej zapisać statyczne tablice ARP w routerze. Jeśli nie mamy routera, i tak możemy to wykonać za pomocą polecenia: arp. Pozwala ono na interkatywne modyfikowanie pamięci podręcznej ARP. Aby stworzyć mapowanie arp, wykorzystujemy parametry -s lub -f w zależności na jak wielką skalę chcemy działać. Jeśli zmieniamy tylko kilka wpisów, najlepiej korzystać z parametru -s np.:
arp -i eth1 -s 192.168.1.2 02:F2:B7:D5:65:32
Opcja -i informuje, do którego interfejsu przypisać dany wpis. Jej użycie to tylko podpowiedź, ponieważ, gdy zapomnimy podać (zazwyczaj wewnętrznego interfejsu) routera to jądro na podstawie tablicy routingu samo określi cel. Po opcji –sethostname następuje IP komputera z sieci lokalnej oraz jego fizyczny adres w zapisie heksadecymalnym. W ten sposób możemy dokonać lub dokonać modyfikacji paru wpisów w tablicy ARP. Wpis ten może bez problemu zostać dodany do któregoś z demonów startowych, ponieważ jak każda pamięć cache – po restarcie zostaje usunięta. Lecz w przypadku występowania większej ilości komputerów wpisów tych musi być odpowiednio więcej. Dlatego jeśli posiadamy dość rozbudowaną sieć lokalną warto zainteresować się przełącznikiem -f. Powoduje on odczytanie wszystkich wpisów umieszczonych w pliku /etc/ethers. Plik ten należy tak zmodyfikować, aby dodać do niego wiersz dla każdego systemu, z którym komunikacja powinna zachodzić w sposób niezawodny. W każdym wierszu powinna zostać umieszczona nazwa serwera lub jego adres IP, a następnie – po spacji – odpowiedni adres MAC. Jak już wspomniałem, adres MAC powinien składać się z sześciu par liczb, zapisanych w systemie szesnastkowym. Każda z par powinna być oddzielona przy użyciu dwukropka. Komentarz zaczyna się od znaku #. W pliku tym powinny znaleźć się wszystkie wpisy dokładnie określające parametry każdej karty sieciowej użytej w LANie. Oto przykładowy format ich zapisu:
192.168.0.2 00:A0:24:15:47:93 192.168.0.3 00:00:B4:BE:BB:DD 192.168.0.4 00:02:44:2B:77:B2 192.168.0.5 00:50:BA:BB:3D:B8 192.168.0.6 00:20:AF:44:3F:3D 192.168.0.8 00:00:1C:D6:7A:CD 192.168.0.11 00:02:44:23:A4:D2 192.168.0.9 00:00:1C:81:65:D3
W celu umożliwienia przetwarzania pliku /etc/ethers podczas uruchamiania systemu w pliku /etc/rc.d/rc.local powinien zostać umieszczony następujący wiersz: arp -f /etc/ethers. Polecenie to powinno zostać przetworzone po skonfigurowaniu
wszystkich interfejsów Ethernet oraz statycznych tablic routingu, ponieważ czynności te powinny zostać wykonane jako pierwsze. Następnie w celu wyświetlenia zawartości pamięci podręcznej ARP, należy użyć polecenia: arp -anv. Wszystkie wpisy, które zostały na stałe dodane będą posiadały flagę [PERM] – dlatego łatwo będziemy mogli zauważyć, które hosty nie są jeszcze dopisane statycznie. Dla osób, które uwielbiają posiadać do wszystkich mechanizmów osobne demony przygotowałem mały skrypt, który pozwala na proste zarządzanie wpisami tablicy ARP. Skrypt nazywa się rc.arp:
#!/bin/sh arpfile=/etc/ethers [ -f $arpfile ] || exit 0 case "$1" in start) # Start demona. echo "Dodaje rekordy ARP: " grep "^" $arpfile |grep -v "^#"| while read ip hw_addr; do if [ "$hw_addr" = "" ]; then echo -n "" else /sbin/arp -s $ip $hw_addr echo $ip $hw_addr fi done echo ;; stop) # Stop demona. echo -n "Usuwam statyczne rekordy ARP: " grep "^" $arpfile | grep -v "^#"| while read ip hw_addr; do if [ "$hw_addr" = "" ]; then echo -n "" else /sbin/arp -d $ip >/dev/null echo -n "." fi done echo ;; restart) $0 stop $0 start ;; status) /sbin/arp -anv ;; *) echo "Użycie: $0 {start|stop|restart|status}" exit 1 esac exit 0
Jak widzimy skrypt dokonuje pojedynczych wpisów wyciągając kolejne wiersze z pliku /etc/ethers. Jeśli wolimy skorzystać z tego z demona rc.arp, który powinien być umieszczony w katalogu /etc/rc.d/ to wystarczy zastąpić wpis: arp -f znajdujący się w rc.local na:
if [ -x /etc/rc.d/rc.arp ]; then /etc/rc.d/rc.arp start fi
Oprócz standardowych funkcji takich jak: start, stop i restart demon ARP posiada także parametr: status – wyświetlający
dokładny stan pamięci podręcznej ARP.
Bonus: Jak już wspomniałem każdy system sieciowy przeszukuje tablicę pamięci podręcznej zanim wyśle żądanie ARP. Umieszczone w niej wpisy (z wyjątkiem wpisów stałych) mają bardzo krótki “czas życia”, który w przypadku systemu Linux domyślnie wynosi minutę. W celu wyświetlenia dla danego systemu wartości wyrażonej w sekundach należy użyć polecenia:
cat /proc/sys/net/ipv4/neigh/eth1/gc_stale_time
Gdzie eth1 jest interfejsem podłączonym do sieci lokalnej, na bramie pełniącej router. W celu zmiany czasu przechowywania danych w pamięci podręcznej na np. 120 sekund, wystarczy wydać polecenie:
echo 120 > /proc/sys/net/ipv4/neigh/eth1/gc_stale_time
Należy jednak pamiętać, że zmiana tych wartości bez dogłębnego zrozumienia jej konsekwencji – w szczególności zaś w przypadku sieci produkcyjnej, bez przeprowadzenia szczegółowych testów – jest niezbyt dobrym pomysłem. Jeżeli po przekroczeniu tego czasu oczekiwania w pamięci podręcznej ARP wciąż dostępne jest wolne miejsce, odpowiedni wpis wciąż będzie wykorzystywany do odpytywania określonego systemu docelowego o adres MAC, który powinien być używany w celu wysłania pakietu. Takie postępowanie może zapobiec rozgłaszaniu oraz niepotrzebnemu marnowaniu cykli w sieci. Należy o tym pamiętać szczególnie w przypadku podejrzeń, że pamięć podręczna ARP została zmodyfikowana. Jej bezpośrednią zawartość możemy wyświetlić po wydaniu polecenia: cat /proc/net/arp.
Natomiast jeśli chcemy by nasz system zewnętrzny, który przyjmuje założenie, że inny system pracujący w Strefie Zdemilitaryzowanej (czyli nasz system pełni funkcję routera z ścianą ogniową) lub jeszcze inny system z sieci wewnętrznej nie wykorzystujący maskarady – jest przyłączony bezpośrednio do zewnętrznej sieci, wyśle do niego żądanie ARP służące do odczytu adresu MAC interfejsu sieciowego tego systemu – to wystarczy włączyć na naszym routerze / ścianie ogniowej funkcję Proxy ARP. Włączenie opcji Proxy ARP na zaporze spowoduje, że poda ona adres MAC własnego interfejsu zewnętrznego, a następnie automatycznie przekieruje pakiety do odpowiedniego systemu w Strefie:
echo 1 > /proc/sys/net/ipv4/eth0/proxy_arp
Proxy ARP nie przeszkadza także systemom skonfigurowanym do przesyłania danych przez zaporę sieciową. Funkcja ta może być wykorzystana również w przypadku innych interfejsów. Na przykład można uaktywnić ją dla systemów w Strefie po to, by nie było konieczne aktualizowanie ich konfiguracji odnośnie adresu bramy na adres IP naszej zapory sieciowej. W tym przypadku wystarczy zamienić interfejs eth0 na inny, odpowiedzialny za komunikację ze Strefą Zdemilitaryzowaną.
Więcej informacji: man arp, rarp, ethers, OUI