Sniffer pro routovací protokol RIP

Úkoly projektu Směrování RIP a RIPng

  1. Nastudovat směrovací protokoly RIP a RIPng,
  2. naprogramovat sniffer RIP a RIPng zpráv,
  3. naprogramovat podvrhávač falešných RIP Response zpráv,
  4. za použití naprogramovaných nástrojů provést úspěšný útok,
  5. naprogramovat podvrhávač falešných RIP Request zpráv.

Směrovací protokoly RIP a RIPng

Krátký exkurz do historie protokolů RIP a jejich RFC

Protokol RIP (Routing Information Protocol) měl své první RFC vytvořeno v roce 1988 a to s pořadovým číslem 1058, avšak principy protokolu i některé jeho části byly používány již dříve, což mělo za důsledek existenci různých implementací zdánlivě téhož protokolu. RFC 1058 pak popisuje implementaci rozšířenou v programech Berkeley Software Distribution (BSD) a dnes v souvislosti s tímto RFC mluvíme o RIP verze 1, neboť v roce 1993 vzniklo nové RFC 1388 nesoucí doplňující informace k protokolu, který je zde však pojmenován jako RIP verze 2. Také toto RFC bylo aktualizováno a to o rok později (RFC 1723) a konečně také v roce 1998 v RFC 2453. Poslední zmíněné RFC bylo jako nejaktuálnější popis protokolu použito pro implementaci programů v úkolech 2 a 3.

Vedle RIP verze 2, který je koncipován jako protokol používající IP verze 4, existuje také RIPng, což je implementace směrovacího protokolu RIP pro IP verze 6 s vlastním RFC 2080 vydaným roku 1997. RFC 2080 bylo druhým výchozím materiálem nutným k úspěšné implementaci programu z úkolu 2.

Popis protokolů RIP

Zde je několik výroků popisující vlastnosti protokolu RIP.
Základním kamenem protokolu je Bellmanův-Fordův algoritmus hledání nejkratší cesty v ohodnoceném grafu.
Ohodnocením hran grafu je počet hopů (skoků, směrovačů v cestě) od počátku k cíli, avšak s maximální hodnotou 15 hopů (0 je počátek, 16 je „nekonečno“).

Každý směrovač uchovává kompletní informace o svém okolí v tzv. Směrovací tabulce.
Směrovače každých 30 vteřin rozesílají celou svou směrovací tabulku a to buď všesměrově(broadcast, RIP verze 1) nebo skupinově(multicast, RIP verze 2) a zároveň přijímají směrovací tabulky ostatních směrovačů v sítí a podle nich aktualizují záznamy své směrovací tabulky.

Důsledky zmíněných výroků jsou následující. Jelikož je počet hopů omezen na 15, aby nedocházelo ke směrovacím smyčkám, je omezena také velikost sítě, ve které může být protokol použit.
Rozesílání celé směrovací tabulky každých 30 vteřin všemi směrovači zahlcuje síť (což však není až takový problém u malých sítí). Tento problém je částečně odstraněn u RIP verze 2, kde je rozesílání směrovacích tabulek provedeno skupinově (multicast). Některé implementace protokolu dokonce problém zcela odstranili tím, že směrovače vysílají své směrovací tabulky v různých časových intervalech.

Sniffer RIP a RIPng zpráv

Sniffer, neboli síťový analyzér, je síťová aplikace, která sleduje data putující po sítí nebo po její části a zachycuje je podle svého nastavení, aby z nich po dekódování získala informace pro uživatele.
Sniffer RIP a RIPng zpráv je nastaven tak, aby z proudu dat v síti odchytával pouze pakety protokolů RIP a RIPng (dále jen RIP), což v praxi znamená sledovat data proudící skrz síťové porty 520 (RIP) a 521 (RIPng). Ke sledování proudu dat na portech je v tomto případě využito rozhraní knihovny pcap (Packet Capture), která však již data neumí analyzovat a aplikaci předává všechny byty dat, tedy včetně hlaviček protokolů nižších modelových vrstev používaných protokolem RIP: Ethernet, IP a UDP. Aplikace musí znát strukturu či alespoň délku dat zmíněných vrstev, aby mohla úspěšně přistoupit k informacím o RIP. Dále bude ukázáno, jakým způsobem je použita knihovna pcap i jakým způsobem jsou analyzovány pakety.

