Podstawę funkcjonowania każdego społeczeństwa stanowi komunikacja we wszelkich odmianach. Najważniejszą i najpopularniejszą jej formą jest mowa i związany z nią język ludzki, będący jedną z pierwszych umiejętności, które zdobywa jednostka.
Wraz z rozwojem cywilizacyjnym komunikacja ewoluowała, co objawiało się w szczególności rozwojem metod przekazywania informacji na odległość. Plemiona afrykańskie używały w tym celu sygnałów dźwiękowych wydawanych przez potężne bębny, Indianie korzystali z systemu znaków dymnych, zaś Rzymianie za pomocą umieszczonych na wzgórzach luster przesyłali impulsy świetlne. W 1838 roku został zbudowany telegraf elektryczny wykorzystujący alfabet Morse'a1), co stało się podwaliną współczesnej telekomunikacji.
Obecnie informacje przesyłane są przez nowoczesne trakty cyfrowe, które pozwalają na szybką transmisję danych na duże odległości. Systemy komputerowe, które jeszcze kilkadziesiąt lat temu z reguły pracowały w izolacji, dziś łączone są w sieci umożliwiające współdzielenie zasobów. Telekomunikacja i informatyka stały się wzajemnie zależne, co zaowocowało powstaniem teleinformatyki, czyli nauki łączącej te dziedziny wiedzy.
Tematem niniejszej pracy są lokalne sieci komputerowe oraz ich bezpieczeństwo, ze szczególnym naciskiem na problem uwierzytelniania. Program komputerowy, który powstał w jej ramach, pozwala na demonstrację słabości najpopularniejszej metody zabezpieczania tego typu sieci przed nieupoważnionym dostępem.
W celu ułatwienia czytania zostały wprowadzone konwencje typograficzne. Narzędzia, biblioteki i pakiety oprogramowania pisane są czcionką o stałej szerokości, zaś komponenty aplikacji multispoof są dodatkowo pogrubione. Czcionka o stałej szerokości jest używana także w listingach oraz sesjach powłoki systemowej. Te fragmenty, na które należy zwrócić szczególną uwagę lub stanowią komendy wpisywane przez użytkownika, są pogrubione. Zbiór oznaczeń graficznych, używany jest konsekwentnie na większości rysunków. Adresy URL, z których można pobrać wykorzystywane narzędzia podawane są w przypisach, najczęściej z krótką informacją o funkcjonalności danego programu.
Praca niniejsza powstała w dużej mierze dzięki pomocy wielu życzliwych osób, którym należą się słowa podziękowania.
W pierwszej kolejności chcę wyrazić wdzięczność dr Tomaszowi Surmaczowi za owocną współpracę.
Pragnę serdecznie podziękować moim rodzicom, Krystynie i Janowi Pokrywkom za wszelką pomoc, której nie jestem w stanie opisać, ani wyliczyć.
Za pomoc przy rozwiązywaniu problemów podczas pisania aplikacji, dziękuję Michałowi Pokrywce. Za cierpliwość, cenne dyskusje, wskazówki i pożyteczne uwagi chcę podziękować Krzysztofowi Noskowi, Przemysławowi Plata oraz moim braciom Piotrowi i Przemysławowi Pokrywkom. Chcę także wyrazić wdzięczność wszystkim osobom, tworzącym oprogramowanie, które wykorzystywałem podczas pisania niniejszej pracy oraz aplikacji multispoof.
I would like to thank especially Guy Harris from tcpdump project for help with libpcap patch inclusion, and John Bothe for initial patch code.
W tym rozdziale zostanie przedstawiona koncepcja sieci LAN, zagrożenia jakie w nich występują oraz praktyczne problemy, związane z ich wykorzystaniem przez intruzów. Główny nacisk zostanie położony na omówienie popularnego sposobu uwierzytelniania użytkowników sieci, którego słabości będą zademonstrowane praktycznie w następnych rozdziałach.
Ze względu na fakt, że tematyka sieci lokalnych to szeroki zakres dziedziny IT, jaką są sieci komputerowe, należy uściślić obszar zainteresowania tej pracy. Są nim lokalne sieci komputerowe, zbudowane z wykorzystaniem technologii Ethernet [Net99 ] lub pochodnych i wykorzystywane do płatnego świadczenia usługi dostępu do Internetu. Dotyczy to tzw. sieci osiedlowych, zarówno amatorskich (non-profit) jak i profesjonalnych. Te pierwsze są zarządzane przez osoby, które nie są zainteresowane zyskiem, zaś opłaty pobierane od korzystających z sieci są w całości przeznaczane na zwrot kosztów jej utrzymania. W przeciwieństwie do nich, sieci profesjonalne są własnością firm (nazywanych operatorami lub dostawcami usługi dostępu do Internetu), które opierają swoją działalność na przychodach uzyskiwanych z abonamentu.
Głównym powodem tego, że sieci osiedlowe istnieją i rozwijają się, jest niska cena infrastruktury ethernetowej w zakresie instalacji i utrzymania. Urządzenia wchodzące w skład takiej sieci są łatwo dostępne i tanie, w przeciwieństwie do sprzętu niezbędnego w innych rozwiązaniach szerokopasmowych, jak technologia DSL2) czy telewizja kablowa3). Na infrastrukturę osiedlowego Ethernetu składają się najczęściej tylko trzy rodzaje elementów: przełączniki sieciowe, kable miedziane lub światłowody oraz karty sieciowe w komputerach. Dostęp do Internetu zapewnia router, który w mniejszych sieciach bywa implementowany na zwykłym, niedrogim komputerze klasy PC.
Dostęp do Internetu jest udzielany użytkownikom, którzy uregulowali należności finansowe. Natomiast klienci, którzy zalegają z opłatami powinni tracić dostęp do usługi, najlepiej w dniu przekroczenia terminu płatności. Najpewniejszą metodą odcięcia użytkownika od sieci jest wyłączenie z najbliższego przełącznika kabla, który do niego prowadzi. Jest to jednak kłopotliwe, ponieważ wymaga wykonania pracy fizycznej, zaś przełączniki sieciowe często instalowane są w miejscach trudno dostępnych, jak piwnice, strychy, słupy lub mieszkania osób prywatnych. Dodatkowo, niektórzy dostawcy sieci osiedlowych zezwalają także na bezpłatny lub obciążony mniejszą opłatą dostęp do zasobów sieci lokalnej, pod warunkiem niekorzystania z Internetu.
Jak powiązać transmisje przepływające przez router operatora z człowiekiem, którego komputer je wygenerował4)?Odpowiedzią jest proces uwierzytelniania. Aby uzyskać dostęp do usługi, komputer użytkownika musi przedstawić się, wykorzystując do tego informacje uzgodnione wcześniej między jego właścicielem i operatorem sieci.
Jeśli hosty w sieci są uwierzytelnione, oznacza to, że jest możliwe ich rozróżnienie, co w efekcie pozwala na oferowanie spersonalizowanych usług przez dostawcę. Takimi usługami są na przykład możliwość wyboru przepustowości dostępu do Internetu przez klienta, blokowanie niepożądanych treści, dostęp do informacji billingowych, ogłoszenia i reklamy.
Najpopularniejsza metoda uwierzytelniania w sieciach osiedlowych wykorzystuje to, że każdy komputer posiada kartę sieciową, zaś każda karta ma przypisany przez producenta unikalny adres sprzętowy MAC (ang. Medium Access Control). Na jego podstawie serwer DHCP5), stanowiący część infrastruktury sieciowej, przydziela mu adres IP, który jest wymagany do komunikacji. Ponieważ serwery DHCP najczęściej konfigurowane są w ten sposób, że dla danego adresu MAC przydzielają zawsze ten sam adres IP, zaś użytkownicy rzadko wymieniają karty sieciowe, adres ten może być wykorzystywany do uwierzytelniania.
Najczęściej router, który zapewnia dostęp do Internetu, jest konfigurowany tak, aby w procesie uwierzytelniania brały udział oba adresy: sprzętowy oraz IP. Dzieje się tak, ponieważ ten drugi adres użytkownik może w trywialny sposób zmienić, zaś weryfikacja zgodności obu adresów pozwala na wykrycie tego typu oszustwa. Mimo tego, autorowi znane są sieci osiedlowe, które nie stosują nawet tego, podstawowego zabezpieczenia.
Niski koszt sieci Ethernet, prostota jej instalacji oraz wysoka elastyczność użytkowania są niestety okupione podatnością na wiele ataków, obniżających jej bezpieczeństwo zarówno w sensie poufności i integralności transmisji, jak i dostępności. Wydaje się, że głównymi źródłami tych problemów są protokół ARP oraz technika dynamicznego przełączania ramek.
W sieciach Ethernet opartych na popularnych, tanich przełącznikach lub koncentratorach istnieje niebezpieczeństwo podszycia się poprzez zmianę adresu. Możliwe jest to zarówno w warstwie trzeciej modelu OSI, poprzez zmianę numeru IP6), jak i w warstwie drugiej poprzez zmianę adresu MAC. W popularnych systemach operacyjnych modyfikacja tego drugiego jest równie prosta jak pierwszego. Jednak zmiana adresu MAC stanowi z pewnych względów wiedzę tajemną, dostępną tylko wybranym7). Rozpowszechniony jest natomiast pogląd, że adres MAC, tzw. adres sprzętowy jest zapisany na stałe w urządzeniu i nie ma możliwości wpływu na jego wartość poza wymianą karty sieciowej.
Adres MAC jest faktycznie zapisany w pamięci karty, ale zazwyczaj ta pamięć pozwala na zmianę jej zawartości. Prostszą metodą jest jednak programowa zmiana adresu na poziomie sterownika karty sieciowej w systemie operacyjnym. Wreszcie wysyłanie ramek ethernetowych ze sfałszowanym adresem źródłowym jest możliwe także w przestrzeni użytkownika za pomocą odpowiednich bibliotek i interfejsów udostępnianych przez jądro. Więcej informacji na temat generowania ramek z poziomu aplikacji zostało zamieszczonych w podrozdziale 2.2.
Zmiana adresu MAC na adres komputera innego użytkownika, który jest w danej chwili nieaktywny powoduje, że serwer DHCP przydziela jego adres IP i dostęp do Internetu odbywa się w cudzym imieniu. Jest to kradzież usługi, przed którą operator sieci osiedlowej powinien się zabezpieczyć.
Sieci oparte na koncentratorach są podatne na podsłuchiwanie, ponieważ urządzenia te przesyłają otrzymane ramki na wszystkie porty (rysunek 1.1). Pozwala to atakującemu na dostęp do informacji przesyłanych w obrębie segmentu sieci, do którego on należy. Narzędzia do podsłuchiwania popularnie nazywane są snifferami. Najbardziej znanym programem tego typu jest tcpdump8). Podsłuchiwanie jest techniką, która obecnie ma coraz mniejsze znaczenie, ze względu na wypieranie koncentratorów przez przełączniki. W sieciach przełączanych efekty biernego podsłuchiwania są znikome. Jednak podsłuchiwanie nadal jest wykorzystywane przez intruzów w połączeniu z innymi metodami. Więcej o tym można przeczytać w podrozdziale 2.1.
Jest to najbardziej znany typ ataku na sieci lokalne, wykorzystujący słabości protokołu ARP [Gusta i Szmit 2003]. Protokół ten jest używany do mapowania numerów IP na adresy MAC, czyli łączy warstwę trzecią z warstwą drugą, umożliwiając tym samym komunikację w sieci fizycznej. Każdy host w sieci posiada lokalną tablicę ARP. Jeśli wystąpi potrzeba wysłania danych do innego hosta o znanym adresie IP w tym samym segmencie sieci lokalnej, tablica ta jest przeglądana w celu odnalezienia odpowiadającego mu adresu MAC. W przypadku, gdy tablica nie zawiera wpisu dla poszukiwanego adresu IP, system operacyjny wysyła do wszystkich komputerów w sieci lokalnej komunikat ARP Request, z zapytaniem o adres MAC tego hosta. Jeśli w danej chwili komputer o poszukiwanym adresie IP jest obecny w sieci, to wysyła komunikat ARP Reply do hosta, który wysłał zapytanie. Odpowiedź zawiera jego adres MAC, co pozwala na uaktualnienie tablicy ARP i dalszą transmisję.
Jeśli hosty w sieci są skonfigurowane w ten sposób, że pobierają ustawienia sieciowe z serwera DHCP, to atakujący może uruchomić drugi, konkurencyjny serwer, który będzie przydzielał komputerom użytkowników inne ustawienia. Atakujący może w ten sposób wymusić na komputerach, aby przesyłały ruch internetowy do jego maszyny, zamiast do routera. Manipulując wartością maski sieciowej, może także spowodować, że nawet transmisje lokalne będą kierowane do niego. Atakujący uzyskuje wtedy pełną kontrolę nad ruchem, tak jak w przypadku ataku ARP Spoofing.
Inną możliwością jest zmiana adresu serwera DNS na adres maszyny kontrolowanej przez atakującego. Fałszywy serwer DNS natomiast będzie przekierowywał wybrany ruch na host oszusta, który znów przejmuje nad nim pełną kontrolę.
Atakujący może też selektywnie blokować hosty w sieci przez przydzielanie nieprawidłowych adresów, co skutkuje efektem odmowy usługi.
Jeśli host próbuje wysyłać pakiety IP przez router, zaś ten posiada informacje o lepszej trasie, prowadzącej przez bramę znajdującą się w tej samej sieci, to router wysyła do hosta komunikat ICMP Redirect. W komunikacie zawarta jest informacja o adresie routera, którego host powinien użyć aby wysyłane przez niego pakiety trafiły do miejsca przeznaczenia.
Komunikaty te mogą być wysyłane także przez atakującego w celu przekierowania ruchu hosta do kontrolowanej przez niego maszyny12). Maszyna ta uzyskuje pełną kontrolę nad ruchem hosta, zaś efekty są podobne jak w przypadku ataku ARP Spoofing.
Jeśli ataki zapewniające kontrolę nad transmisją nie są wykonalne, zaś celem atakującego jest uniemożliwienie komunikacji w sieci to może posunąć się do prób resetowania połączeń. Polega to na wstrzykiwaniu do sieci pakietów, które służą do awaryjnego zawieszania połączeń TCP i transmisji UDP13). W przypadku protokołu TCP są to segmenty z ustawioną flagą RST, zaś przerywanie połączeń UDP odbywa się z wykorzystaniem komunikatów ICMP Unreachable. Pakiety resetujące wymagają podstawowych informacji o połączeniu jak adresy i porty źródłowe oraz przeznaczenia, a także numery sekwencyjne dla połączeń TCP. Dlatego ten atak jest najbardziej efektywny w połączeniu z podsłuchiwaniem ruchu sieciowego. Z przechwyconego ruchu atakujący wybiera te połączenia, które chce zakończyć.
Inną metodą jest zgadywanie części danych opisujących połączenie, o którym pozostałe informacje są znane. Na przykład jeśli atakujący wie, że dany host ustanowił długotrwałą sesję z innym hostem wykorzystując protokół FTP, to generuje pakiety resetujące z wszystkimi możliwymi kombinacjami portów źródłowych i numerów sekwencyjnych14). Pozostałe dane jak adresy IP i numer portu docelowego, są znane.
Aby czytelnik mógł świadomie korzystać z programu multispoof, a także aby zrozumieć jego budowę, musi znać podstawowe technologie, wykorzystywane przez tę aplikację. W tym rozdziale zostaną przybliżone cztery najważniejsze. Zakłada się, że czytelnik posiada ogólną wiedzę na temat systemu GNU/Linux, jego administracji oraz zasad funkcjonowania lokalnych sieci komputerowych wykorzystujących protokół IP [Hunt 1997] [Bautts et al. 2005] [Russell 2001].
Podsłuchiwanie sieci LAN to proces polegający na odbieraniu wszystkich danych, które pojawiają się na interfejsie sieciowym, w formie ramek ethernetowych. Ramki odebrane przez sterownik karty sieciowej są przesyłane równolegle do programu lub programów nasłuchujących oraz do stosu sieciowego w systemie operacyjnym, dlatego proces nie zaburza normalnego funkcjonowania aplikacji korzystających z sieci. Dodatkowo, jeśli karta sieciowa znajduje się w trybie promiscuous odbierane ramki nie podlegają filtrowaniu, które standardowo odbywa się w karcie. Domyślnie bowiem, karta sieciowa pozwala tylko na odbiór ramek o adresie docelowym zgodnym z adresem MAC karty oraz ramek rozgłoszeniowych i multicastowych15). Aplikacja nasłuchująca ma dostęp do warstwy drugiej i wyższych modelu OSI, co pozwala na odbiór informacji przenoszonych nawet przez protokoły, które nie są obsługiwane przez system operacyjny.
Podsłuchiwanie sieci wykorzystywane jest głównie w analizatorach pakietów, nazywanych snifferami. Znajdują one zastosowanie przy diagnozowaniu problemów oraz pomagają poznawać protokoły sieciowe. Funkcje przechwytywania informacji wysyłanych przez inne hosty są także wykorzystywane przez komputerowych włamywaczy np. w celu poznawania haseł.
Podsłuchiwanie w trybie promiscuous umożliwia analizę ruchu całej sieci, pod warunkiem, że jest ona oparta na koncentratorach. Sieci budowane z wykorzystaniem przełączników są bardziej odporne na bierne podsłuchiwanie16), jednak zastosowanie metod aktywnych w dalszym ciągu pozwala na przechwytywanie transmisji (zostało to wyjaśnione w podrozdziale 1.3.3). Niemniej aplikacja, która powstała w ramach pracy dyplomowej, nie wymaga przechwytywania transmisji innych hostów.
Programy, które wykorzystują podsłuchiwanie sieci, często nie potrzebują wszystkich ramek, które odbiera karta. Zazwyczaj wybierają z nich tylko te, które spełniają określone kryteria. W tym celu został opracowany filtr BPF (ang. Berkeley Packet Filter). Pozwala on na wstępną selekcję danych z wykorzystaniem prostego języka17). Program w tym języku jest optymalizowany, kompilowany i ładowany do jądra18). Droga ramki sieciowej od momentu nadania, do otrzymania przez aplikację podsłuchującą jest zobrazowana na rysunku 2.1. Zanim ramka dotrze do programu, może zostać odfiltrowana na przełączniku sieciowym (1), ze względu na to, że jej adres docelowy znajduje się już w pamięci przełącznika i jest skojarzony z portem innego hosta. Jeśli ramka dotrze do karty sieciowej hosta (2), karta nie znajduje się w trybie promiscuous, zaś adres docelowy MAC ramki nie pokrywa się z adresem karty ani nie jest adresem rozgłoszeniowym, wtedy karta odrzuci ramkę. W przeciwnym razie ramka jest analizowana przez program filtra BPF (3) i tylko jeśli spełni jego warunki zostanie dopuszczona do aplikacji.
Wstrzykiwaniem określa się wysyłanie ramek ethernetowych bezpośrednio do sterownika karty sieciowej w systemie operacyjnym, czyli z pominięciem większości stosu sieciowego. Aplikacja w całości decyduje o zawartości ramki i może dowolnie określać wszystkie jej pola i dane protokołów wyższych warstw. Tak więc operacje, które nie są udostępniane przez system operacyjny, jak zmiana adresu źródłowego, wybranie docelowego adresu MAC i inne – są możliwe w trybie wstrzykiwania.
Podobną funkcjonalność oferują tzw. surowe gniazda sieciowe (ang. RAW sockets). Pozwalają one na generowanie z poziomu aplikacji dowolnych pakietów IP, które następnie są opakowywane przez jądro systemu w ramki protokołu warstwy drugiej modelu OSI [Al-Herbish 1999]. Zaletą surowych gniazd jest niezależność od medium transmisyjnego, natomiast wadą brak kontroli nad ramką.
Obie metody wysyłania danych są wykorzystywane głównie w aplikacjach do diagnozowania sieci oraz testowania i przełamywania zabezpieczeń.
Interfejs tun jest zapewnianym przez jądro wirtualnym urządzeniem sieciowym typu punkt-punkt. Podobnie interfejs tap z tą różnicą, że oferuje on wirtualną kartę ethernetową. Oba typy interfejsów są dynamiczne, tzn. mogą być tworzone w dowolnej ilości i usuwane [Krasnyansky i Thiel 2002]. Utworzenie i komunikacja z interfejsem odbywa się odpowiednio przez otworzenie pliku urządzenia19) oraz odczyt i zapis do deskryptora z poziomu aplikacji. Dane które zostaną zapisane pojawią się na interfejsie tun jako pakiet IP, zaś na interfejsie tap jako ramka ethernetowa. Pakiet bądź ramka, która zostanie wysłana przez interfejs może być odczytana z deskryptora jako ciąg bajtów.
Interfejsy tun/tap są wykorzystywane zazwyczaj w tunelowaniu. Tunelowanie polega na przesyłaniu pakietów lub ramek, po wcześniejszej enkapsulacji w pakiety specjalnych protokołów komunikacyjnych. Po obu stronach tunelu znajdują się interfejsy tun/tap, dzięki czemu użytkownik odnosi wrażenie, że komunikuje się z drugą stroną przez dedykowane połączenie fizyczne. Tunelowanie jest z reguły używane w wirtualnych sieciach prywatnych (VPN) oraz zastosowaniach eksperymentalnych20).
Rysunek 2.2 przedstawia porównanie interfejsów wirtualnych tun/tap oraz interfejsów fizycznych. Interfejsy fizyczne nadają i odbierają dane do/z odpowiedniego medium transmisyjnego za pośrednictwem właściwego sprzętu sieciowego. Natomiast interfejsy wirtualne komunikują się z aplikacjami, znajdującymi się w przestrzeni użytkownika.
NAT (ang. Network Address Translation) to proces, który odbywa się zwykle na routerze sieciowym. Polega on na dynamicznym tłumaczeniu adresów pakietów IP. Najczęściej używany jest w celu zapewnienia dostępu do Internetu sieci, która używa prywatnego zakresu adresów IP21). W tym przypadku router natujący zmienia źródłowy adres IP każdego pakietu wychodzącego do Internetu na adres publiczny routera. Każdy pakiet powracający do sieci otrzymuje adres odpowiadający komputerowi, który zainicjował transmisję. Dzięki temu cała sieć może wykorzystywać jeden publiczny adres IP22).
NAT jest wykorzystywany także podczas równoważenia obciążenia pomiędzy kilka serwerów dysponujących pojedynczym adresem IP. Router równoważący obciążenie korzystając z translacji adresów może przypisywać kolejne połączenia do różnych serwerów, np. w zależności od ich obciążenia, podmieniając docelowy adres IP połączeń na adres konkretnego serwera, który znajduje się w sieci wewnętrznej. Dzięki temu użytkownicy korzystający z usług serwerów odnoszą wrażenie, że komunikują się z jednym hostem, zaś w rzeczywistości jest ich kilka.
Zasada działania NAT została zobrazowana na rysunku 2.3. Zaawansowane implementacje NAT23) umożliwiają tworzenie bardziej złożonych translacji niż wymienionego powyżej schematu jeden do wielu. Mogą to być wiele do wielu (adresy są odwzorowywane w liczniejszą lub mniej liczną pulę), jeden do jednego (pule adresów zewnętrznych i wewnętrznych są jednakowo liczne, odwzorowania są stałe). Możliwe jest także wykonywanie translacji warunkowej w połączeniu z listą filtrów systemu firewall [Strebe i Perkins 2000] [Russell 2002b].
Aplikacja multispoof która powstała w ramach pracy dyplomowej, ma na celu praktyczną demonstrację słabości najpopularniejszej metody uwierzytelniania w sieciach osiedlowych. Program pozwala na przełamywanie zabezpieczenia usługi dostępu do Internetu, które bazuje na sprawdzaniu zgodności adresów IP i MAC komputera użytkownika z danymi przechowywanymi w bazie operatora.
Aplikacja wykorzystuje podszywanie się pod nieaktywne hosty. W tym procesie fałszowane są adresy IP i MAC wysyłanych pakietów. Cechą odróżniającą działanie aplikacji od zwykłej zmiany adresu w systemie operacyjnym jest możliwość podszywania się pod wszystkie nieaktywne komputery jednocześnie. Wykorzystanie programu pozwala osiągnąć szybkość transmisji, mogącą równać się sumie przepustowości poszczególnych hostów, których adresy są wykorzystywane przez aplikację. Koncepcję działania programu przedstawia rysunek 3.1.
Dodatkową funkcją programu jest samodzielne rozpoznawanie sieci i tworzenie listy komputerów, które będą mogły być później wykorzystane w procesie podszywania się. Aplikacja nieustannie monitoruje sieć i jeśli zauważy, że wykorzystywany w procesie podszywania się host staje się aktywny, to natychmiast przestaje używać jego adresu, aby nie powodować konfliktów.
Należy podkreślić, że aplikacja multispoof powstała w celach demonstracyjnych, zaś używanie jej bez zgody właściciela sieci jest równoznaczne z kradzieżą usługi, co jest niezgodne z prawem.
Wewnętrzna architektura aplikacji multispoof ewoluowała w trakcie jej implementacji. Początkowo aplikacja miała mieć postać jednego programu. Szybko jednak okazało się, że pojedynczy program byłby zbyt skomplikowany, dlatego część funkcji została umieszczona w osobnym programie. Liczba programów zwiększała się wraz z identyfikacją kolejnych zadań, które aplikacja miała wykonywać. Doprowadziło to do niemal całkowitej separacji do osobnych procesów zadań, które nie były ze sobą ściśle powiązane. Jednocześnie były opracowywane interfejsy, za pomocą których procesy komunikowały się ze sobą. Mają one prosty, tekstowy charakter, który jest czytelny dla człowieka. Separacja zadań i proste interfejsy to metody modularyzacji aplikacji, które wydatnie przyśpieszyły proces pisania kodu, testowania oraz znajdowania i usuwania błędów [Raymond 2003].
Każde z zadań jest realizowane przez zbiór procesów, nazwanych komponentami. Komponenty wykonują proste, jednowątkowe operacje z wykorzystaniem dwóch typów interfejsów, które zostaną omówione w podrozdziale 3.1. W podrozdziale 3.2 przybliżony zostanie komponent netdb, który uczestniczy we wszystkich trzech zadaniach. Następne podrozdziały będą dotyczyć kolejnych zadań, oraz wykonujących je komponentów. Rozdział zakończy opis skryptu multispoof, odpowiedzialnego za przygotowanie środowiska, utworzenie zadań z poszczególnych komponentów po uruchomieniu, oraz zatrzymanie ich przed zakończeniem.
Interfejsy służą do jedno- lub dwustronnej komunikacji pomiędzy komponentami aplikacji multispoof z wykorzystaniem odpowiednich protokołów. Intencją przyświecającą ich budowie była prostota, dlatego dane wymieniane z ich wykorzystaniem mają postać tekstową. Decyzja ta wpłynęła na dużą elastyczność protokołów, co znacznie ułatwiało bieżącą ich rozbudowę podczas powstawania aplikacji. Oprócz tego forma tekstowa jest czytelna dla człowieka i daje się przetwarzać przy użyciu narzędzi uniksowych (np. grep, sed, awk). Są to pożądane cechy ułatwiające proces testowania oprogramowania.
Pierwszy typ interfejsu, nazwany tekstowym protokołem ramek, jest używany w potokach między komponentami przetwarzającymi ramki sieciowe. Interfejs jest jednokierunkowy. Pozwala na wysyłanie odpowiednio zakodowanych ramek, lub ich odbieranie za pośrednictwem standardowego wejścia i wyjścia. Protokół ten ma format liniowy, każda linia zawiera jedną ramkę. Bajty ramki kodowane są heksadecymalnie, najstarszy bajt pierwszy (Big Endian). Przykładową ramkę obrazuje rysunek 3.2.
Drugi typ interfejsu, nazywany interfejsem lub protokołem netdb, służy do wykonywania zapytań do bazy adresów netdb (baza ta będzie opisana w następnym podrozdziale). Interfejs wykorzystuje lokalne gniazdo uniksowe24) i jest dwukierunkowy. Komponenty mogą wysyłać zapytania, zaś baza odsyła odpowiedzi.
Zapytania mają postać komend z parametrami rozdzielonymi białymi znakami. Odpowiedzi składają się z jednej lub więcej linii, z których ostatnia ma ustandaryzowany format, przedstawiony na rysunku 3.3. Jeśli odpowiedź składa się z więcej niż jednej linii, wszystkie oprócz ostatniej mają format specyficzny dla wydanej komendy.
Zadaniem komponentu netdb jest umożliwienie dostępu do bazy adresów oraz zmiennych innym komponentom. Baza netdb jest używana niemal przez wszystkie inne procesy, działające w ramach aplikacji multispoof, z wyjątkiem tx, rx i tapio. Z tego względu komponent netdb zostanie omówiony na początku.
Komunikacja z innymi komponentami aplikacji jest realizowana z wykorzystaniem lokalnego gniazda uniksowego, które jest tworzone po uruchomieniu programu. Korzystając z tego gniazda inne komponenty mogą wydawać komendy i odczytywać wyniki zgodnie z tekstowym protokołem netdb. Tabela 3.1 zawiera listę dostępnych komend wraz z krótkimi opisami. Wybrane komendy będą omówione szerzej w następnych podrozdziałach.
Komenda | Parametry | Opis |
---|---|---|
gethost | Adres IP | Wyświetla dane hosta: adres MAC, wartości czasowe oraz znaczniki. |
host | Adres IP, MAC | Dodaje lub modyfikuje dane hosta. Uaktualnia czas ostatniej aktywności. |
remove | Adres IP | Usuwa dane hosta. |
do | Akcja, Adres IP | Ustawia flagi dla hosta. Możliwe akcje: enable, disable, start-test, stop-test. |
dump | – | Wyświetla listę adresów IP. |
getvar | Nazwa zmiennej | Wyświetla zawartość zmiennej. |
setvar | Nazwa zmiennej, wartość | Ustawia wartość zmiennej. |
quit | – | Kończy połączenie z netdb. |
Program netdb jest jednowątkowym serwerem opartym na funkcji select. Architektura ta charakteryzuje się wysoką wydajnością oraz prostotą implementacji [Brecht i Ostrowski 2001]. Podczas ewaluacji różnych rozwiązań, została ona wybrana głównie ze względu na tę drugą cechę, w szczególności brak sekcji krytycznej25). Proces obsługi połączeń jest przedstawiony na rysunku 3.4.
Rozpatrywane były również inne sposoby realizacji dostępu do bazy hostów przez wiele procesów, lecz zostały odrzucone. Tablica hostów mogłaby być przechowywana w segmencie pamięci, dzielonym między komponentami, zaś synchronizacja odbywałaby się z wykorzystaniem semaforów. Zaletą tego rozwiązania jest wysoka wydajność, ponieważ operacje na pamięci są zdecydowanie szybsze niż komunikacja za pomocą gniazd lokalnych. Wadami są zwiększenie skomplikowania komponentów (potrzeba zaimplementowania synchronizacji, która sprzyja powstawaniu błędów, komplikacje związane z umieszczeniem dynamicznych struktur danych w pamięci dzielonej26)) oraz trudność testowania (konieczne byłoby napisanie osobnego programu testującego, brak możliwości monitorowania odczytów/zapisów do/z pamięci). Podobnym pomysłem jest użycie pamięci prywatnej specjalnej biblioteki. Biblioteka udostępniałaby dostęp do bazy hostów, znajdującej się w pamięci prywatnej za pomocą zestawu funkcji. Synchronizacja odbywałaby się tylko wewnątrz biblioteki, jednak pozostałe problemy są takie same jak w poprzednim rozwiązaniu.
Główne zadanie programu, czyli operacje na bazie hostów jest realizowane z wykorzystaniem tablicy haszującej, dostępnej w bibliotece glib27). Obsługa zmiennych (komendy getvar i setvar) wykorzystuje prostą tablicę struktur. Tablica ta jest statyczna, ponieważ zbiór zmiennych jest stały i zdefiniowany w kodzie.
Po uruchomieniu program rejestruje gniazdo lokalne oraz wczytuje bazę hostów z pliku cache, który mógł zostać stworzony w wyniku poprzednich uruchomień. Jest to plik tekstowy, który zawiera sekwencje komend host. Ścieżka do pliku jest podawana jako parametr. Następnie przechwytywane są funkcje obsługi sygnałów, aby program przed zakończeniem mógł zapisać bazę hostów do pliku cache. Ostatnim krokiem jest wywołanie funkcji odpowiedzialnej za nasłuchiwanie na gnieździe i obsługę połączeń.
# rx | cmac unspoof | tapio | cmac spoof | txPomiędzy elementami potoku dane przekazywane są w sposób zakodowany zgodnie z omówionym wcześniej protokołem ramek. Komunikaty diagnostyczne są wysyłane na standardowe wyjście błędów, dzięki czemu nie zaburzają potoku. Każdy komunikat jest poprzedzany nazwą komponentu, który go wygenerował. Dzięki temu użytkownik jest na bieżąco informowany o istotnych wydarzeniach i jest w stanie przypisać je do konkretnego źródła. Role poszczególnych komponentów zostaną omówione w podrozdziałach.
Para programów rx i tx zajmuje się odpowiednio podsłuchiwaniem (odbieraniem ramek) oraz ich wstrzykiwaniem do sieci.
Komponent rx odbiera ramki z wykorzystaniem biblioteki libpcap [Carstens 2002]. Jako parametry z linii komend podaje się interfejs, na którym program ma nasłuchiwać, oraz filtr BPF, określający które ramki będą odbierane. Podsłuchiwanie musi odbywać się w trybie promiscuous, ze względu na to, że aplikacja multispoof wykorzystuje wiele adresów MAC. Jeśli tryb ten byłby wyłączony, aplikacja otrzymywałaby tylko ramki, których docelowy adres MAC jest równy adresowi interfejsu sieciowego, oraz ramki rozgłoszeniowe. Oprócz trybu promiscuous, komponent rx przed rozpoczęciem podsłuchiwania aktywuje filtr kierunku transmisji, tak aby odbierane były tylko ramki, które płyną z sieci, nie zaś te, które są wysyłane przez hosta. Domyślnie bowiem, biblioteka libpcap przechwytuje ramki płynące w obydwu kierunkach28).
Podsłuchane ramki, które spełniają warunki narzucone przez filtr BPF oraz filtr kierunku, zostają wysłane przez komponent rx na standardowe wyjście, zakodowane zgodnie z tekstowym protokołem ramek.
Komponent tx zajmuje się wstrzykiwaniem ramek do sieci przez określony interfejs sieciowy. Ramki są wczytywane ze standardowego wejścia w formacie zgodnym z protokołem ramek. Wstrzykiwanie odbywa się z wykorzystaniem biblioteki libnet [Schiffman 2004]. Jeśli ramka do wstrzyknięcia jest zbyt mała (standard Ethernet wymaga, aby minimalna wielkość wynosiła 60 bajtów), komponent tx powiększa ją, dopełniając zerowymi bajtami (ang. padding). Gdyby czynność ta nie była wykonywana i tak ostatecznie zrobiłby to sterownik karty sieciowej. Jednak wtedy analiza danych płynących przez interfejs z wykorzystaniem narzędzi typu sniffer nie ujawniłaby dopełnienia, co nie zgadzałoby się ze stanem faktycznym i mogłoby wzbudzać wątpliwości u osoby, która nie jest zaznajomiona z tym faktem.
Komponenty rx i tx wspólnie pozwalają na kompletną, niskopoziomową kontrolę ruchu przychodzącego i wychodzącego przez dany interfejs. Stanowią interfejs do sieci dla innych części aplikacji multispoof.
Rozbicie funkcji podsłuchiwania sieci oraz wstrzykiwania ramek na dwa oddzielne programy, oprócz korzyści związanych z modularyzacją aplikacji, może przydać się także w przyszłości. W kolejnej wersji można stosunkowo łatwo wprowadzić obsługę pracy w sieci bezprzewodowej. Radiowe interfejsy sieciowe charakteryzują się tym, że nie jest możliwe jednoczesne odbieranie i nadawanie. Wiąże się to z tzw. efektem oślepienia, który występuje w momencie zbyt szybkiego przełączenia interfejsu z trybu nadajnika w tryb odbiornika. Konieczne jest zastosowanie dwóch oddzielnych interfejsów sieciowych29): jednego tylko do wysyłania, zaś drugiego tylko do odbierania ramek. Obecna architektura aplikacji poradzi sobie z tym wymogiem, ponieważ każdy interfejs będzie obsługiwany przez osobny komponent30).
Komponent tapio jest odpowiedzialny za utworzenie wirtualnego interfejsu tap oraz komunikację z nim. Program łączy z interfejsem standardowe wejście i wyjście, w ten sposób, że ramki wczytywane z wejścia są na niego wysyłane, zaś ramki z niego odbierane są wypisywane na standardowe wyjście. Proces ten jest zobrazowany na rysunku 3.7. Obsługa wejścia/wyjścia jest realizowana z zachowaniem tekstowego protokołu ramek. Nazwę interfejsu tap, który program ma utworzyć, podaje się jako parametr.
Komponent cmac jest programem typu filtr. Wczytuje on ramki ze standardowego wejścia, następnie jeśli spełnione zostaną kryteria akceptacji, modyfikuje je i wysyła na standardowe wyjście. Modyfikacja dotyczy zmiany adresu MAC ramki. W zależności od trybu podawanego jako parametr przy uruchomieniu, komponent podmienia adres źródłowy lub docelowy. Algorytm działania programu został przedstawiony na rysunku 3.8.
Po uruchomieniu cmac łączy się z komponentem netdb. Z każdej wejściowej ramki program wyodrębnia jej adres IP. Następnie wysyła do netdb zapytanie o ten adres (wykorzystując komendę gethost). Jeśli wpis zostanie znaleziony, to odpowiedź będzie zawierać adres MAC hosta, czas nieaktywności, czas który upłynął od ostatniego testu oraz informacje czy dany adres jest w tej chwili testowany i czy jest w stanie enabled. Komponent cmac testuje, czy uzyskane informacje spełniają opisane w tabeli 3.2 warunki zmiany adresu MAC. Jeśli test wypadnie pomyślnie adres MAC ramki zostaje zmieniony i ramka jest wypisywana na standardowe wyjście.
Warunki | Komponent | Czynność | |||
---|---|---|---|---|---|
age > min_age | test_age > min_test_age | enabled | cur_test | ||
Prawda | – | Prawda | – | cmac | Zmień MAC i wypisz ramkę |
Prawda | – | – | Prawda | ||
Prawda | – | Prawda | – | deta | Wypisz odpowiedź na ARP |
Prawda | – | – | Prawda | ||
Prawda | Prawda | – | – | conncheck | Wykonaj test połączenia |
Prawda | – | Prawda | – | natman | Uwzględnij wpis w LB |
# rx | deta | tx # scanarp | tx
Komponent scanarp ma za zadanie periodyczne wysyłanie zapytań ARP Request do wszystkich hostów, których adresy są zarejestrowane w bazie netdb. Zapytania tego rodzaju są wysyłane, aby stwierdzić które z zarejestrowanych hostów są w danej chwili aktywne, bowiem działające komputery odpowiadają komunikatem ARP Reply31). Algorytm działania programu został przedstawiony na rysunku 3.10. Wysyłanie ramek w sieć jest realizowane za pośrednictwem komponentu tx, z wykorzystaniem protokołu ramek. Komponent pobiera listę hostów z bazy za pomocą komendy dump. Należy podkreślić, że aktywność sieciowa komponentu scanarp ogranicza się wyłącznie do wysyłania pakietów ARP Request. Odbieraniem odpowiedzi ARP Reply zajmuje się opisany dalej komponent deta.
Komponent deta wykonuje dwa zadania, które ze względu na to, że muszą być wykonywane sekwencyjnie zostały zaimplementowane w jednym programie. Są to: wykrywanie aktywności hostów w sieci oraz odpowiadanie na zapytania ARP. Komponent nasłuchuje na fizycznym interfejsie sieciowym (za pośrednictwem programu rx), wyodrębnia adresy IP z przychodzących ramek, a następnie uaktualnia wpisy w bazie netdb. Jeśli z sieci przyjdzie zapytanie ARP Request, wtedy w zależności od zawartości bazy netdb może być udzielona odpowiedź i wysłana w sieć za pośrednictwem tx. Algorytm komponentu deta został przedstawiony na rysunku 3.11.
Komponent ma architekturę typu filtr. Na wejściu pojawiają się ramki, które program przetwarza, uaktualniając bazę netdb. Na wyjście komponent wypisuje ramki ARP Reply. Po odebraniu ramki, deta sprawdza jaki protokół ona niesie. Jeśli jest to protokół IP, to wyodrębniany jest źródłowy adres IP. Jeśli natomiast jest to pakiet ARP, to wyodrębniany jest adres IP komputera, który nadał ten pakiet (może to być zapytanie z sieci, bądź odpowiedź na zapytanie wysłane przez komponent scanarp). W obu przypadkach sprowadza się to do ustalenia adresu IP nadawcy, jednak dla każdego protokołu dana ta zapisana jest w nieco innym miejscu nagłówka (rysunek 3.12).
Gdy źródłowy adres IP jest już znany, komponent sprawdza, czy host ten znajduje się na czarnej liście. Lista ta jest pobierana przy starcie programu ze zmiennej banned komponentu netdb. Składa się ona z adresów, które są bezużyteczne w procesie podszywania się, natomiast pojawiają się w sieci. Zmienna jest definiowana w skrypcie multispoof (który będzie omówiony w podrozdziale 3.6) i zawiera takie adresy, jak 0.0.0.032), 255.255.255.255 oraz adres domyślnej bramy33). Jeśli adres nie należy do czarnej listy komponent wykonuje komendę host na bazie netdb (patrz podrozdział 3.2, w szczególności tabela 3.1). Jako parametry do komendy zostają podane adres IP oraz źródłowy adres MAC ramki. Jeśli w bazie nie ma jeszcze wpisu dla tego hosta, jest on tworzony. Jeśli już jest, to czas, który upłynął od ostatniej aktywności, jest zerowany. Dzięki temu inne komponenty nie zaczną lub zaprzestaną wykorzystywać adres tego hosta, ponieważ stał się on aktywny. Jeśli ramki z tego hosta przestaną przychodzić, to po pewnym czasie inne komponenty z powrotem rozpoczną korzystanie z jego adresu.
Jeżeli przychodząca ramka niesie w sobie pakiet ARP Request, to następnym krokiem jest ustalenie, czy należy wysłać odpowiedź ARP. Odpowiedź ARP powinna być wysłana tylko wtedy jeśli adres, którego dotyczy zapytanie ARP, jest aktualnie w użyciu przez inne komponenty. W przeciwnym wypadku, tzn. jeśli fizyczny host o takim adresie jest aktywny, odpowiedź ARP mogłaby spowodować problemy w sieci34). Dlatego przed wysłaniem odpowiedzi program deta wykonuje zapytanie do bazy netdb, tym razem korzystając z komendy gethost. Jeśli host wystarczająco długo nie był aktywny oraz jeśli ma flagę enabled (patrz zestawienie warunków w tabeli 3.2 oraz opis komponentu conncheck w podrozdziale 3.5.1) to ramka z odpowiedzią ARP jest tworzona i wypisywana na standardowe wyjście.
Ostatnie zadanie aplikacji to typowanie nieaktywnych hostów które będą wykorzystywane w procesie zmiany adresów. Polega to na testowaniu łączności oraz przeładowywaniu reguł NAT odpowiedzialnych za równoważenie obciążenia. W procesach tych uczestniczą trzy komponenty, spośród których dwa nie zostały jeszcze omówione: conncheck i natman. Na rysunku 3.13 przedstawiono schemat tej części aplikacji, z uwzględnieniem połączeń między komponentami.
Komponent conncheck decyduje które adresy z bazy netdb mogą być wykorzystywane w procesie podszywania się. Może się bowiem zdarzyć, że host znajdujący się w bazie netdb nie ma połączenia z Internetem (np. jego adres został zablokowany na routerze). Podszywanie się pod host, który nie ma łączności z siecią globalną mija się z celem aplikacji multispoof. Aby temu zapobiec program wybiera nieaktywne hosty i co pewien czas wykonuje dla każdego z nich test połączenia korzystając ze skryptu access-test. Adres hosta, który podlega testowaniu, jak i inne informacje są przekazywane do skryptu przez zmienne środowiskowe (tabela 3.3). Skrypt zwraca kod zakończenia równy 0, jeśli połączenie z Internetem zostało poprawnie zweryfikowane. Jeśli skrypt nie zdołał pozytywnie przetestować połączenia, to zwraca 1. Wersja aplikacji multispoof, która jest dołączona do tego opracowania, zawiera skrypt wykorzystujący program nmap35). Kod skryptu przedstawiony jest na listingu poniżej.
#!/bin/sh HOST="www.mbank.com.pl" PORT="443" echo "access-test: (debug) checking $_IP started" RESULT=1 nmap -sT -P0 -n -p $PORT $HOST 2> /dev/null | \ egrep "^$PORT" | grep -q "open" && RESULT=0 echo "access-test: (debug) checking $_IP finished (result: $RESULT)" exit $RESULT
Po wywołaniu skryptu, program nmap wysyła segment TCP SYN na port 443 hosta o adresie www.mbank.com.pl. Jeśli otrzyma w odpowiedzi segment SYN ACK, wypisuje na standardowe wyjście stosowny komunikat. Komunikat jest przetwarzany przez narzędzie grep, które zwraca odpowiednią wartość logiczną, wykorzystywaną dalej przez skrypt do ustawienia zmiennej RESULT. Ostatnim krokiem jest zwrócenie wartości tej zmiennej. Metoda oparta na programie nmap została wybrana ze względu na to, że program ten generuje ruch sieciowy o stosunkowo niskim natężeniu. Cała transmisja składa się z jednego lub kilku zapytań DNS oraz rozpoczęcia połączenia TCP. Pakiety są małe i jest ich niewiele36).
Zmienna | Przykładowa zawartość (czasy w sekundach) | Opis |
---|---|---|
_IP | 156.17.40.16 | Adres IP hosta. |
_MAC | 00:e0:7d:dc:62:8c | Adres MAC hosta. |
_AGE | 1337 | Czas nieaktywności hosta. |
_TEST_AGE | 6858 | Czas, który upłynął od ostatniego testu. |
_ENABLED | 1 | Stan flagi enabled w chwili testu. |
_MIN_AGE | 300 | Minimalny czas nieaktywności hosta. |
_MIN_TEST_AGE | 3600 | Minimalny czas między testami. |
_NF_CHAIN | multispoof-test | Łańcuch dla tymczasowych reguł iptables. |
Testowanie połączenia z Internetem zostało zorganizowane w powyższy sposób, aby użytkownik miał możliwość łatwego modyfikowania tego elementu i dostrajania go do sieci w której jest uruchamiana aplikacja multispoof. Także w tym celu do skryptu są przekazywane zmienne środowiskowe. W tej wersji skryptu bowiem nie są one wykorzystywane.
Aby przetestować połączenie z Internetem konkretnego hosta, komponent conncheck przed uruchomieniem skryptu access-test musi załadować do jądra regułę NAT37), która spowoduje, że dane wysyłane i odbierane przez skrypt będą wykorzystywały adres IP testowanego hosta. Odbywające się aktualnie transmisje użytkownika aplikacji multispoof nie powinny zostać zakłócone, dlatego reguła musi dotyczyć tylko transmisji wykonywanych przez skrypt i programy przez niego uruchamiane. Aby spełnić ten warunek wykorzystywany jest moduł owner. Moduł ten pozwala na wyodrębnienie transmisji konkretnego procesu (wykorzystując jego PID) lub ich zbioru (za pomocą numeru SID - session ID38)). Ponieważ wszystkie komponenty aplikacji multispoof są wywoływane przez jeden skrypt (opisany w podrozdziale 3.6), numer SID każdego procesu jest taki sam. Skrypt access-test jest jedyną częścią aplikacji, która wykonuje transmisje sieciowe, dlatego wykorzystanie w regule tego numeru nie zakłóci pracy programu. Jeśli numerem SID będzie 42, transmisje mają wykorzystywać interfejs tap0, zaś adres źródłowy ma być podmieniany na 156.17.40.16, to wywołanie programu iptables będzie miało poniższą formę:
# iptables -t nat -A POSTROUTING -o tap0 \ -m owner --sid-owner 42 -j SNAT --to-source 156.17.40.16
W rzeczywistości, aplikacja multispoof wykorzystuje dodatkowe łańcuchy iptables. Jest to opisane dokładniej w podrozdziale 3.6.
Przed uruchomieniem skryptu access-test, oprócz załadowania reguły NAT, conncheck wywołuje na bazie adresów netdb komendę do start-test (zobacz tabela 3.1). Komenda ta ustawia flagę, która informuje inne komponenty, że dany host jest aktualnie testowany. Dzięki temu np. komponent cmac zmienia i przesyła ramki nawet dla hostów, które nie są w stanie enabled (zachowanie poszczególnych komponentów w zależności od stanu flag jest przedstawione w tabeli 3.2). Dopiero po tym wywoływany jest skrypt testujący. Następnie w zależności od wyniku testu, stan hosta jest za pomocą komendy do zmieniany na enabled lub disabled. Zostaje jeszcze usunięcie znacznika testowania oraz reguły NAT, po czym komponent przechodzi do testowania następnego adresu. Algorytm działania programu jest przedstawiony na rysunku 3.14.
Komponent natman jest odpowiedzialny za utrzymywanie aktualności reguł NAT wykorzystywanych do równoważenia obciążenia. Program periodycznie pobiera listę hostów z bazy netdb i na jej podstawie buduje listę hostów, które są w stanie enabled i były nieaktywne przez wystarczającą długi czas. Tak przygotowana lista jest porównywana z listą z poprzedniej iteracji. Jeśli listy różnią się, to znaczy, że w bazie pojawiły się nowe hosty, które można wykorzystać, lub dotychczas nieaktywne komputery stały się aktywne. W obu przypadkach komponent przeładowuje listę reguł NAT, aby uwzględnić zmiany. Rysunek 3.15 przedstawia algorytm działania programu natman.
Równoważenie obciążenia to proces realizowany przez podsystem Netfilter jądra Linuksa, rozdzielający połączenia sieciowe i przypisujący je do poszczególnych adresów, które w danej chwili są wykorzystywane. Dzięki temu użytkownik może wygenerować ruch, którego natężenie wielokrotnie przekracza limit dla pojedynczego hosta.
Aby lepiej zrozumieć, na czym polega równoważenie obciążenia, należy prześledzić drogę pojedynczego pakietu. Pakiet, który przychodzi na interfejs wirtualny tap, jest porównywany z tablicą nawiązanych połączeń conntrack. Z każdym połączeniem związany jest adres IP. Jeśli pakiet należy do nawiązanego połączenia, to jego adres źródłowy zostanie zmieniony na ten, który jest zapisany w tablicy conntrack. Jeśli zaś pakiet nie należy do żadnego z istniejących połączeń, tzn. jest pierwszym pakietem połączenia (np. jest to pakiet TCP z ustawioną opcją SYN39)), to adres, jaki zostanie mu przypisany, jest wybierany z puli dostępnych odpowiednim algorytmem rozkładania obciążenia. W obecnej wersji wykorzystywany jest algorytm round robin40). Polega on na tym, że każde nowe połączenie dostaje kolejny adres IP modulo liczba dostępnych adresów. Tzn. jeśli dostępnych jest 10 adresów, to pierwsze połączenie dostanie pierwszy adres, drugie drugi itd., zaś połączenie jedenaste otrzyma adres pierwszy. Jest to najprostsza metoda równoważenia obciążenia, nie uwzględniająca stopnia wykorzystania poszczególnych adresów. W kolejnych wersjach aplikacji multispoof mogą pojawić się inne metody.
# iptables -t nat -A POSTROUTING -o tap0 \ -m nth --every 4 --packet 0 \ -j SNAT --to-source 156.17.40.16 # iptables -t nat -A POSTROUTING -o tap0 \ -m nth --every 4 --packet 1 \ -j SNAT --to-source 156.17.40.17 # iptables -t nat -A POSTROUTING -o tap0 \ -m nth --every 4 --packet 2 \ -j SNAT --to-source 156.17.40.18 # iptables -t nat -A POSTROUTING -o tap0 \ -m nth --every 4 --packet 3 \ -j SNAT --to-source 156.17.40.19Dla czytelności w powyższym przykładzie reguły umieszczane są bezpośrednio we wbudowanym łańcuchu POSTROUTING. Aplikacja multispoof wykorzystuje dedykowany łańcuch, w celu bardziej elastycznego zarządzania regułami. Tabela nat na której operują reguły posiada cechę, która nie jest spotykana w innych tabelach – mianowicie trafiają do niej tylko te pakiety, które inicjują połączenia43). Pozostałe pakiety ulegają translacji automatycznie, w zależności od tego do jakiego połączenia należą. Funkcja ta jest zapewniana przez moduł śledzenia połączeń conntrack podsystemu Netfilter i może być wymuszona także dla innych tabel z wykorzystaniem filtra state.
Śledzenie połączeń ulegających translacji jest fundamentalnych mechanizmem, dzięki któremu transmisja może odbywać się prawidłowo. W przeciwnym wypadku, tzn. gdyby mechanizm ten został zdezaktywowany, translacja dotyczyłaby pojedynczych pakietów a nie połączeń. Doprowadziłoby to do sytuacji, w której poszczególne pakiety jednego połączenia miałyby różne źródłowe adresy IP, co uniemożliwia właściwą identyfikację połączenia przez host, znajdujący się po jego drugiej stronie. Adres IP bowiem jest jedną z danych, które identyfikują połączenie44) i przez czas jego trwania muszą pozostać niezmienne.
Ideę procesu rozkładania obciążenia została przedstawiona na rysunku 3.16. Pakiety zobrazowane są na nim jako różnokolorowe kółka. Kolor ich wypełnienia określa połączenie do którego przynależy dany pakiet. Środkowy okrąg określa miejsce, w którym przeprowadzany jest NAT według tabeli conntrack, która łączy połączenia z adresami IP. Na rysunku prawie wszystkie połączenia są już nawiązane i mają przypisane adresy IP. Pakiety oznaczone czerwonymi kółkami rozpoczynają połączenie, któremu adres IP zostanie przypisany zgodnie z algorytmem round robin.
Skrypt multispoof stanowi tę część aplikacji, która jest odpowiedzialna za uruchamianie jej poszczególnych zadań. Chociaż zarówno skrypt, jak i pozostałe komponenty, są plikami wykonywalnymi, po instalacji całej aplikacji tylko skrypt staje się dostępny dla użytkownika w standardowej ścieżce dostępu PATH. Pozostałe komponenty są umieszczane w osobnym katalogu, nie uwzględnionym w ścieżce. Dzieje się tak, ponieważ działając samodzielnie, komponenty nie spełniają użytecznych zadań, zaś udostępnianie nieprzydatnych programów w systemie jest pozbawione sensu.
Skrypt został zaprogramowany w języku Bourne shell. Język ten został wybrany ze względu na to, że uruchamianie podprocesów jest w nim maksymalnie uproszczone. To samo dotyczy komunikacji międzyprocesowej z wykorzystaniem potoków. Oba te mechanizmy są intensywnie wykorzystywane w aplikacji multispoof. Język shell stanowi framework, czyli niejako środowisko, w którym wykonują się poszczególne komponenty aplikacji [Raymond 2003].
W celu oceny skuteczności aplikacji multispoof zostały przeprowadzone testy. Miały one miejsce w sieci osiedlowej zbudowanej z około 500 komputerów. Wszystkie komputery są podłączone do tej samej fizycznej sieci ethernetowej. Centralny przełącznik posiada agenta SNMP, co umożliwia monitorowanie wykorzystania portów ethernetowych pod względem ilości adresów MAC, które na nich się pojawiają. Każdy adres MAC jest utrzymywany w pamięci urządzenia przez 10 minut od ostatniego pojawienia się. Wykres 4.1 przedstawia liczbę aktywnych adresów MAC w funkcji czasu przy normalnym wykorzystaniu sieci (dane pochodzą z 9 dni). Można zaobserwować, że krzywa ma wyraźnie periodyczny charakter. Wynika to z faktu, że więcej komputerów korzysta z sieci za dnia, niż w nocy.
Nie wszystkie komputery działające w sieci mają dostęp do Internetu. Te które posiadają łączność z globalną siecią są zróżnicowane pod względem przydzielonej przepustowości maksymalnej. Większość hostów ma limit 80 kb/s, zaś pozostałe wykorzystują 200 kb/s lub 24 kb/s. Dwie ostatnie grupy mają podobną liczebność.
Celem testów było zbadanie jak dużą przepustowość uda się osiągnąć z wykorzystaniem aplikacji multispoof w badanej sieci. W tym celu w sieci umieszczono komputer47) na którym była uruchomiona aplikacja oraz skrypt generujący ruch sieciowy. Skrypt wykorzystując program netcat48) łączył się z serwerem usługi chargen, który znajdował sie za traffic shaperem, czyli routerem ograniczającym ruch dla poszczególnych hostów w sieci. Szybkość transmisji była mierzona przez program tcpstat49), który został uruchomiony w dwóch kopiach, każda w innym miejscu sieci. Kopia uruchomiona na hoście testowym pozwalała badać przepustowość tego hosta, zaś kopia która działała na routerze służyła do mierzenia całego ruchu generowanego przez sieć. Wszystkie testy dotyczyły ruchu płynącego z Internetu do wewnątrz sieci. Schemat układu badawczego jest przedstawiony na rysunku 4.2.
Chargen (ang. character generator, generator znaków) jest standardową usługą testową, która domyślnie działa na porcie 19/TCP bądź UDP50). Natychmiast po podłączeniu się klienta, serwer zaczyna wysyłać do niego kolejne znaki ASCII. W testach usługę zapewniał program inetd51). Aby wytworzyć maksymalny ruch, skrypt uruchamiał 200 kopii programu netcat, co w efekcie dawało tyle samo niezależnych połączeń z usługą chargen. Tak duża liczba połączeń miała służyć temu, aby każdy z maksymalnie stu wykorzystywanych adresów otrzymał po dwa połączenia52) dzięki rozkładaniu obciążenia (więcej na temat równoważenia obciążenia w podrozdziale 3.5.2). Następnie, skrypt wchodził w nieskończoną pętlę, w której co 2 sekundy najstarsza kopia programu netcat była usuwana z pamięci, a na jej miejsce uruchamiana była nowa. Dzięki temu co 2 sekundy wykonywane było nowe połączenie, zaś liczba procesów pozostawała stała. Ta rotacja miała zapewnić, aby w połączeniach wykorzystywane były wszystkie adresy. Zasadę działania skryptu przedstawia rysunek 4.3.
Celem przyświecającym drugiemu testowi było określenie jak aplikacja multispoof zachowuje się w warunkach typowych. Dlatego baza netdb została wyczyszczona. Test rozpoczął się o godzinie 18, ze względu na fakt, że wtedy ruch w sieci jest nasilony i możliwe jest zgromadzenie dużej liczby adresów. Wyniki testu przedstawia wykres 4.6. Od razu można zauważyć, że uzyskana przepustowość nie jest wysoka, mimo, że ponad dwa razy większa od maksymalnej szybkości transmisji pojedynczego hosta i około sześć razy wyższa niż prędkość średnia. Test w małym stopniu wpłynął na ruch sumaryczny, którego stanowił średnio piątą część. Tak słabe (w porównaniu z testem poprzednim) wyniki mają kilka przyczyn. Pierwszą z nich jest pusta baza adresów, z którą program zaczynał działanie. Czas, który upłynął od uruchomienia do rozpoczęcia aktywności był stosunkowo długi (około 8 minut), ponieważ adresy, które program kolekcjonował, były wtedy używane przez hosty fizyczne. Dlatego też krzywa wykorzystania adresów rośnie powoli. W 15. minucie od momentu rozpoczęcia działania, aplikacja wykorzystuje zaledwie 7 adresów. O ile liczba ta zwiększa się, przepustowość utrzymuje się na stałym poziomie. Najpewniej wynika to z faktu, że hosty znajdujące się w bazie aplikacji są zapisane w stałej kolejności. Połączenia sieciowe skryptu testowego są wykonywane zgodnie z tą kolejnością (wynika to z zastosowanego algorytmu równoważenia obciążenia). Dodatkowo, częste przeładowania reguł rozkładania obciążenia powodują, że faworyzowane są adresy znajdujące się na początku. Przypisanie nadmiernej liczby połączeń do adresów początkowych (szczególnie jeśli hosty, do których one należą, mają niską przepustowość) skutkuje pogorszeniem szybkości transmisji54). Test trwał przez kilka godzin (co widać na wykresie 4.5), jednak choć liczba wykorzystywanych adresów stopniowo się zwiększała, uzyskiwana przepustowość pozostawała bez zmian. Oprócz wspomnianego problemu związanego z nierównomiernym przydziałem połączeń, znaczenie miał także fakt, że komponent netdb w obecnej wersji posiada błąd skutkujący tzw. wyciekami pamięci. Powodują one, że aplikacja w miarę upływu czasu działa coraz gorzej55), zaś w pewnej chwili jej działanie jest przerywane przez system operacyjny, ze względu na zbyt wysokie zużycie pamięci.
Techniki polegające na zmianie adresów IP oraz MAC, opisane wraz z metodami pomocniczymi w podrozdziale 1.3, stanowią zagrożenie, przed którym sieci lokalne powinny być chronione. W rozdziale 3 przedstawiona została koncepcja oraz implementacja programu multispoof, opracowanego w celu praktycznej demonstracji problemu kradzieży usługi dostępu do Internetu. Istnieją dwa rodzaje metod, które pozwalają w różnym stopniu zmniejszyć ryzyko które niesie możliwość podszywania się w celu uzyskiwania nieautoryzowanego dostępu do sieci zewnętrznej. Najskuteczniejsze są metody proaktywne, lecz koszt wdrożenia odpowiedniej infrastruktury może być wysoki. Metody reaktywne są tańsze, jednak nie tak skuteczne i na dłuższą metę mogą być mniej opłacalne od środków zapobiegawczych. Oba rodzaje metod zostaną omówione w tym rozdziale.
Metody reaktywne to takie, które nie służą zapobieganiu, lecz koncentrują się na detekcji ataków. Czasami wystarczy, że administrator wykryje, że w sieci lokalnej, która znajduje się pod jego nadzorem, ktoś podszywając się pod host nieaktywnego użytkownika, nielegalnie korzysta z dostępu do Internetu. Jeśli dodatkowo sieć obejmuje mały obszar, zaś administrator posiada łatwy dostęp do przełączników sieciowych, to fizyczne zlokalizowanie oszusta, choć pracochłonne – jest możliwe. Administrator jest w gorszej sytuacji, jeśli osoba robi to np. w godzinach nocnych, ponieważ odnalezienie miejsca, w którym działa nieuczciwy użytkownik jest możliwe tylko wtedy, kiedy jest on aktywny. Fizyczne lokalizowanie komputera oszusta (przedstawione na rysunku 5.1) polega na selektywnym wyłączaniu przełączników i testowaniu (za pomocą wybranej metody), czy proces fałszowania adresów nadal trwa. Jeśli tak, to oznacza to, że szukanego hosta nie ma w sieci, która znajduje się za przełącznikiem. Jeśli test wykaże brak aktywności oszusta, to należy przypuszczać, że host znajduje się w sieci za wyłączonym przełącznikiem i przejść do kolejnego, który znajduje się za nim. Złożoność tego procesu zależy od rozmiarów i topologii sieci (czym więcej przełączników połączonych szeregowo tym trudniej). Przedstawiona metoda lokalizacji dotyczy sieci zbudowanych w oparciu o niezarządzalne przełączniki lub koncentratory. Jeśli sieć bazuje na urządzeniach inteligentnych to detekcja jest prostsza, bo nie jest wymagana fizyczna interwencja w działanie sieci. Więcej o tym w podrozdziale 5.1.8.
Kilka pierwszych z przedstawionych metod będzie dotyczyło wykrywania nielegalnego podszywania się z wykorzystaniem aplikacji multispoof. Są to metody skuteczne i zazwyczaj proste w implementacji, lecz ograniczają się do detekcji obecnej wersji aplikacji, nie rozwiązując problemu fałszowania adresów w ogólności. Zostały jednak zaprezentowane dla kompletności oraz ze względu na to, że demonstrują słabości programu, które mogą zostać poprawione w następnych wersjach (patrz rozdział 6). Ponieważ są to metody o charakterze tymczasowym, będą określane mianem słabych.
Kolejne metody będą koncentrowały się na detekcji procesu podszywania się pod adresy wielu nieaktywnych hostów na raz. Choć zjawiska towarzyszące temu procesowi nie są tak wyraźne, jak te związane z aktywnością aplikacji multispoof, to ich wykrycie jest możliwe. Metody te nazywane będą silnymi, ponieważ pozwalają na detekcję efektów ubocznych nadużyć związanych z podszywaniem się, które są wspólne dla każdej implementacji tego rodzaju ataków.
# tcpstat -i eth0 -f arp -o "%n " 1 32 40 28 37 44 25 44 23 33 140 38 37 22 22 25 33 28 38 35 23 21 25 33 49 77 48 3 8 29 39 40 27 39 31 22 25 29 32 31 26 32 42 22 27 33 31 32 41 28 22 31 34 21 32 63 75 33 36 41 23 31 36 33 27 33 34 37 38 153 20 22 32 21 25 35 29 31 28 31 39 2 1 25 36 17 40 98 42 38 45 39 25 31 29 30 25 26 32 26 26 37 38 21 34 43 16 24 32 32 21 36 40 40 25 35 74 63 58 38 29 27 38 34 39 41 47 27 24 101 92 24 23 35 20 2 0 27 25 42 33 36 27 25 12Liczby zaznaczone tłustą czcionką są nietypowo duże i świadczą o tym, że co minutę gwałtownie wzrasta liczba pakietów ARP, które pojawiają się w sieci. Może to oznaczać, że działa w niej program multispoof.
Choć badanie aktywności hostów w sieci jest niezbędnym elementem działania każdego programu, który wykorzystuje podszywanie sie pod nieaktywne adresy, to proces monitorowania sieci można zaimplementować inaczej, tak, aby nie było możliwe jego wykrycie tą metodą. Więcej na ten temat w rozdziale 6.
Podobną metodą jest technika bazująca na zachowaniu komponentu conncheck, który domyślnie wysyła pakiety testowe co godzinę. Pakiety są wysyłane spod wszystkich adresów, które aplikacja ma zarejestrowane w bazie i które są nieaktywne w sieci. Aktualna wersja aplikacji do testowania łączności wykorzystuje skrypt access-test, który wykonuje zawsze ten sam test, mianowicie rozpoczęcie połączenia TCP na porcie 443 z hostem www.mbank.com.pl. Jeśli administrator analizując ruch sieciowy zauważy, że takie połączenia odbywają się regularnie to może przypuszczać, że w sieci działa aplikacja multispoof.
Inną metodą detekcji bazującą na tej samej słabości jest sprawdzanie, czy każdy host, który wysyłał jakieś dane, po kilku sekundach odpowiada na zapytania ARP. Aplikacja multispoof przez czas działania testu odpowiada na nie, jednak jeśli test wypadnie niepomyślnie, to jest on natychmiast blokowany, co obejmuje także ignorowanie zapytań ARP.
Obie metody można zaliczyć do klasy słabych, ponieważ proces testowania łączności może być przeprowadzany w inny, trudniejszy do wykrycia sposób. W rozdziale 6 przedstawiono możliwe techniki utrudniające detekcję z wykorzystaniem tej metody.
Kolejną słabą metodą detekcji jest analizowanie ruchu sieciowego pod kątem standardowych transmisji. Po włączeniu, komputer wysyła zazwyczaj kilka pakietów DHCP. Przed rozpoczęciem komunikacji z siecią zewnętrzną wysyła także zapytanie ARP o adres fizyczny routera. Popularne systemy operacyjne firmy Microsoft z domyślnie uaktywnionym klientem usługi udostępniania plików i drukarek co pewien czas wysyłają specyficzne pakiety rozgłoszeniowe UDP. Aplikacja multispoof nie generuje wymienionych transmisji. Z analizy ruchu sieciowego można wnioskować, że jeśli dany adres jest aktywny, zaś nie wykryto powiązanych z nim standardowych transmisji, to może on być wykorzystywany przez tę aplikację.
Wykrywanie braku standardowych transmisji może wymagać napisania prostego programu, który będzie analizował ruch sieciowy i uaktualniał listę aktywnych hostów, oraz sprawdzał, czy każdy z nich posiada skojarzone standardowe transmisje.
Opisana metoda nie należy do silnych ze względu na to, że standardowe transmisje można symulować, co jest opisane dokładniej w rozdziale 6.
Kolejna słaba metoda bazuje na tym, że w obecnej wersji aplikacja multispoof blokuje wszelkie połączenia sieciowe, które są inicjowane z sieci. Adresy wykorzystywane przez aplikację nie odpowiadają na zapytania ICMP Echo oraz nie udostępniają standardowych usług sieciowych. Administrator może periodycznie skanować hosty, które znajdują się w sieci, celem sprawdzenia, czy odpowiedzi na pewne typy zapytań nie zmieniają się. Jeśli na przykład host w dzień udostępnia jakąś usługę sieciową, zaś w nocy nie, a sytuacja taka się powtarza, to może oznaczać, że w sieci działa aplikacja typu multispoof.
Podobną metodą jest pasywne wykrywanie systemu operacyjnego na podstawie danych, które transmituje dany host56). Podejrzenia może wzbudzić sytuacja, kiedy wykryty zostanie system operacyjny inny, niż zazwyczaj rozpoznawany dla badanego hosta. Może to jednak także oznaczać, że użytkownik tego komputera po prostu korzysta z więcej niż jednego systemu operacyjnego.
Opisane metody trudno zaklasyfikować do jednej z grup opisanych na początku tego podrozdziału. Skanowanie wykorzystuje ewidentną słabość aktualnej wersji aplikacji multispoof, dlatego może zostać uznane za słabe. Jednak zabezpieczenie się przed skanowaniem (opisane w rozdziale 6) jest możliwe tylko do pewnego stopnia. Regularne monitorowanie wykorzystywanych systemów operacyjnych także pozwala ze stosunkowo wysokim prawdopodobieństwem odpowiedzieć na pytanie, czy w sieci występują nadużycia związane z podszywaniem się.
Następną metodą jest wykorzystanie komputerów, które znajdują się pod pełną lub częściową kontrolą administratora sieci. Administrator konfiguruje specjalny host, którego jedynym zadaniem jest obecność w sieci. Ta obecność powinna być zauważalna dla innych, dlatego host musi generować transmisje sieciowe. Im aktywność tego hosta jest bardziej zbliżona do prawdziwej, tym metoda jest silniejsza. Co pewien czas komputer jest wyłączany na pewien. W tym czasie administrator analizuje ruch sieciowy. Jeśli adres tego hosta pojawi się w sieci, jest to pewna oznaka, że w sieci działa oszust, którego komputer podszywa się pod adres hosta-pułapki.
Metodą zbliżoną jest korzystanie z pomocy zaufanych użytkowników sieci, którzy informują administratora o wszystkich włączeniach i wyłączeniach swoich komputerów. Może to być zautomatyzowane przez wykorzystanie specjalnego oprogramowania. Jeszcze jedną wariacją jest udostępnienie użytkownikom informacji o tym, kiedy ich komputery wykazywały aktywność sieciową i nakazanie zgłaszania wszelkich niezgodności.
Metody wykorzystujące hosty-pułapki są silne, zaś z wykorzystaniem odpowiedniego oprogramowania stosunkowo wygodne w użyciu.
Wykorzystywanie procesu podszywania się w codziennej aktywności sieciowej powoduje, że mogą powstawać pewne odstępstwa od normy w zakresie transmisji. Część aplikacji, które komunikują się z Internetem, wykorzystuje w tym celu kilka połączeń (zazwyczaj z użyciem protokołu TCP). Jeśli komputer oszusta podszywa się pod wiele hostów, będą się zdarzać sytuacje, kiedy kilka połączeń jednej aplikacji zostanie przydzielonych do różnych adresów IP57). W wielu przypadkach zależności między połączeniami są znane (kolejność, czas który upływa między kolejnymi transmisjami, liczba bajtów i pakietów), zaś jeśli połączenia nie są szyfrowane, można wydobyć z nich dodatkowe informacje. Jako przykład można podać korzystanie z programów, które przy starcie łączą się z serwerem (np. w celu zalogowania lub pobrania aktualizacji), a następnie pobierają z sieci i wyświetlają reklamę. Do tej klasy można zaliczyć aplikacje, które oferują dostęp do bezpłatnej usługi w zamian za dostarczanie treści marketingowych, jak komunikatory internetowe lub darmowe oprogramowanie antywirusowe. Jeśli oszust podszywa się pod wiele hostów na raz, to logowanie i pobieranie reklamy, jako dwa niezależne połączenia, mogą odbywać się z użyciem dwóch różnych adresów IP. Między tymi transmisjami istnieje silna zależność czasowa, mianowicie pobranie reklamy następuje natychmiast po zalogowaniu. Dodatkowo, w przypadku wielu programów zdarza się, że identyfikator użytkownika przesyłany przy logowaniu, jest wysyłany także przy pobieraniu reklamy (np. za pomocą mechanizmu cookies).
Aby wykorzystać te informację w celu wykrywania fałszowania adresów, niezbędne jest stworzenie specjalnego oprogramowania, które będzie poddawać je analizie oraz korelować transmisje z różnych adresów i powiadamiać administratora w przypadku wykrycia aktywności tej samej kopii programu na wielu adresach. Metoda ta wymaga dużych nakładów początkowych, związanych z pisaniem oprogramowania i jego wdrażaniem w sieci, oraz stałych kosztów utrzymywania i aktualizacji bazy wykrywanych aplikacji. W zamian otrzymuje się silną metodę detekcji, którą trudno wprowadzić w błąd.
Kolejna metoda opiera się na nietypowym efekcie, który powstaje w momencie włączenia się do sieci komputera, którego adres był do tej pory wykorzystywany w procesie podszywania się. Jeśli oszust nie chce zostać zauważony, musi stosować mechanizm unikania konfliktów w sieci, np. ten zaimplementowany w komponencie deta aplikacji multispoof. Polega on na podsłuchiwaniu sieci i w razie odebrania ramki pochodzącej od hosta, którego adres jest używany w procesie podszywania się, jego dalsze wykorzystanie jest natychmiast blokowane. Ten moment może być wykorzystany do wykrycia programu multispoof, ponieważ mocno odbiega od typowego zachowania sieci. Normalna aktywność hosta w pewnej chwili ulega natychmiastowemu przerwaniu, a w tym samym czasie pojawiają się nowe transmisje, świadczące o uruchamianiu się komputera (takie jak zapytania DHCP, ARP, DNS itd.). Przypomina to sytuację nagłego zawieszenia się komputera, po którym następuje jego wyłączenie, ponowne włączenie, uruchomienie systemu operacyjnego i konfiguracja sieci, z tym, że czas od wyłączenia do konfiguracji sieci jest skrócony do zera. Jest to moment charakterystyczny i napisanie aplikacji, która wykrywa go na podstawie ruchu sieciowego i bieżących połączeń nie jest trudne. Jest możliwe także napisanie programu, który symuluje ruch sieciowy włączającego się komputera, a następnie bada reakcje transmisji, które wykorzystują ten adres. Jest to efektywna, silna metoda detekcji, przed którą niełatwo jest się zabezpieczyć.
Ten podrozdział koncentruje się na metodach proaktywnych. Polegają one na zmianie środowiska sieciowego w taki sposób, aby kradzież usługi, jaką jest dostęp do Internetu, nie była możliwa z wykorzystaniem podszywania się. Aby przegląd metod ochronnych był kompletny, na początku zostanie zaprezentowane podejście o charakterze tymczasowym, które polega na blokowaniu aplikacji multispoof. Następnie wprowadzony zostanie model dostępu do usługi w sesjach, wzorowany na systemie zabezpieczeń wirtualnych sieci prywatnych, który będzie służył do oceny efektywności poszczególnych metod prewencyjnych. Pod koniec rozdziału zaprezentowane zostaną techniki sprzętowe.
Wydaje się, że właśnie zabezpieczenia na poziomie sprzętu sieciowego oraz metody wykorzystujące VPN stanowią najskuteczniejsze zabezpieczenie przez podszywaniem się. Jednak administratorzy, którzy planują wprowadzić zabezpieczenia w swoich sieciach, przed wyborem metody powinni przeprowadzić ocenę zagrożeń i podatności oraz kosztów wdrożenia każdej z technik prewencyjnych, co pomoże podjąć właściwą decyzję.
Najprostszym sposobem na uniemożliwienie działania aplikacji multispoof jest symulacja aktywności hostów, które w danej chwili są wyłączone. Ponieważ aplikacja w aktualnej wersji podszywa się tylko pod hosty, które nie wykazują objawów obecności w sieci przez jakiś czas, ten sposób całkowicie uniemożliwia jej działanie. Program, który realizowałby to zadanie, można zaimplementować nawet jako skrypt shellowy, wykorzystując program arping59) do badania aktywności hostów, oraz narzędzie ifconfig do definiowania dodatkowych adresów na interfejsie. Skrypt co zdefiniowany czas sprawdzałby, które hosty nie są aktywne60), a następnie definiowałby je jako aliasy IP dla interfejsu sieciowego. Resztą zajmowałoby się jądro systemu – udzielałoby ono odpowiedzi na zapytania ARP o te adresy. Aplikacja multispoof co pewien czas wysyła takie zapytania, zaś otrzymanie odpowiedzi traktuje jako dowód na obecność danego hosta w sieci, co powoduje, że nie jest on uwzględniany w procesie podszywania się.
W momencie pojawienia się fizycznego hosta w sieci, skrypt wykrywałby to i alias dla jego adresu byłby usuwany. Aby zapobiec konfliktom IP, skrypt powinien zostać wzbogacony o wywołania arptables61), które blokowałyby udzielanie odpowiedzi ARP, jeśli zapytanie dotyczyłoby adresu, który je wygenerował62).
Innym sposobem na symulowanie aktywności hostów w sieci jest uruchomienie drugiej kopii aplikacji multispoof przez administratora (sic!). Jeśli do bazy aplikacji zostanie wprowadzona lista zarejestrowanych komputerów, zaś program będzie działał przez cały czas, to wszystkie zadania przedstawionego powyżej skryptu będą przezeń spełniane. Dodatkowym atutem tego rozwiązania jest automatyczna aktualizacja bazy hostów, wykonywana przez aplikację multispoof w pełni samodzielnie.
Opisana metoda posiada jednak szereg słabości, które mogą być wykorzystane w celu obniżenia jej skuteczności do zera. Przyszłe wersje programu multispoof mogą implementować mechanizmy służące do przełamywania tego zabezpieczenia.
W następnych podrozdziałach zostaną przedstawione rozwiązania zabezpieczające dostęp do Internetu w sieci lokalnej przed użytkownikami, którzy fałszują adres źródłowy podając się za innych. Każde z nich (z wyjątkiem rozwiązań sprzętowych) będzie analizowane pod kątem spełniania powyższych warunków.
Wszystkie rodzaje proxy wymagają ręcznej konfiguracji każdej aplikacji na hostach klienckich. Dla SOCKS istnieją programy70), które ujednolicają ten proces, a także pozwalają na uruchamianie aplikacji, które nie mają obsługi tego protokołu. Jednak mimo tego wygoda korzystania z tego typu rozwiązań nie jest wysoka.
Bezpieczeństwo oferowane przez to rozwiązanie nie jest wysokie. Każde połączenie sieciowe jest osobną sesją (patrz poprzedni podrozdział), co powoduje, że użytkownik podczas normalnego korzystania z Internetu wykonuje ich bardzo wiele. Logowanie polega na wysłaniu nazwy użytkownika i hasła71), zaś wylogowanie to zwykłe zakończenie połączenia. O ile taki sposób wylogowywania przy częstych sesjach nie stanowi dużego problemu72), to logowanie stanowi poważne zagrożenie, ponieważ poufne informacje są wysyłane w postaci jawnej. Dodatkowo, ze względu na dużą liczbę sesji w czasie, nazwa użytkownika i hasło pojawiają się w sieci często, co stanowi ułatwienie dla osoby, która zechciałaby wejść w posiadanie tych danych. Sama transmisja jest w pewien sposób zabezpieczona, ponieważ do każdego połączenia dodawane są informacje uwierzytelniające, co uniemożliwia podszywanie się bez ich znajomości. Jednak te informacje są dla każdego połączenia takie same, identyczne z danymi używanymi do logowania73) oraz łatwe w uzyskaniu.
Oprogramowanie portalowe wchodzi w skład produktów komercyjnych74) oraz projektów Open Source75). Zaletą rozwiązań portalowych jest łatwość obsługi, ponieważ do uwierzytelnienia wystarcza przeglądarka www.
Podobną metodą uwierzytelniania użytkowników jest Authpf76). Różnica występuje w sposobie logowania. Zamiast korzystać z formularza www, użytkownik łączy się z serwerem operatora przez SSH i podaje nazwę użytkownika oraz hasło. Jeśli logowanie SSH przebiegnie pomyślnie adres użytkownika jest odblokowywany na firewallu tak jak w przypadku rozwiązania portalowego. Zakończenie połączenia SSH powoduje, że adres jest natychmiast blokowany z powrotem.
Bezpieczeństwo obu metod jest niskie. W przypadku rozwiązań portalowych największe ryzyko wiąże się z logowaniem do sesji. Większość rozwiązań nie stosuje bezpiecznego typu połączenia, tak więc dane użytkownika, takie jak login i hasło są przesyłane w postaci jawnej. Ochrona transmisji za pomocą mechanizmu SSL tylko częściowo rozwiązuje ten problem. Jest tak, ponieważ pierwsze połączenie, przekierowujące na stronę logowania odbywa się z wykorzystaniem protokołu HTTP77), który nie jest bezpieczny. Atakujący może przechwycić to połączenie78) i przekierować na serwer, który znajduje się pod jego kontrolą. Serwer ten może prezentować stronę logowania, która jest identyczna z oryginalną79). Sfabrykowana strona może nawet wykorzystywać bezpieczne połączenie HTTPS80), aby odróżnienie jej od prawdziwej było jeszcze bardziej utrudnione. Jeśli użytkownik zaloguje się wykorzystując fałszywą stronę logowania, oszust stanie się posiadaczem jego danych uwierzytelniających.
Logowanie w metodzie Authpf jest mniej podatne na zagrożenia, ponieważ domyślnie wykorzystuje bezpieczne połączenie SSH. Istnieje atak na ten typ połączeń, który pozwala na przechwycenie transmisji81). Jednak jest on niezauważalny dla użytkownika tylko wtedy, gdy jest przeprowadzany w momencie logowania się po raz pierwszy. Próby ataków na kolejne połączenia skutkują wyraźnym ostrzeżeniem, które wyświetla klient SSH82).
Przy założeniu, że logowanie przebiegło w sposób bezpieczny, należy przyjrzeć się bezpieczeństwu transmisji w obrębie sesji. Zarówno rozwiązanie portalowe jak i Authpf nie zapewniają uwierzytelniania przesyłanych przez użytkownika danych. Powoduje to, że w trakcie trwania sesji, jeśli użytkownik jest nieaktywny, atakujący zmieniając adresy IP i MAC może korzystać z dostępu do Internetu.
Również obie metody nie zabezpieczają przed atakiem odmowy usług, związanym z nieautoryzowanym wylogowaniem się. W przypadku Authpf wystarczy, że atakujący przerwie sesję SSH. W metodzie opartej na portalu wylogowywanie odbywa się przez wysłanie odpowiedniego zapytania HTTP z adresu klienta, które może zostać sfałszowane przez atakującego.
Nawiązanie połączenia VPN odpowiada rozpoczęciu sesji przez użytkownika i przeprowadzeniu procesu logowania. Protokoły IPsec i OpenVPN posiadają mechanizmy uwierzytelniające, które wykorzystują silne algorytmy kryptograficzne. Protokoły PPTP i PPPoE nie wykorzystują tak mocnych metod, jednak w praktyce są trudne do złamania, jeśli wykorzystywane hasła są odpowiedniej długości.
Wszystkie protokoły zabezpieczają transmisje występujące w obrębie sesji użytkownika za pomocą szyfrowania. OpenVPN oraz PPTP wykorzystują długotrwałe połączenia TCP i UDP, co stwarza zagrożenie polegające na ich przerywaniu przez atakującego. Przerwanie połączenia powoduje wylogowanie użytkownika z sesji i konieczność ponownego logowania. IPsec przy wyłączonym mechanizmie uzgadniania klucza korzysta tylko z protokołów AH lub ESP, których nie da się zresetować, dlatego jest odporny na przerywanie sesji. PPPoE jest protokołem warstwy trzeciej, co także wyklucza resetowanie połączeń. Co więcej, zagrożenia związane z DHCP i ARP także jego nie dotyczą. Jedynym zagrożeniem, które autorowi udało się znaleźć w Internecie jest możliwość podszywania się pod serwer PPPoE na etapie połączenia92).
Decyzja o wdrożeniu autoryzacji użytkowników za pomocą technologii VPN musi uwzględniać dostępność klientów poszczególnych protokołów w używanych systemach operacyjnych. System GNU/Linux, a także wolne systemy z rodziny BSD obsługują wszystkie rodzaje wirtualnych sieci prywatnych, które zostały wymienione w tym podrozdziale. W przypadku systemów Microsoftu, w chwili pisana tego opracowania, sytuacja wygląda inaczej dla każdego protokołu. Istnieje wiele implementacji IPsec, jednak większość z nich jest płatna93). Systemy Windows 2000/XP mają wbudowaną obsługę L2TP tunelowanego przez IPsec, Microsoft udostępnia bez opłat to oprogramowanie w wersji dla Windows 9x/ME. OpenVPN działa w Windows 2000/XP, jednak nie obsługuje starszych systemów z Redmond. Protokół PPTP jest wbudowany we wszystkie wersje Windows, poczynając od wersji 95. PPPoE jest wbudowany w Windows 2000/XP, jednak oferowana obsługa szyfrowania jest niestabilna94), co wymusza korzystanie z zewnętrznych klientów. Dostępne są RASPPPOE95) oraz WinPoET96). Mimo, że RASPPPOE można pobrać bezpłatnie z Internetu, to nie można go wykorzystywać do zastosowań biznesowych, a takim najczęściej jest świadczenie dostępu do Internetu. WinPoET jest oprogramowaniem w pełni komercyjnym.
Istnieje wiele implementacji serwerowych wszystkich wymienionych technologii VPN, zarówno komercyjnych97) jak i dystrybuowanych na zasadach Open Source. Są one na tyle popularne, że bez trudu można je znaleźć przy pomocy wyszukiwarki internetowej.
Ten podrozdział skupia się na technikach programowych, które pozwalają zabezpieczyć część prezentowanych metod przed większością ataków typu odmowa usług. Jedynym atakiem, którego nie udaremniają jest ten omówiony w podrozdziale 1.3.4, który wymaga zabezpieczeń sprzętowych bądź systemu wykrywania i alarmowania. Prezentowane poniżej techniki zwiększają także bezpieczeństwo słabych metod prewencyjnych, jak portale, Authpf oraz proxy.
Odpowiednio skonfigurowany firewall pozwala zabezpieczyć tablice routingu hosta przed nieautoryzowaną modyfikacją (atak ICMP Redirect omówiony w podrozdziale 1.3.6), oraz sesję użytkownika przed złośliwym wylogowaniem spowodowanym przerwaniem połączenia (podrozdział 1.3.7).
Zabezpieczenie przed atakiem ICMP Redirect polega na filtrowaniu tego typu komunikatów ICMP.
Ochrona przez resetowaniem połączeń także jest prosta, wymaga jednak złamania specyfikacji protokołów TCP i UDP. Polega na ignorowaniu prób zakończenia połączeń, które przenoszą sesję użytkownika zarówno po stronie serwera (VPN, SSH) jak i komputera klienckiego. W praktyce można to zrealizować z wykorzystaniem oprogramowania firewall po obu stronach, które będzie blokować pakiety TCP RST, TCP FIN oraz ICMP Port Unreachable, dotyczące połączeń VPN i SSH przez okres trwania sesji. Spowoduje to, że zakończenie tych połączeń w warstwie czwartej modelu OSI nie będzie możliwe, nawet na życzenie użytkownika98).
DHCP jest protokołem, który nawet w połączeniu z silnymi metodami uwierzytelniania, może zostać wykorzystany do przeprowadzenia ataków odmowy usług (podrozdział 1.3.5). Dlatego, jeśli operator sieci może ponieść koszt utraty kontroli nad konfiguracją sieciową hostów powinien zrezygnować z jego wykorzystania, w celu ochrony sieci przed tymi atakami.
Jeśli sieć LAN bazuje na protokole ARP, to jest ona narażona na wiele ataków, które zostały opisane w podrozdziale 1.3.3. Można się przed nimi zabezpieczyć przez częściową rezygnację z tego protokołu. W tym celu, do tablicy ARP routera, który zapewnia dostęp do Internetu, należy wprowadzić statyczne wpisy dla wszystkich zarejestrowanych hostów. Niezbędna jest także modyfikacja tablicy ARP każdego komputera, tak aby zawierała ona statyczny wpis dla adresu routera.
Istnieje rozszerzenie standardu ARP – ARPSec, które wprowadza pewne zabezpieczenia [Etienne 2000]. Jednak na dzień dzisiejszy popularne systemy operacyjne nie obsługują tego protokołu.
Jeśli weryfikacja zgodności adresów IP i MAC na routerze nie jest stosowana jako główna metoda uwierzytelniania, lecz wspólnie z inną metodą, może wydatnie zwiększyć jej bezpieczeństwo.
Ze względu na fakt, że powyższe metody są implementowane na poziomie przełączników sieciowych, są one wyjątkowo skuteczne. Ramki ze sfałszowanym adresem źródłowym są filtrowane natychmiast na przełączniku, co uniemożliwia ich dotarcie nie tylko do routera, ale nawet do innych hostów w sieci. To powoduje, że podszywanie się jest całkowicie niemożliwe i wszelkie związane z nim ataki (nawet ten opisany w podrozdziale 1.3.4) są udaremniane.
Jednak skuteczność przewyższająca wszystkie metody prewencyjne opisane w tym rozdziale jest okupiona wieloma wadami, związanymi z wdrożeniem i administracją. Obie metody wymagają rozlokowania inteligentnych przełączników we wszystkich węzłach sieci. Są one i zawsze będą (w szczególności sprzęt obsługujący standard 802.1x) droższe od typowych urządzeń niezarządzalnych. Pomijając jednorazowy koszt wdrożenia, należy brać pod uwagę koszty związane z wymianą uszkodzonych jednostek oraz kradzieże101) i zabezpieczanie się przed nimi.
W przypadku metody Port Security, dochodzi do tego konieczność zarządzania konfiguracją przełączników, ponieważ każda fizyczna zmiana w sieci musi uwzględniać ich uaktualnienie. Jeśli wystąpią pomyłki lub istnieje potrzeba zdiagnozowania jakiegoś problemu sieciowego, filtrowanie w warstwie drugiej może skutecznie utrudniać pracę administratorom.
W przypadku metody 802.1x jej wdrożenie wymaga uruchomienia serwera RADIUS oraz konfigurację systemów klienckich. Istnieje wiele implementacji RADIUS, w tym dostępne na zasadach Open Source. Windows XP posiada wbudowanego klienta standardu 802.1x, zaś Microsoft udostępnił także klienta dla systemu Windows 2000. Starsze systemy wymagają zainstalowania oddzielnego, płatnego oprogramowania102). Dla systemów uniksowych dostępny jest program Xsupplicant103), dystrybuowany na zasadach Open Source.
Już podczas pisania aplikacji multispoof, zaś w szczególności na etapie testów i mierzenia wydajności, pojawiały się pomysły na ulepszenia. Dotyczą one zwiększania odporności na wykrywanie, przełamywania innych metod uwierzytelniania oraz podnoszenia wydajności i komfortu korzystania z programu. Proponowane usprawnienia mogą zostać wprowadzone w przypadku kontynuowania rozwoju aplikacji multispoof.
Jednocześnie zostaną przedstawione zarysy nowych technik detekcji, skoncentrowanych na wykrywaniu bardziej zakamuflowanych ataków. Należy podkreślić, że silne techniki prewencyjne, opisane w rozdziale poprzednim, udaremniają ataki wykorzystujące proponowane udoskonalenia. Z tego powodu w tym rozdziale nie zostaną zaprezentowane metody zapobiegawcze.
W tej klasie znajdują sie takie propozycje udoskonaleń, które koncentrują się na redukcji nietypowych zachowań sieciowych programu, czyniąc go trudniejszym do wykrycia. Należy mieć na uwadze, że nawet najsilniejsze środki techniczne nie są w stanie ukryć działania aplikacji multispoof, jeśli jej użytkownik działa w sposób zbyt zwracający uwagę104).
Drugą metodą, która ma na celu utrudnianie detekcji aplikacji multispoof jest zwiększanie podobieństwa między jej zachowaniami sieciowymi, a standardową aktywnością hostów fizycznych. Ideałem byłoby, gdyby każdy adres wykorzystywany w procesie podszywania się, był nie od odróżnienia zdalnie od prawdziwego hosta fizycznego. Wtedy metody wykrywania opisane w podrozdziałach 5.1.3 i 5.1.4 byłyby bezużyteczne.
Jedną z technik symulacji hosta fizycznego jest odpowiadanie na pakiety dotyczące standardowych usług, oraz komunikaty ICMP. W tym celu każdy host fizyczny musiałby zostać zbadany w celu zdalnego rozpoznania systemu operacyjnego, udostępnionych usług oraz innych zachowań sieciowych107), co prowadziłoby do stworzenia bazy profili komputerów pracujących w sieci. Profile te następnie byłyby ładowane do bazy programu honeyd108). Głównym zastosowaniem tej aplikacji jest tworzenie komputerów-pułapek, które imitują różne, słabo zabezpieczone systemy operacyjne. Maszyna z uruchomionym programem honeyd jest następnie podłączana do Internetu i ściśle monitorowana w celu obserwacji metod używanych przez włamywaczy [Piotrowski 2005].
Wykorzystanie tego programu w aplikacji multispoof odwraca role: to administrator sieci ma ulec wrażeniu, że ma do czynienia z prawdziwymi komputerami, a nie z oszustem, który tworzy tę iluzję. Każdy wirtualny host imitowałby host fizyczny o odpowiadającym mu adresie.
Kolejną techniką symulacji zachowania hosta fizycznego jest generowanie standardowych transmisji sieciowych, które pojawiają się przy zwyczajnym używaniu komputera. Mogą to być na przykład zapytania DHCP wysyłane na etapie uruchamiania systemu operacyjnego, zapytania ARP o adres routera oraz zapytania DNS. Te transmisje mogłyby, jak w poprzedniej technice, być badane dla każdego hosta fizycznego, a następnie generowane podczas wykorzystywania jego adresu w procesie podszywania się109).
Metoda detekcji opisana w podrozdziale 5.1.7 jest bardzo skuteczna i nie da się przed nią całkowicie zabezpieczyć. Jednak proponowana zmiana zachowania aplikacji do pewnego stopnia pozwoli zmniejszyć nietypowe zachowania sieci, co spowoduje, że administrator może dłużej nie zauważać działań oszusta.
Pomysł polega na tym, aby aplikacja sama decydowała o zaprzestaniu podszywania się pod hosty, które mogą zostać włączone w bliskiej przyszłości. Wymagałoby to ciągłej analizy zachowania poszczególnych hostów i, na podstawie zgromadzonych danych, przewidywania kiedy dany host zostanie uruchomiony.
Jeśli pomimo zabezpieczeń przedstawionych w tym rozdziale, administrator zorientuje się, że w zarządzanej przez niego sieci działa aplikacja multispoof, to jego następnym krokiem będzie ustalenie na jakim komputerze została uruchomiona. Jeżeli sieć jest oparta na niezarządzalnych przełącznikach, to próby lokalizacji będą polegały na wyłączaniu kolejnych urządzeń, co zostało opisane dokładnie w podrozdziale 5.1.
Z punktu widzenia intruza, przydałby się mechanizm, który będzie ostrzegał przed próbami lokalizacji. Technicznie nie jest to skomplikowane i polega na ciągłym testowaniu, czy sieć nie została przerwana. Naiwnym sposobem mogłoby być sprawdzanie, czy router jest osiągalny, na przykład za pomocą komunikatów ICMP Echo Request lub ARP. Przebiegły administrator może jednak podczas procesu lokalizacji wysyłać na nie odpowiedzi, aby zmylić oszusta. Dlatego testowanie powinno odbywać się z wykorzystaniem metod, które uniemożliwiają podszywanie się110), jak np. połączenia szyfrowane. Dodatkową zaletą będzie mniejsza podatność na wykrycie samego procesu testowania, jeśli do tego celu zostanie użyte zwyczajne połączenie HTTPS, na przykład z bankiem internetowym.
Program multispoof można przystosować do pracy w sieci opartej na innym mechanizmie uwierzytelniania111). Wymaga to jednak stosunkowo rozległych modyfikacji, w zależności od wybranej metody dostępu do usługi.
Bardzo podobnie można przełamywać zabezpieczenie dostępu do Internetu w modelu portalowym. Metoda ta zazwyczaj nie wykorzystuje specjalnego połączenia, które musi być nawiązane przez cały czas trwania sesji, dlatego z reguły podszywanie się będzie prostsze niż w przypadku Authpf. Dodatkowo oszust, wykorzystując ARP Spoofing, może uniemożliwić użytkownikowi wylogowanie, dzięki czemu zapewni sobie nieprzerwane korzystanie z jego sesji.
Inną metodą jest przechwytywanie danych niezbędnych do rozpoczęcia sesji. Choć w przypadku metod wykorzystujących portal lub proxy wystarczy aktywny podsłuch, to aby przechwycić dane innych metod, wymagane są bardziej inwazyjne metody. Aby przejąć nazwę użytkownika i hasło połączeń SSH wykorzystywanych przez Authpf, konieczne jest przeprowadzenie ataku z wnętrza systemu (ang. Man in the Middle), zaś poznanie danych używanych w metodach opartych na wirtualnych sieciach prywatnych wymaga bezpośredniego ataku na host, który te dane przetrzymuje w swojej pamięci.
Kiedy oszust dysponuje już danymi uwierzytelniającymi, może używać ich w celu dostępu do Internetu jak zwykły użytkownik, z tą różnicą, że nie ponosi kosztów finansowych tej usługi. Jednak aby taki dostęp nie powodował konfliktów w sieci oraz aby możliwe było uzyskiwanie powiększonego pasma transmisyjnego, korzystne mogłoby być wykorzystanie w tym celu aplikacji multispoof. Wymagałoby to jednak wbudowania w program mechanizmów autoryzacji. W przypadku metody portalowej jest to stosunkowo proste, ponieważ wymaga tylko, aby przed rozpoczęciem podszywania się została wykonana procedura logowania dla danego hosta. Podobnie byłoby z wykorzystaniem metody Authpf, z tym że po uwierzytelnieniu połączenie musiałoby być utrzymywana dla każdego hosta, zaś w przypadku metody VPN, wszelkie transmisje należałoby enkapsulować w odpowiedni tunel.
Natomiast metoda wykorzystująca SOCKS 5 wymaga, aby każde połączenie używało tego protokołu, co wiązałoby się z poważnymi modyfikacjami aplikacji. Należałoby zrezygnować z koncepcji opartej na interfejsie wirtualnym tap i zastąpić ją lokalnym serwerem SOCKS. Użytkownik łączyłby się z nim, natomiast serwer przekazywałby te połączenia do serwera proxy operatora używając autentykacji.
Jeśli dostęp do Internetu jest chroniony z wykorzystaniem jednej z metod prewencyjnych, zaś dodatkowo wprowadzone są zabezpieczenia warstwy drugiej, opisane w podrozdziale 5.2.6, to podszywanie się jest utrudnione. Dotyczy to korzystania z adresów hostów, które są w danej chwili aktywne. W tym podrozdziale zostanie pokazane, że stosowanie nawet obu tych technik na raz w celu zabezpieczenia słabej metody uwierzytelniania nie uniemożliwia kradzieży usługi dostępu do Internetu. Wymaga to jednak poważnych modyfikacji w aplikacji multispoof.
Współdzielenie dostępu do Internetu z nieświadomym tego użytkownikiem, jest możliwe w metodach portalowych i Authpf. W obu przypadkach należy wyszukiwać hosty, które są uwierzytelnione, jednak nie korzystają intensywnie z sieci zewnętrznej.
Technika korzystania z istniejącej już sesji użytkownika polega na wprowadzeniu w błąd przełączników sieciowych. Ponieważ host użytkownika nie generuje prawie żadnego ruchu, to ramki z jego adresem źródłowym, ale płynące z komputera oszusta, spowodują, że ramki powrotne będą przesyłane także do niego.
Ponieważ host użytkownika co pewien czas może generować drobne transmisje, będzie to powodować zmianę dynamicznej konfiguracji przełączników i tymczasowe dostarczanie ramek przeznaczonych dla oszusta do legalnego komputera. Może to powodować resetowanie połączeń, jednak jeśli ruch generowany przez oszusta będzie miał wystarczająco wyższe natężenie114), to przełączniki ulegną ponownemu przeprogramowaniu i dalsze ramki będą docierały już do jego hosta.
W przypadku Authpf korzystanie z nawiązanej już sesji użytkownika opiera się na tej samej zasadzie co powyżej. Jednak ze względu na to, że połączenie SSH nie może zostać zerwane wymaga to dodatkowego mechanizmu. Połączenie będzie nawiązane tak długo, dopóki obie jego strony, tzn. router i klient SSH są w stanie się komunikować. Zbyt długie przerwy skutkują zerwaniem sesji.
Maksymalną długość przerwy można ustalić, zaś pakiety kontrolne SSH są wysyłane co pewien, również możliwy do zmierzenia, czas. Pakiety wysyłane przez klienta do routera są niedostępne dla atakującego, natomiast komunikaty kontrolne SSH wysyłane przez router, mimo, że skierowane do użytkownika trafiają do oszusta. Po odebraniu maksymalnej liczby pakietów kontrolnych115) host oszusta musiałby wymuszać na komputerze użytkownika wysłanie ramki sieciowej. Do tego celu może być wykorzystane np. zapytanie ARP. Ważne jest także, aby po jego wysłaniu przerwać wszystkie transmisje, które wykorzystują źródłowy adres MAC hosta użytkownika. Komunikat ARP Reply, wygenerowany przez host użytkownika, przeprogramuje przełączniki tak, że z powrotem zaczną przesyłać dane skierowane pod adres użytkownika do jego hosta. Natychmiast po tym, oszust musiałby wysłać ostatni otrzymany komunikat SSH do użytkownika, fałszując adres źródłowy, tak aby ramka wyglądała jakby przyszła z routera. Klient SSH otrzyma tę ramkę i wygeneruje na nią odpowiedź, co uratuje sesję przed zakończeniem. Od tej chwili możliwe jest dalsze korzystanie z Internetu przez oszusta, zaś opisana operacja musi być powtarzana co ustalony czas.
Ostatnią klasą usprawnień są te dotyczące zwiększenia możliwej przepustowości, podnoszące komfort korzystania z aplikacji, oraz oferujące metody kontroli i bieżącego monitorowania jej pracy.
W obecnej wersji program zoptymalizowany jest pod kątem pobierania z Internetu danych w sposób masowy, tak szybko jak to możliwe. Jednak inne rodzaje aktywności sieciowej nie są tak dobrze obsługiwane. Aplikacja multispoof mogłaby oferować różne tryby pracy, w zależności od zadań, które użytkownik zamierza wykonywać.
Interaktywne korzystanie z globalnej sieci najlepiej funkcjonowałoby, gdyby w procesie podszywania się były wykorzystywane adresy tylko tych abonentów, którzy wykupili usługę najwyższej jakości. Wymagałoby to od aplikacji, aby była w stanie zmierzyć takie parametry sieciowe jak przepustowość i opóźnienia, które zapewniane są poszczególnym użytkownikom przez operatora.
W niektórych sytuacjach przydatny byłby tryb, który maksymalizuje anonimowość oraz zmniejsza prawdopodobieństwo wykrycia kosztem jakości dostępu. Mogłoby polegać to na podszywaniu się tylko pod jeden adres na raz. Aplikacja wprawdzie nie oferowałaby powiększonej przepustowości, ale korzystanie z cudzego adresu utrudniałoby śledzenie użytkownika programu. Dodatkowo wykorzystanie tylko jednego adresu nie budziłoby podejrzeń administratora sieci.
Ostatnim trybem byłoby maksymalne przyśpieszenie transmisji, nawet kosztem ułatwienia wykrycia. Użytkownik aplikacji aktywowałby ten tryb w przypadku zaistnienia nagłej potrzeby wykonania dużej transmisji tak szybko jak to możliwe. Aby zrealizować swoje zadanie, aplikacja multispoof mogłaby podszywać się pod wszystkie komputery, nawet te, które w danej chwili są aktywne.
Możliwość generowania różnego rodzaju statystyk z działania programu byłaby użyteczną funkcją. Użytkownik aplikacji mógłby analizować zależność od czasu takich informacji jak przepustowość łączną i dla każdego wykorzystywanego adresu, liczbę pakietów na sekundę, liczbę adresów, które biorą udział w procesie podszywania się itd. Pozwalałoby to na skuteczną ocenę wyników działania aplikacji.
Obecna wersja aplikacji multispoof nie może wykorzystywać więcej niż 100 adresów w procesie podszywania się. Poprzez współpracę z autorem modułu nth (opisanego w podrozdziale 3.5.2), należałoby go zmodyfikować tak, aby przełamać to ograniczenie. W tym celu niezbędna jest modyfikacja części rezydującej w jądrze, ponieważ używa ona liczników ośmiobitowych, które należałoby zastąpić szesnastobitowymi. Pozwoliłoby to na zwiększenie maksymalnej liczby adresów do ponad 65 tysięcy116).
Kolejne poprawki to zlokalizowanie i usunięcie wycieku pamięci w komponencie netdb, oraz wprowadzenie zabezpieczenia przed niekorzystnym wpływem klienta DHCP na działanie aplikacji. To ostatnie polegałoby na dodaniu do skryptu multispoof reguł podsystemu Netfilter, które blokują ruch DHCP na interfejsie zewnętrznym.
Należałoby także wykonać dokładny profiling aplikacji, co pozwoliłoby zlokalizować te elementy, które w największym stopniu wpływają na wydajność.
Zaproponowane w podrozdziale 6.2 metody przełamywania innych technik uwierzytelniających wykazują pewne cechy charakterystyczne, które mogą zostać wykorzystane do ich wykrycia.
Techniki detekcji opisane w tym podrozdziale mają zastosowanie w przypadku wykorzystywania uwierzytelniania metodą portalową oraz Authpf. Pozwalają wykryć pasożytnicze korzystanie z usługi dostępu do Internetu, z wykorzystaniem podszywania się pod aktywne hosty.
Wydaje się, że efektywne może być zastosowanie popularnego i stosunkowo bogatego zestawu metod wykrywania nielegalnego podziału łącza z wykorzystaniem translacji adresów. Nielegalny podział łącza polega na udostępnianiu usługi dostępu do Internetu innym użytkownikom. Efekty uboczne tego procederu są bardzo zbliżone do metody wykorzystywania adresu aktywnego hosta przez oszusta. Techniki te są dokładnie opisane w [Tomaszewski et al. 2005], [Zalewski 2001], [Zalewski 2002], [Kohno et al. 2005], zaś w Internecie można znaleźć gotowe narzędzia je implementujące117).
Jeśli w sieci wdrożono metodę portalową lub Authpf bez dodatkowych zabezpieczeń w warstwie drugiej, to jednoczesne korzystanie z usługi może odbywać się z wykorzystaniem ataku ARP Spoofing. Atak ten wykazuje bardzo charakterystyczne objawy, które polegają m.in. na tym, że w sieci można obserwować większą liczbę adresów MAC niż IP. Istnieją narzędzia, które wykorzystują te słabości w celu wykrywania ataku118).
Jeżeli oszust nie chce stosować ataku ARP Spoofing, obawiając się wykrycia, bądź nie ma takiej możliwości, ze względu na zaimplementowane w sieci dodatkowe zabezpieczenia w warstwie drugiej, może wykorzystywać metodę opartą na wprowadzaniu w błąd przełączników sieciowych (podrozdział 6.2.3). Jeśli używane w sieci przełączniki pozwalają na zdalny odczyt listy adresów MAC wraz z powiązanymi z nimi portami, to detekcja tego nadużycia jest stosunkowo prosta. Polega na periodycznym odpytywaniu przełącznika i sprawdzaniu, czy adresy MAC nie migrują między portami. Jeśli sytuacja taka ma miejsce często, to jest to niemal pewna oznaka, że w sieci jest aktywny oszust.
Powyższa technika jest jednak bezużyteczna w sieciach opartych na prostych, niezarządzalnych przełącznikach. W tym przypadku metoda detekcji jest bardziej skomplikowana i opiera się na badaniu strat transmisji. Straty te wynikają z faktu, że w momentach reasocjacji par MAC-Port na przełącznikach, ramki mogą płynąć nie do tego hosta, który na nie oczekuje. Powoduje to, że nawiązane połączenia są resetowane. Takie zachowanie nie jest typowe, dlatego jeśli występuje często, można przypuszczać, że w sieci działa oszust.
Część z zaprezentowanych metod ochrony dostępu do Internetu pozwala na bardzo łatwe przejęcie danych używanych do uwierzytelniania. Np. metody portalowe i oparte na proxy wymagają od oszusta jedynie aktywnego podsłuchiwania z wykorzystaniem jednej z metod omówionych w podrozdziale 1.3. Istnieje wiele technik detekcji tego rodzaju nadużycia, np. zaprezentowane w poprzednim podrozdziale wykrywanie ataku ARP Spoofing.
Przechwycenie danych uwierzytelniających w metodzie Authpf nie jest już tak proste, wymaga bowiem ataku na połączenie SSH. Detekcja tego typu nadużycia jest wbudowana w klienta tego protokołu, jednak wymaga od administratora współpracy z użytkownikami.
Próby zdobywania danych uwierzytelniających w metodach opartych na wirtualnych sieciach prywatnych są najczęściej możliwe tylko po uprzednim przejęciu kontroli nad komputerem użytkownika. Wymaga to od atakującego dokonywania włamań elektronicznych. Wykrywanie tego procederu może polegać na monitorowaniu sieci z wykorzystaniem systemu detekcji intruzów (ang. Intrusion Detection System).
Jeśli oszust zdołał już przechwycić dane uwierzytelniające, będzie próbował ich użyć w celu uzyskania dostępu do usługi. Problem detekcji tego typu nadużycia polega na odróżnianiu połączeń legalnych użytkowników od tych, nawiązywanych przez oszusta. Nie jest to łatwe, ale możliwe, jeśli osoba ta postępuje nieostrożnie. W tym celu należy wykorzystywać informacje podprogowe, jak np. adres MAC (o którego zmianie oszust mógł zapomnieć).
Jeżeli atakujący próbuje zwiększyć swoje pasmo transmisyjne podszywając się pod wielu użytkowników, to zastosowanie mają metody opisane w podrozdziale 5.1.
#!/bin/sh function usage { echo "Usage:" echo " multispoof [-fvh] [-a <age>] [-e <age>] [ -s <int>] [-t <name>] -i <iface>" echo "" echo " -i iface Uses given network interface" echo " -t name Assigns given name to tap device; default: $TAP_IFACE" echo " -f Starts with flushed cache; default: don't flush" echo " -a minimal age; default $MIN_AGE" echo " -e minimal test age; default $MIN_TEST_AGE" echo " -s arp scan interval; default $SCAN_INTERVAL" echo " -d Dummy mode, exits after initial setup" echo " -v Verbose mode" echo " -h Shows this help" echo " -V Displays the current version" echo "" echo "All time related options have to be specified in seconds." exit } # Sets up netfilter rules function setup_nf_rules { MULTISPOOF_SID=`ps -o sid= $$` iptables -t nat -N $MAIN_CHAIN 2> /dev/null iptables -t nat -N $SUB_CHAIN 2> /dev/null iptables -t nat -N $TEST_CHAIN 2> /dev/null iptables -t nat -F $MAIN_CHAIN iptables -t nat -F $SUB_CHAIN iptables -t nat -A $MAIN_CHAIN -o $TAP_IFACE -m owner \ --sid-owner $MULTISPOOF_SID -j $TEST_CHAIN iptables -t nat -A $MAIN_CHAIN -j $SUB_CHAIN iptables -t nat -A $MAIN_CHAIN -j DROP iptables -t nat -D POSTROUTING -o $TAP_IFACE -j $MAIN_CHAIN \ 2>/dev/null iptables -t nat -I POSTROUTING -o $TAP_IFACE -j $MAIN_CHAIN } # Cleans up netcfilter rules function clean_up_nf_rules { iptables -t nat -D POSTROUTING -o $TAP_IFACE -j $MAIN_CHAIN \ 2> /dev/null iptables -t nat -F $MAIN_CHAIN iptables -t nat -F $SUB_CHAIN iptables -t nat -F $TEST_CHAIN iptables -t nat -X $MAIN_CHAIN iptables -t nat -X $SUB_CHAIN iptables -t nat -X $TEST_CHAIN } # Restores IP address and default gateway on network interface function restore_iface_config { ip addr add $SCAN_IP/$NETMASK dev $REAL_IFACE ip route add default via $GATEWAY_IP } # Signal handler - shutdowns app gracefully function clean_up { trap 15 echo "multispoof: cleaning up" # Take down tap interface, so associated routes get cleaned ip link set $TAP_IFACE down # After tap interface is down, we can restore network config restore_iface_config clean_up_nf_rules # Remove netdb temporary directory rm -rf $NDB_DIR # Kill all processes kill -SIGTERM -$$ } function spoof_pipeline { rx $REAL_IFACE "ip and not ether broadcast" tapio | \ cmac unspoof $MIN_AGE $NDB_SOCKET | tapio $TAP_IFACE | \ cmac spoof $MIN_AGE $NDB_SOCKET | tx $REAL_IFACE tapio } function scanarp_pipeline { scanarp $NDB_SOCKET $SCAN_INTERVAL $SCAN_IP $SCAN_MAC | \ tx $REAL_IFACE scanarp } function deta_pipeline { rx $REAL_IFACE "ether broadcast or arp" deta | deta $NDB_SOCKET \ $MIN_AGE | tx $REAL_IFACE deta } # Registers default mac in netdb function register_mac { local IFACE=$1 local MAC=`ip link|grep -A 1 $IFACE | tail -n 1 | cut -d ' ' -f 6` if [ ! -z "$MAC" ] then ndbexec $NDB_SOCKET setvar defmac $MAC else echo "Problem getting mac address of interface $IFACE." kill $$ fi } # Sets banned list in netdb function set_variables { local BANNED="$GATEWAY_IP:0.0.0.0:255.255.255.255" ndbexec $NDB_SOCKET setvar banned "$BANNED" } # Moves configuration from real interface to tap interface function setup_ifaces { local REAL=$1 local TAP=$2 local CIDR="$SCAN_IP/$NETMASK" ip addr flush dev $REAL 2> /dev/null ip addr add $CIDR dev $TAP ip link set $TAP up arp -i $TAP -s $GATEWAY_IP $GATEWAY_MAC ip route add default via $GATEWAY_IP } # Returns if given socket exist function wait_for_socket { local SOCKET=$1 while [ ! -S "$SOCKET" ] do sleep 0.1 done } # Returns if given network interface exist function wait_for_iface { local IFACE=$1 while [ `ip link show dev $IFACE > /dev/null 2> /dev/null \ || echo false` ] do sleep 0.1 done } # Static configuration created by make COMPONENTS_DIR=/usr/local/lib/multispoof CACHE_FILE=/var/local/cache/multispoof/netdb.cache VERSION=0.6.1 FLUSH_CACHE="" VERBOSE_MODE="" DUMMY_MODE="" REAL_IFACE="" TAP_IFACE="tap0" # Defaults: all intervals and ages in seconds # How long the host needs to be quiet to be considered as inactive. MIN_AGE=300 # How often individual host should be tested. MIN_TEST_AGE=3600 # How often natman should poll netdb NATMAN_INTERVAL=5 # How often conncheck should poll netdb CONNCHECK_INTERVAL=6 # How often scanarp should send arp requests SCAN_INTERVAL=60 # Parse commandline parameters while getopts Vdfvht:i:a:e:s: NAME do case $NAME in f) FLUSH_CACHE="-f" ;; d) DUMMY_MODE="-d" ;; v) VERBOSE_MODE="-v" ;; i) REAL_IFACE="$OPTARG" ;; t) TAP_IFACE="$OPTARG" ;; a) MIN_AGE="$OPTARG" ;; e) MIN_TEST_AGE="$OPTARG" ;; s) SCAN_INTERVAL="$OPTARG" ;; V) echo "multispoof version $VERSION" exit ;; *) usage ;; esac done if [ -z "$REAL_IFACE" ] then echo "multispoof: You need to specify interface to use." exit 1 fi if [ ! -z "$VERBOSE_MODE" ] then echo "multispoof: PID $$" echo "multispoof: Discovering network setup." fi GATEWAY_IP=`ip route | grep default | grep $REAL_IFACE | head -n 1 \ | cut -d " " -f 3` if [ -z "$GATEWAY_IP" ] then echo "multispoof: Default gateway bound to specified interface required." exit 1 fi _IP_ADDR=`ip addr show dev $REAL_IFACE | egrep "inet\ " | head -n 1 \ | awk '{ print $2 }'` SCAN_IP=`echo $_IP_ADDR | cut -d "/" -f 1` if [ -z "$SCAN_IP" ] then echo "multispoof: Couldn't get interface IP address." exit 1 fi SCAN_MAC=`ip link show dev $REAL_IFACE | grep "link/ether" \ | awk '{ print $2 }'` if [ -z "$SCAN_MAC" ] then echo "multispoof: Couldn't get interface MAC address." exit 1 fi NETMASK=`echo $_IP_ADDR | cut -d "/" -f 2` if [ -z "$NETMASK" ] then echo "multispoof: Couldn't get interface netmask." exit 1 fi GATEWAY_MAC=`/usr/sbin/arp -na $GATEWAY_IP | grep $REAL_IFACE \ | tail -n 1 | cut -d " " -f 4 | grep ":"` if [ -z "$GATEWAY_MAC" ] then ping -c 1 -w 2 $GATEWAY_IP 2>&1 > /dev/null GATEWAY_MAC=`/usr/sbin/arp -na $GATEWAY_IP | grep $REAL_IFACE \ | tail -n 1 | cut -d " " -f 4 | grep ":"` fi if [ -z "$GATEWAY_MAC" ] then echo "multispoof: Couldn't obtain gateway\'s MAC address." exit 1 fi if [ ! -z "$VERBOSE_MODE" ] then echo "multispoof: Real interface: $REAL_IFACE, tap interface: $TAP_IFACE" echo "multispoof: Gateway ip: '$GATEWAY_IP' mac: '$GATEWAY_MAC'" echo "multispoof: Scan ip: '$SCAN_IP/$NETMASK' mac: '$SCAN_MAC'" echo "multispoof: Min age: $MIN_AGE, min test age: $MIN_TEST_AGE" echo "multispoof: Intervals - natman: $NATMAN_INTERVAL, conncheck: \ $CONNCHECK_INTERVAL, scanarp: $SCAN_INTERVAL" fi if [ ! -z "$DUMMY_MODE" ] then exit fi if [ `whoami` != "root" ] then echo "multispoof: Root privileges required." exit 1 fi NDB_DIR=`mktemp -td multispoof.XXXXXXXX` || FAIL=1 if [ ! -z "$FAIL" ] then echo "multispoof: Couldn't create temporary directory." exit 1 fi NDB_SOCKET="$NDB_DIR/socket" MAIN_CHAIN="multispoof-main" SUB_CHAIN="multispoof-sub" TEST_CHAIN="multispoof-test" TEST_SCRIPT="${COMPONENTS_DIR}/access-test" PATH=$COMPONENTS_DIR:$PATH trap clean_up 15 2 netdb $NDB_SOCKET $CACHE_FILE $FLUSH_CACHE & wait_for_socket $NDB_SOCKET set_variables spoof_pipeline & scanarp_pipeline & deta_pipeline & setup_nf_rules natman $SUB_CHAIN $MIN_AGE $NATMAN_INTERVAL $NDB_SOCKET & wait_for_iface $TAP_IFACE register_mac $TAP_IFACE setup_ifaces $REAL_IFACE $TAP_IFACE conncheck $NDB_SOCKET $TEST_CHAIN $CONNCHECK_INTERVAL \ $MIN_AGE $MIN_TEST_AGE $TEST_SCRIPT & # Wait for all children processes. wait
#!/bin/sh TEST_HOST=$1 function launch_netcat { nc $TEST_HOST 19 > /dev/null & } function initial_launch { i=200 while [ $i -gt 0 ] do launch_netcat sleep 0.1 i=$[ $i - 1 ] done } function clean_up { trap 15 trap 2 /bin/kill -SIGTERM -$$ } trap clean_up 15 2 initial_launch while [ true ] do CANDIDATE=`ps -C nc -o pid=,etime=|tr -d ":"|sort -k 2|head -n 1|awk '{print $1}'` echo Killing $CANDIDATE kill $CANDIDATE launch_netcat sleep 2 done
Na powyższych listach nie zostały uwzględnione wymagania poszczególnych bibliotek i narzędzi, jak np. obsługa gniazd typu PACKET w Linuksie, od której zależy działanie biblioteki libpcap.
$ tar zxf multispoof-0.6.1.tar.gz $ cd multispoof-0.6.1Spowoduje to, że źródła zostaną rozpakowane do osobnego katalogu. Po tej czynności można zmodyfikować parametry instalacyjne. Domyślnie aplikacja instalowana jest w katalogach /usr/local/ i /var/local/ jednak można je zmienić, modyfikując plik Makefile. Istotne jest, aby zmiany te wprowadzać przed wydaniem polecenia make, ponieważ oprócz instalacji, wpływają one także na proces budowania plików wykonywalnych119). Następnym krokiem jest kompilacja, którą przeprowadza się wydając komendę:
$ makeJeśli kompilacja przebiegnie bez błędów to ostatnim etapem jest instalacja aplikacji. W tym celu należy wykonać poniższą komendę (niezbędne są uprawnienia administratora systemu):
# make install
Po pomyślnej instalacji program multispoof powinien znajdować się w ścieżce dostępu. Aplikacja do poprawnego działania wymaga uprawnień administratora, ponieważ korzysta z bezpośredniego dostępu do sieci z pominięciem stosu TCP/IP (podsłuchiwanie i wstrzykiwanie danych do sieci – podrozdział 3.3.1), tworzy wirtualny interfejs tap (podrozdział 3.3.2), przeładowuje reguły iptables (podrozdziały 3.5.1 i 3.5.2) oraz zmienia adresy IP a także manipuluje tablicami ARP i routingu (podrozdział 3.6). Przed uruchomieniem należy sprawdzić, czy w systemie działa klient DHCP i jeśli znajduje się on w pamięci konieczne jest jego zakończenie. Aplikacja multispoof na czas działania zdejmuje adres IP z interfejsu fizycznego i przydziela go do interfejsu wirtualnego tap. Klient DHCP mógłby przydzielić adres z powrotem do interfejsu fizycznego, co doprowadziłoby do sytuacji, w której dwa interfejsy dzieliłyby jeden adres IP.
Uruchomienie aplikacji multispoof z parametrem -h spowoduje wyświetlenie skróconego opisu obsługi programu wraz z listą opcji. Lista ta została przedstawiona w tabeli B.1.
Opcja | Opis |
---|---|
-i | Program będzie używać podanego interfejsu sieciowego. |
-t | Interfejs wirtualny tap otrzyma podaną nazwę. Domyślnie tap0. |
-f | Program nie wczyta zawartości pliku cache z listą hostów. Domyślnie lista jest wczytywana. |
-a | Minimalny czas nieaktywności hosta, podawany w sekundach. Domyślnie 300. |
-e | Minimalny czas pomiędzy testami łączności dla hosta, podawany w sekundach. Domyślnie 3600. |
-s | Odstęp czasowy pomiędzy skanowaniami ARP. Domyślnie 60 sekund. |
-d | Tryb testowy, program nie uruchamia komponentów. Przydatne przy -v. |
-v | Tryb diagnostyczny, program wyświetla dodatkowe informacje o swoim działaniu. |
-h | Wyświetla skrócony opis obsługi wraz z listą opcji. |
-V | Wyświetla wersję programu. |
# multispoof -vi eth1Spowoduje to, że na standardowe wyjście błędów wyświetlone zostaną informacje wygenerowane przez poszczególne komponenty i skrypt zarządzający:
multispoof: PID 6858 multispoof: Discovering network setup. multispoof: Real interface: eth1, tap interface: tap0 multispoof: Gateway ip: '192.168.1.201' mac: '00:20:AF:C4:6F:E3' multispoof: Scan ip: '192.168.1.33/24' mac: '52:54:00:12:34:57' multispoof: Min age: 300, min test age: 3600 multispoof: Intervals - natman: 5, conncheck: 6, scanarp: 60 netdb: Listening on /tmp/multispoof.XXtIpgfL/socket rx (tapio): listening on eth1 rx (deta): listening on eth1 tx (scanarp): using device eth1 tx (deta): using device eth1 tapio: virtual interface: tap0 tx (tapio): using device eth1 cmac (unspoof): Using 7e:e5:3e:48:3b:5f as default macZ powyższych informacji można odczytać PID (dotyczy on skryptu zarządzającego, poszczególne komponenty są uruchamiane jako procesy potomne mają więc inne identyfikatory), wykrytą konfigurację sieci oraz gniazdo lokalne komponentu netdb, używane do komunikacji pomiędzy komponentami aplikacji. Po uruchomieniu można odnotować zmiany w konfiguracji sieci. Poniżej została przedstawiona konfiguracja przed:
$ ip addr show dev eth1 2: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff inet 172.20.0.2/16 brd 172.20.255.255 scope global eth0 $ ip route 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.33 default via 192.168.1.201 dev eth1 $ arp -na ? (192.168.1.201) at 00:20:AF:C4:6F:E3 [ether] on eth1Natomiast uruchomienie aplikacji spowodowało, że interfejs eth1 został pozbawiony adresu IP, który został przypisany do interfejsu tap0. Dodatkowo, domyślna trasa prowadzi przez interfejs tap, zaś w tablicy ARP pojawił się statyczny wpis dla adresu domyślnego routera:
$ ip addr show dev eth1 3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 52:54:00:12:34:57 brd ff:ff:ff:ff:ff:ff $ ip addr show dev tap0 5: tap0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 500 link/ether 7e:e5:3e:48:3b:5f brd ff:ff:ff:ff:ff:ff inet 192.168.1.33/24 scope global tap0 $ ip route 192.168.1.0/24 dev tap0 proto kernel scope link src 192.168.1.33 default via 192.168.1.201 dev tap0 $ arp -na ? (192.168.1.201) at 00:20:AF:C4:6F:E3 [ether] PERM on tap0Jeśli w sieci w której działa aplikacja multispoof są aktywne jakieś hosty, to stopniowo powinny być one wykrywane i dodawane do wewnętrznej tablicy, która jest utrzymywana przez komponent netdb. Wykrycie nowego hosta jest sygnalizowane przez wypisanie komunikatu:
deta: Adding host 192.168.1.42 (00:00:86:3d:bb:fd)Aby wyświetlić zawartość tablicy wykrytych hostów trzeba nawiązać połączenie z komponentem netdb za pośrednictwem lokalnego gniazda uniksowego, którego lokalizacja została podana przez aplikację przy starcie. Można to zrobić korzystając z programu socat120):
# socat UNIX-CONNECT:/tmp/multispoof.XXtIpgfL/socket - +OK Welcome dump 192.168.1.23 192.168.1.42 192.168.1.69 192.168.1.47 +OK Dump complete quit +OK ByeWykryte hosty przed zakończeniem programu zostaną zapisane do pliku121), tak aby przy następnym uruchomieniu nie było potrzeby budowania listy od początku. Jeśli program działa wystarczająco długo aby stwierdzić nieaktywność przynajmniej jednego hosta i jeśli choć jeden z nieaktywnych komputerów posiada dostęp do Internetu, to aplikacja przeładowuje reguły NAT, co można zobaczyć korzystając z komendy iptables:
# iptables -t nat -nL multispoof-sub Chain multispoof-sub (1 references) target prot opt source destination SNAT all -- 0.0.0.0/0 0.0.0.0/0 \ every 2th packet #0 to:192.168.1.23 SNAT all -- 0.0.0.0/0 0.0.0.0/0 \ every 2th packet #1 to:192.168.1.42W chwili wykonywania powyższej komendy w procesie podszywania się są wykorzystywane adresy 192.168.1.23 i 192.168.1.42. Aby sprawdzić prawidłowość działania aplikacji, tzn. czy adresy IP i MAC faktycznie są zmieniane, można uruchomić równolegle narzędzie ping oraz analizator pakietów. Program nasłuchujący na interfejsie fizycznym122) zarejestruje ruch podobny do poniższego:
# tcpdump -eni eth1 icmp tcpdump: WARNING: eth1: no IPv4 address assigned tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 23:21:27.997833 00:20:ed:b6:78:43 > 00:20:af:c4:6f:e3, ethertype IPv4 (0x0800), \ length 98: IP 192.168.1.23 > 212.77.100.101: icmp 64: echo request seq 1 23:21:28.039748 00:20:af:c4:6f:e3 > 00:20:ed:b6:78:43, ethertype IPv4 (0x0800), \ length 98: IP 212.77.100.101 > 192.168.1.23: icmp 64: echo reply seq 1 23:21:28.992051 00:02:44:7b:09:11 > 00:20:af:c4:6f:e3, ethertype IPv4 (0x0800), \ length 98: IP 192.168.1.42 > 212.77.100.101: icmp 64: echo request seq 2 23:21:29.036361 00:20:af:c4:6f:e3 > 00:02:44:7b:09:11, ethertype IPv4 (0x0800), \ length 98: IP 212.77.100.101 > 192.168.1.42: icmp 64: echo reply seq 2 23:21:29.992307 00:20:ed:b6:78:43 > 00:20:af:c4:6f:e3, ethertype IPv4 (0x0800), \ length 98: IP 192.168.1.23 > 212.77.100.101: icmp 64: echo request seq 3 23:21:30.046712 00:20:af:c4:6f:e3 > 00:20:ed:b6:78:43, ethertype IPv4 (0x0800), \ length 98: IP 212.77.100.101 > 192.168.1.23: icmp 64: echo reply seq 3 23:21:30.994180 00:02:44:7b:09:11 > 00:20:af:c4:6f:e3, ethertype IPv4 (0x0800), \ length 98: IP 192.168.1.42 > 212.77.100.101: icmp 64: echo request seq 4 23:21:31.098238 00:20:af:c4:6f:e3 > 00:02:44:7b:09:11, ethertype IPv4 (0x0800), \ length 98: IP 212.77.100.101 > 192.168.1.42: icmp 64: echo reply seq 4Każdy pakiet reprezentowany jest przed dwie linijki, spośród których pierwsza zawiera adresy MAC, a druga adresy IP. Oba typy adresów są pogrubione dla czytelności. Wyjście analizatora wyraźnie pokazuje, że kolejne pakiety (widać to po numerach sekwencyjnych) generowane przez program ping mają zmieniane adresy źródłowe. Ponieważ podczas testu były wykorzystywane tylko dwa adresy, pakiety nieparzyste mają adres 192.168.1.23, zaś nieparzyste – 192.168.1.42. Adresy MAC także ulegają zmianie, tak aby pary IP i MAC zgadzały się.
W przykładzie transmisji programu ping, zmianie ulega każdy kolejny pakiet. Jednak w przypadku protokołów połączeniowych, takich jak TCP adresy będą zmieniane dla połączeń, tzn. wszystkie pakiety w obrębie jednego połączenia będą miały taki sam adres. Należy podkreślić, że aplikacja multispoof nie zajmuje się śledzeniem połączeń, za tę czynność odpowiedzialne jest jądro systemu. Aplikacja ustala jedynie reguły podsystemu Netfilter. Więcej na ten temat można znaleźć w podrozdziale 3.5.2.
Niniejsza praca została w całości sporządzona za pomocą oprogramowania Open Source. Do składu posłużył doskonały, oparty na XML'u system tbook123), do wprowadzania tekstu używany był edytor Vim124), w sprawdzaniu poprawności pisowni pomogły narzędzia GNU Aspell125) oraz vimspell126); diagramy powstały w programie Dia127). Wykresy przepustowości zostały stworzone w programie Gnuplot128) z wykorzystaniem danych zmierzonych programem tcpstat129), zaś wykresy aktywności przełącznika sieciowego powstały przy użyciu aplikacji RRDtool130) zasilanej informacjami uzyskiwanymi przez narzędzia z pakietu Net-SNMP131). Wygenerowanie wersji drukowalnej zostało przeprowadzone z wykorzystaniem systemu LaTeX w dystrybucji teTeX132), zaś w automatyzacji tego procesu bardzo pomógł program GNU Make133). Wszystkie elementy pracy były wprowadzane do znakomitego systemu kontroli wersji Darcs134), zaś całość działała pod kontrolą systemu Ubuntu Linux135).
Aplikacja, która powstała w ramach pracy była rozwijana z wykorzystaniem kompilatora GCC136), debuggera GDB137), edytora Vim, systemu kontroli wersji Darcs, narzędzia GNU Make oraz innych, pomniejszych narzędzi uniksowych. Cały proces odbywał się pod kontrolą systemu Debian/GNU Linux138) uruchomionego w emulatorze QEmu139).
Al-Herbish, Thamer, 1999: Raw IP Networking
FAQ.
http://www.whitefang.com/rin/
Bautts, Tony, Terry Dawson i Gregor Purdy, luty 2005: Linux Network Administrator's Guide, Third Edition. O'Reilly.
Bellovin, Stephen, maj 1989: Security Problems in the TCP/IP Protocol Suite. Computer Communication Review.
Brecht, Tim i Michal Ostrowski, list. 2001: Exploring the performance of select-based Internet servers. Rap. tech., HP Labs.
Bronger, Torsten, 2004: tbook: a system for XML authoring, version 1.5.2.
Carstens, Tim, 2002: Programming with pcap.
http://www.tcpdump.org/pcap.htm
Etienne, Jerome, 2000: ARPsec: An ARP security extension. Ottawa Linux Symposium 2000.
Gusta, Marek i Maciej Szmit, 2003: Sniffing w ethernecie z przelcacznikami. Hakin9, (2).
Gutkowski, Marek, 2004: Kilka ciekawych metod rozpoznawania systemu operacyjnego. Hakin9, (5).
Gutmann, Peter, 22 wrz. 2003: Linux's answer to
MS-PPTP.
Wiadomo's'c z grupy dyskusyjnej.
http://diswww.mit.edu/bloom-picayune/crypto/14238
Hon02, 4 marz. 2002: Know Your Enemy: Passive Fingerprinting.
Identifying remote hosts, without them knowing.
http://www.honeynet.org/papers/finger/
Hunt, Craig, 1997: TCP/IP - Administracja sieci. Read Me.
Klyagin, Konstantin, 2004: Skanowanie portów z punktu widzenia administratora. Hakin9, (8).
Kohno, Tadayoshi, Andre Broido i kc claffy,
maj 2005: Remote physical device fingerprinting.
IEEE Symposium on Security and Privacy.
http://www.caida.org/outreach/papers/2005/fingerprinting/
Krasnyansky, Maxim i Florian Thiel, 2002: Universal TUN/TAP device driver. Linux Kernel Documentation.
Marie, Fabrice, 22 sier. 2002: Rozszerzenia Netfilter HOWTO.
McCanne, Steven i Van Jacobson, 19 grudz. 1992: The BSD Packet Filter: A New Architecture for User-level Packet Capture.
Net99, 1999: Vademecum teleinformatyka - tom 1. IDG Poland S.A.
Piotrowski, Michal, 2005: Honeypoty - lep na robaki. Hakin9, (11).
Raymond, Eric, Stevens, September 2003: The Art of Unix Programming. Addison-Wesley. ISBN 0131429019.
Russell, Rusty, 29 lip. 2001: Linux Networking-concepts HOWTO.
Russell, Rusty, 14 stycz. 2002a: Linux 2.4 NAT HOWTO.
Russell, Rusty, 24 stycz. 2002b: Linux 2.4 Packet Filtering HOWTO.
Schiffman, Mike, luty 2004: The Evolution of Libnet.
Schneier, Bruce i Mudge, list. 1998: Cryptanalysis of Microsoft's Point-to-Point Tunneling Protocol (PPTP). W Proceedings of the 5th ACM Conference on Communications and Computer Security.
Schneier, Bruce i Mudge, 1999: Cryptanalysis of Microsoft's PPTP Authentication Extensions (MS-CHAPv2). W CQRE '99, str. 192–203. Springer-Verlag.
Shimomura, Tsutomu, 1995: How Mitnick Hacked Tsutomu
Shimomura with an IP Sequence Attack.
http://www.totse.com/en/hack/hack_attack/hacker03.html
Silberschatz, Abraham i Peter Galvin, 2001: Podstawy systemów operacyjnych. Wydawnictwa Naukowo-Techniczne.
Strebe, Matthew i Charles Perkins, 2000: Firewalls - 'sciany ogniowe. Mikom.
Szyma'nski, Michal, 2003: Wardriving w praktyce. Hakin9, (3).
Tomaszewski, Mariusz, Maciej Szmit i Marek Gusta, 2005: Sprzcatanie pajceczyn - detekcja nielegalnego wspóldzielenia lcacza. Hakin9, (11).
Tung, Brian, grudz. 1996: The Moron's Guide to Kerberos, Version 1.2.2.
Watson, Paul, 30 pa'zdz. 2003: Slipping in the Window:
TCP Reset attacks.
http://www.osvdb.org/reference/SlippingInTheWindow_v1.0.doc
Wobst, Reinhard, 2002: Kryptologia. Budowa i lamanie zabezpiecze'n. Read Me.
Zalewski, Michal, 2001: Strange Attractors and TCP/IP
Sequence Number Analysis.
http://www.bindview.com/Services/Razor/Papers/2001/tcpseq.cfm
Zalewski, Michal, 2002: Strange Attractors and TCP/IP
Sequence Number Analysis - One Year Later.
http://lcamtuf.coredump.cx/newtcp/