Nejdříve však pár obecných informací o implementovaném snifferu a základní popis programu. Jako programovací jazyk byl zvolen jazyk C++, ale program je možno snadným zásahem přepsat i do jazyka C. Součtem je program složen jen ze tří funkcí včetně funkce main a funkce pro výpis chybových hlášení a z devíti datových struktur popisujících přijatá síťová data. Kromě knihovny pcap není použita žádná nestandardní knihovna.

Další popis bude rozdělen na část algoritmickou a část datovou.

Algoritmická část

Knihovna pcap má na svých internetových stránkách názorný tutoriál, díky kterému lze napsat právě tak jednoduchou aplikaci jako je Sniffer RIP a RIPng zpráv. Použití knihovny spočívá v otevření síťového zařízení, zkompilování a nastavení filtru dat, analýzy síťového provozu na otevřeném zařízení a nakonec uvolněním paměti. Analýza síťového provozu je vykonána knihovní funkcí pcap_loop, která jako jeden ze svých parametrů přebírá ukazatel na funkci (tzv. Callback funkci) definovanou uživatelem. Tato funkce, jež se v programu jmenuje got_packet, je stěžejní částí programu.

Uvnitř funkce got_packet programátor definuje, jakým způsobem jsou data interpretována. Jedním z parametrů funkce je ukazatel na začátek odchycených dat, takže se pomocí jednoduché ukazatelové aritmetiky dá přistupovat k libovolným bytům dat. Protože známe velikost hlavičky protokolu Ethernet, ale nepotřebujeme informace v ní uložené, stačí tuto část „přeskočit“. Informace z hlavičky IP už však potřeba jsou a to hlavně pro určení verze tohoto protokolu, neboť podle verze IP se selektivně určí, jestli se bude dále zpracovávat protokol RIP nebo RIPng. IP verze 4 značí přítomnost protokolu RIP a IP verze 6 naopak protokolu RIPng. Avšak číslo verze protokolu IP je v datech reprezentováno pouze jedním nibble a je tedy jednoduše možno přečíst pouze jeden byte a z něj vzít první 4 bity udávající číslo verze. Následuje ukázka přečtení hodnoty verze IP.

const u_char * vhl =(packet + offset);
int v = (int)* vhl >> 4; // 4 nebo 6

Na tomto příkladu je vidět ukazatelová aritmetika, kdy k počátku dat přičteme počet bytů, za kterým očekáváme požadovanou hodnotu. Přetypováním a bitovým posunem pak získáme použitelnou hodnotu.
Podobně jsou v programu interpretována všechna data, jen jsou mnohdy použity větší datové celky.
Interpretovaná data jsou příslušnou datovou funkcí vypsána na standardní výstup, čímž program naplňuje svůj úkol. Aplikace se ukončuje zasláním signálu SIGTERM.

Datová část

V příkladu uvedeném výše šlo o velmi jednoduchou ba dokonce o nejjednodušší datovou strukturu jazyka, o jeden byte. Na interpretaci RIP je ale potřeba složitějších struktur a ty jsou v programu samozřejmě definovány. Konkrétně pro protokol RIP jsou definovány tři datové struktury a pro RIPng dvě. Zde bude popsán pouze protokol RIP, protože RIPng je obdobný a po porozumění popisu RIP nebude problém porozumět i RIPng.

Informace, které nese protokol RIP, jsou rozděleny na hlavičku (header) a pole záznamů o maximálním počtu 25, přitom záznam (entry) může být buď autentizační nebo berný (nosný, regulérní – jedná se o vlastní pojmenování). Přesný popis jednotlivých položek hlavičky i obou typů záznamů lze získat v příslušném RFC. Za zmínku však jistě stojí popis záznamu v jazyce C++, neboť se jedná o strukturu obsahující jednak typ záznamu a jednak datový typ union s dalšími dvěma strukturami. Stejná velikost obou typů záznamů totiž dává možnost tímto zápisem popsat oba typy jako jednu datovou strukturu, což je při vytváření pole důležitá vlastnost. V jazyce C++ ale při takovém způsobu zápisu vzniká problém s tzv. struct alignment, zarovnáváním velikostí jednotlivých datových typů uvnitř struktury a programátor by to měl mít na paměti.

Zjednodušený zápis struktury části záznamu vypadá následovně.

struct RIP_entry {
	u_short address_family_id; // zjednodušeně: typ záznamu
	union {
		struct {
			u_short authentication_type;
			u_char authentication[16];
		} authentication;
		struct {
			u_short route_tag; // or not used
			in_addr	network;
			in_addr netmask; // or not used
			in_addr nexthop; // or not used
			u_int32 metric;
		} regular;
	} type;
};

Pro úplnou představu o popisu protokolu RIP v jazyce C++ je potřeba nahlédnout do zdrojového kódu aplikace.

Použití programu

Spuštění programu

./myripsniffer -i interface

Pro správný chod programu jsou často potřeba uživatelská práva správce.

Parametry programu

-i interface ...zadání síťového rozhraní interface, na kterém se bude odposlouchávat.

Podvrhávač falešných RIP Response zpráv

Aplikace určená k podvrhování je ve své podstatě útočný software s cílem oklamat řídící program směrovače tak, aby mezi záznamy své směrovací tabulky zařadil záznam útočníkův záznam. Jelikož jsou však všechny příchozí záznamy směrovačem pečlivě kontrolovány, musí být falešný záznam formálně správný, takže mu směrovač uvěří. Pokud navíc směrovač používá autentizační mechanizmy, je potřeba zajistit také úspěšnou autentizaci falešné zprávy směrovače (k tomu poslouží aplikace Sniffer popsaná výše).

Program aplikace ale není nikterak obtížné vytvořit. Zde popsaný program si vystačil se dvěmi funkcemi, jedné pro výpis chybového hlášení a druhou je funkce main. Funkce main je za to poměrně obsáhlá a obsahuje celou obsluhu podvrhávače, ale díky této její vlastnosti je výsledný kód jednoduchého programu přehlednější. Datové struktury jsou v programu definovány pouze dvě a jsou převzaty z programu Sniffer uvedeného výše. Jedná se o struktury pro práci s protokolem RIP verze 2.

Zajímavým problémem při řešení se stal převod hodnoty CIDR udávající masku podsítě na řetězec čtyř bytových čísel, tedy podoby IP adresy verze 4. Řešení bitovým posunem je nabíledni a také bylo použito. 32-bitové číslo IP adresy vytvoříme z hodnoty CIDR následujícím příkazem.

ip_num = htonl(~0 << (32 – CIDR));

Funkce htonl je zde důležitá, neboť bez ní by bylo pořadí bitů ve výsledném čísle obráceně.

Pozn.: Jelikož na referenčním počítači se systémem FreeBSD program pracuje správně i bez parametru -i (nepovinný dodatečně přidaný parametr), nebyl tento parametr v programu implementován.

Popis vytvoření a poslání falešné zprávy

Při vytváření falešné zprávy je záhodno mít úplnou kontrolu nad obsahem zprávy, tedy datech protokolu RIP. Tato činnost by se dala popsat takto: Deklaruj datovou strukturu protokolu, naplň tuto strukturu potřebnými daty a vytvoř otisk struktury ve formě řetězce bytů o délce původní struktury. Jelikož jsou v implementaci data rozdělena na hlavičku a tělo, provede se tato činnost dvakrát.

Použití programu

Spuštění programu

./myripresponse -r IPv4/[8-30] {-n Ipv4} {-m [0-15]} {-t [0-65535]} {-p heslo}

Pro správný chod programu jsou často potřeba uživatelská práva správce.

Parametry programu

Povinné
-r Ipv4/[8-30] ...IP adresa Ipv4 a maska podsítě [8-30] ve tvaru CIDR, která bude podvrhnuta směrovači
Nepovinné
-n Ipv4 ...IP adresa dalšího směrovače (next hop); pokud nezadáno použije se 0.0.0.0
-m [1-15] ...hodnota metriky protokolu (hop) v rozsahu 1 až 15; pokud nezadáno použije se 1
-t [0-65535] ...hodnota Router Tag protokolu; pokud nezadáno použije se 0
-p heslo ...heslo k autentizaci směrovače; není-li zadáno heslo předpokládá se nepoužití autentizace

Povrhávač falešných RIP Request zpráv

Program pro zasílání falešných Request zpráv protokolu RIP je implementačně velmi podobný podvrhávači Response zpráv. Jediným rozdílem jsou jiné data zprávy, tedy jiné hodnoty datové struktury popisující protokol RIP.

RFC 2453 hovoří o zasílání Request zpráv na multicast i o zasílání vybraným směrovačům. Program implementuje obě varianty, přičemž rozdíl spočívá jen ve změně adresy a portu. Při zasílání Request zprávy jednomu routeru je totiž nutné použít jiné číslo portu zdroje zprávy než je standardní číslo portu protokolu RIP 520. Z toho vyplývají i parametry programu a jejich omezení.

Použití programu

Spuštění programu

./myriprequest {-r Ipv4 -p port}

Pro správný chod programu jsou často potřeba uživatelská práva správce.

Parametry programu

Nepovinné
 Ipv4 ...IP adresa směrovače, kterému bude zaslána RIP Request zpráva
-p port ...Číslo portu, ze kterého se bude zpráva odesílat. Nesmí být rovno 520.
Oba parametry musí být uvedeny současně ve stanoveném pořadí.

Aplikace programů provedením útoku na směrovač

Pro úspěšný útok na směrovač používající protokol RIP verze 2 jsou potřeba programy myripsniffer a myripresponse. Prvním zmíněným programem útočník zjistí informace o směrovači, včetně autentizačního hesla, neboť způsob autentizace je u protokolu RIP verze 2 vždy pomocí nešifrovaného hesla. Další informace již prakticky nejsou potřeba a pro úspěšný útok stačí použít výchozí hodnoty programu myripresponse. Ten samozřejmě jako parametr požaduje alespoň podvrhovanou IP adresu a adresu masky podsítě.

Postup útoku

Pokud není uvedeno jinak, může být nutno spouštět aplikace jako správce systému (root).
Příklad útoku bude konkrétní a autentický. Použité síťové rozhraní je vmnet1.

1. Odchyt paketů na síťovém rozhraní

Příkaz: ./myripsniffer -i vmnet1
Vybrané informace z výstupu:

  • Paket od fe80::20c:29ff:feca:480d, protokol RIPng
    Přijaté záznamy (jen adresy, u všech je Route Tag 0, Metric 1):
    fd00::, fd00:a6:3660::, fd00:153:1848::, fd00:c80:38::, fd00:332a:2fb2::
  • Paket od 192.168.12.128, protokol RIP verze 2,
    Autentizace heslem, heslo: ISA>2a431d693ba
    Přijaté záznamy (u všech Metric 1, Subnet mask 255.255.255.0):
    10.0.0.0, 10.50.106.0, 10.110.111.0, 10.118.111.0, 10.221.116.0
  • Paket od 10.0.0.1, protokol RIP verze 2,
    Autentizace heslem, heslo: ISA>2a431d693ba
    Přijaté záznamy (u všech Metric 1, Subnet mask 255.255.255.0):
    10.50.106.0, 10.110.111.0, 10.118.111.0, 10.221.116.0

Získali jsme heslo, díky kterému bude možno poslat falešnou routu.

2. Zaslání falešné zprávy RIP Response

Příkaz: ./myripresponse -r 10.10.10.0/24 -p “ISA>2a431d693ba“

Zda-li se útok povedl, je třeba se přesvědčit ve směrovači. V tomto případě se povedl. Program myripresponse zaslal jediný paket se zprávou zabalenou v UDP datagramu. Při neúspěšném útoku je tedy dobré zkusit program spustit znovu, protože se může stát, že díky protokolu UDP nebude paket v pořádku doručen.