Volitelné položky IP hlavičky

Projekt do Směrovaných a přepínaných sítí

Autor: Dušan Jalůvka, JAL016

Obsah

Trochu teorie
Zaznamenávej směrovače
Zaznamenávej čas
Explicitní směrování
Striktní explicitní směrování
Upozornění pro směrovač
Nastavení a zapojení
Zapojení
Nastavení
Ukázka výsledků - CISCO
Zaznamenávej směrovače
Zaznamenávej čas
Explicitní směrování
Striktní explicitní směrování
Ukázka výsledků - linux
Zaznamenávej směrovače
Zaznamenávej čas
Explicitní směrování
Striktní explicitní směrování
Závěr

Trochu teorie

Volitelné položky v záhlaví IP datagramu patří k zajímavostem protokolu IP. Jelikož jejich používání znamená potenciální bezpečnostní riziko, mnozí provozovatelé sítí datagramy s těmito položkami zahazují. Volitelné položky rozšiřují IP záhlaví. IP záhlaví má omezenou délku na 60 B a z toho je 20 B povinných. Volitelné položky jsou proto omezeny maximálně na 40 B.

V dnešní době jsou definovány tyto volitelné položky:

  1. Zaznamenávej směrovače (record route)
  2. Zaznamenávej čas (timestamp)
  3. Explicitní směrování (loose source routing)
  4. Striktní explicitní směrování (strict source routing)
  5. Upozornění pro směrovač (IP Router alert option)
  6. Bezpečnostní omezení dle normy RFC-1108

Já jsem se v projektu zabýval prvními čtyřmi volitelnými položkami. Volitelné položky jsou v datagramu uvedeny hned za povinnými položkami záhlaví. Obecný formát volitelných položek je následující: první byte je kód volitelné položky, podle kterého se pozná, o jakou volbu se jedná. Za kódem následuje délka volitelné položky (1 B), dále pak data volitelné položky, která se liší podle použité volby.

1. Zaznamenávej směrovače

Pro tuto volbu se použije kód 0x07. Pokud je v IP záhlaví uvedena tato volitelná položka, pak všechny směrovače na cestě k cíli vyplní do záhlaví IP adresu výstupního rozhraní, na které posílá směrovaný datagram. Struktura volitelného záhlaví je znázorněna v následující tabulce.

Kód=0x07
1B
Délka
1B
Ukazatel
1B
1. IP adresa
4B
2. IP adresa
4B
3. IP adresa
4B
   ...    9. IP adresa
4B

Jednotlivé buňky pro IP adresy se nazývají sloty. Pole Ukazatel ukazuje na první volný slot. Každý směrovač do slotu, na který ukazuje ukazatel, zapíše adresu svého výstupního rozhraní a zvětší ukazatel o 4 byty. Z maximální délky volitelných položek v IP záhlaví vyplývá, že v záhlaví může být nejvíce devět slotů pro IP adresy. Ukázku datagramu s touto volitelnou položkou najdete níže.

2. Zaznamenávej čas

Tato volba je podobná předchozí. Místo IP adresy se do zahlaví zapíše časové razítko směrovače v době, kdy datagram směrovačem procházel. Čas se zaznamenává v milisekundách od poslední půlnoci. Strukturu záhlaví můžeme vidět v následující tabulce.

Kód=0x44
1B
Délka
1B
Ukazatel
1B
OF
4b
FL
4b
1. Časové
razítko
2. Časové
razítko
   ...    Časové
razítko

Oproti minulé volbě přibyl v záhlaví jeden byte rozdělený na dvě 4-bitové položky:

Jak to vypadá v praxi se můžete podívat níže.

3. Volné explicitní směrování

Tato volba umožňuje explicitně zadat jakou cestou (přes které směrovače) má být IP datagram směrován. IP datagram je pak dopravován přes uvedené směrovače. Narozdíl od striktního explicitního směrování zde nemusí být vyjmenovány všechny směrovače na cestě. Struktura záhlaví je téměř stejná jako u volby zaznamenávej směrovače. Jediný rozdíl je v kódu položky. Záhlaví ukazuje následující tabulka.

Kód=0x83
1B
Délka
1B
Ukazatel
1B
1. IP adresa
4B
2. IP adresa
4B
3. IP adresa
4B
   ...    9. IP adresa
4B

Při takovém směrování se mění i adresa příjemce IP datagramu. Tyto manipulace s IP adresami jsou docela komplikované. Manipulace s IP adresami v záhlaví IP datagramu jsou naznačeny na obrázku 1. Směrovače musí měnit nejenom ukazatel na aktuální slot, ale také mění adresu příjemce IP datagramu a přehazuje jednotlivé sloty. Ve fázi, kdy datagram vytváří nějaký program, je jako adresa příjemce v hlavičce IP datagramu uvedena IP adresa cíle. Dále je ale vždy jako adresa příjemce uvedena adresa následujícího směrovače v pořadí, jak je uvedena ve slotech. Na odesílatelově stroji se adresa příjemce vloží do posledního slotu (ten se uvolnil po tom, co se ostatní sloty posunuly doleva a první se vložil jako adresa příjemce do záhlaví IP datagramu. Pole ukazatel ukazuje vždy na slot s adresou dalšího routeru. Ten vždy vymění adresu příjemce s adresou, na kterou ukazuje ukazatel.

Explicitní směrování
Obrázek 1: Stav IP hlavičky při cestě datagramu

Potenciální bezpečnostní riziko - toto je výhodné pro hackery a jiné záškodníky, kterým to umožňuje odklonit tok dat podle jejich potřeby na router, kde provoz nebude sledován nebo na němž budou data modifikovány. Dalším možným zneužitím je přímé adresování počítačů v intranetu, ve kterém nejsou veřejné IP adresy a není je možné adresovat z internetu. Na obrázku 2 je ukázáno jak se toto dá zneužít. Z internetu například firewall blokuje ping do intranetu. Pokud se však útočníkovi povede umístit do intranetu PC s komutovaným spojem přímo do internetu, může např. pomocí explicitního směrování (ping -j Notebook 10.0.0.10) obejít firewall a přistupovat i k počítačům z internetu nedostupných.

Ukázka útoku
Obrázek 2: Ukázka možného zneužití explicitního směrování

Názorná ukázka takového směrování je níže.

4. Striktní explicitní směrování

Striktní explicitní směrování je velice podobné předchozímu s tím rozdílem, že je nutné zadat všechny směrovače na cestě. Kód volitelné položky v záhlaví IP datagramu je 0x89h. Pokud nejsou uvedeny všechny směrovače postupně za sebou, nebo jsou uvedeny nesprávně, IP datagram nedorazí do cíle a jako odpověď přijde zpět ICMP zpráva Destination Unreachable (kód Source Route Failed) od routeru, který nemůže dále datagram odeslat, protože stroj s IP adresou v záhlaví datagramu nemá přímo připojen. Datagram se striktním explicitním směrováním je ukázán níže.

5. Upozornění pro směrovač

Při transportu datagramů se směrovače v internetu nezajímají o to, co je jejich obsahem, pokud nejsou určeny přímo jemu. Někdy je třeba směrovači nějak sdělit, že data obsažená v datagramu by pro něj mohla být užitečná (například datagramy směrovacích protokolů - ve většině implementacích směrovacích protokolů se ovšem tato volba nepoužívá). V takovém případě se použije další volitelná položka. Upozornění pro směrovač (IP Router Alert Option) je volba s kódem 0x94h. Jeho struktura je znázorněna v další tabulce.

Kód=0x94
1B
Délka=4
1B
Data=0
2B

Datagram s touto volitelnou položkou je níže.

Nastavení a zapojení

Nyní popíšu, na jaké síti jsem IP volby testoval a které věci bylo třeba nastavit.

Zapojení testovací sítě

Funkčnost IP voleb jsem testoval na směrovačích CISCO a na směrovačích s operačním systémem Linux. Na routerech jsem nastavil IP adresy a spustil na nich směrovací protokol RIP verze 1.

Na obrázku 3 je testovací zapojení na směrovačích CISCO:

Testovací topologie
Obrázek 3: Testovací zapojení s routery CISCO 2501

Jsou tady zapojeny 3 CISCO routery 2501 a dva počítače. IP datagramy s volitelnými položkami záhlaví byly generovány na PC1 a cílovým počítačem bylo PC2.

Konfigurace a směrovací tabulky jednotlivých routerů:

Testovací zapojení sítě na linuxových routerech je na obrázku 4. Jelikož jsem měl k dispozici pouze tři počítače, bylo testovací zapojení trochu odlišné od zapojení se směrovači CISCO. Funkčnost testu IP voleb tím ovšem nebyla omezena.

Testovací topologie
Obrázek 4: Testovací zapojení s linuxovými routery

Jsou tady 3 PC s operačním systémem linux (Slackware, jádro 2.6.10). Všechny počítače byly konfigurované jako routery pomocí softwaru Zebra. IP datagramy s volitelnými položkami záhlaví byly generovány na notebooku (N) a cílovým počítačem byl PC stolni (S). Konfigurace a směrovací tabulky jednotlivých routerů:

Potřebná nastavení

Pro generování datagramů s volbami v IP záhlaví jsem většinou použil příkaz ping. Pouze pro striktní explicitní směrování na linuxu jsem nezjistil, jak s příkazem ping vygenerovat odpovídající datagram. Na internetu jsem pak po chvíli hledání narazil na program sing. Sing umožňuje zasílání ICMP požadavků s velkým množstvím voleb. Jinak je podobný programu ping. Domovská adresa projektu sing je na www.sourceforge.net/projects/sing.

Zakázání explicitního směrování na windows jako směrovače se provede změnou hodnoty v registru:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting

Na linuxu jako routeru i jako stanice bylo nutné povolení explicitního směrování. Pokud toto nebylo povoleno, program sing neposlal žádný datagram a na nutnost povolení i upozornil. Pokud explicitní směrování nebylo povoleno na cílové stanici, tak na takový datagram tato stanice nereagovala ani zasláním Destination Unreachable.
Povolení se provede:

# echo 1 > /proc/sys/net/ipv4/conf/all/accept_source_route

Na CISCO routerech je ve výchozím nastavení explicitní směrování povoleno.
Zakázání se provede:

RouterD(config)# no ip source-route

Pro klientské stanice s linuxem je nutné explicitní směrování povolit. Na stanicích s Windows to není nutné, ve výchozím nastavením funguje volné i striktní explicitní směrování.

Ukázky výsledků - CISCO

Nyní předvedu jednotlivé výsledky z konkrétních pokusů se zapojením s CISCO routery. Výsledky na linuxových routerech jsou na této stránce. Dále se vždy zmíním, jak daný datagram vygenerovat a uvedu odkaz na datagram s IP volbou zachycený Etherealem.

Zaznamenávej směrovače

Datagram s touto IP volbou můžeme vygenerovat buď pingem Microsoftu s parametrem -r pocet_alokovanych_slotu, kde pocet_alokovanych_slotu je počet slotů alokovaných v hlavičce datagramu. Na linuxu je pro ping parametr -R bez udání počtu alokovaných slotů. Linux pak vygeneruje datagram s maximálním počtem (8) slotů. Výsledek linuxového pingu je na dalším výpisu. Jsou v něm uvedeny jak adresy zdrojového PC tak vždy adresy odchozích rozhraní routerů.

Ping z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):

# ping -R 192.168.3.2
PING 192.168.3.2 (192.168.3.2) 56(124) bytes of data.
64 bytes from 192.168.3.2: icmp_seq=1 ttl=62 time=41.8 ms
RR:     192.168.4.2
        192.168.5.2
        192.168.3.1
        192.168.3.2 (*)
        192.168.3.2
        192.168.5.1
        192.168.4.1
        192.168.4.2

64 bytes from 192.168.3.2: icmp_seq=2 ttl=62 time=41.5 ms       (same route)

* - tady končí cesta k cíli. Do odpovědi (echo reply) se kopírují nasbírané adresy.

Etherealem jsem odchytil tyto datagramy:

Zaznamenávej čas

Volbu record timestamps vygenerujeme v IP záhlaví pomocí pingu Microsoftu ( parametr -s pocet_alokovanych_slotu, počet počet alokovaných slotů musí být nejvýše 4 a vygeneruje se tak datagram se čtyřmi sloty pro dvojice adresa-čas) nebo pomocí linuxového pingu. U linuxového pingu se použije parametr -T a za ním se uvede typ časového razítka. Tyto typy mohou být tři:

Ukázka datagramu s volbou zaznamenávej čas a adresy je na stránce se zapojením linuxových routerů.

Na další ukázce je použita volba -T tsonly, která vygenerovala v záhlaví osm 4-bitových slotů pouze pro čas.

Ping z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):

# ping -T tsonly 192.168.3.2
PING 192.168.3.2 (192.168.3.2) 56(124) bytes of data.
64 bytes from 192.168.3.2: icmp_seq=1 ttl=62 time=42.9 ms
TS:     60105008 absolute
        2631222 absolute not-standard
        -154 not-standard
        -7166602
        0
        3 not-standard
        191 not-standard
        7166645

64 bytes from 192.168.3.2: icmp_seq=2 ttl=62 time=42.1 ms

Etherealem jsem odchytil tyto datagramy:

Volné explicitní směrování

Pro správnou funkčnost explicitního směrování (loose source routing) je třeba toto povolit. Jak to udělat bylo popsáno výše. Pro generování datagramu s volbou explicitní směrování můžeme použít ping od Microsoftu (volba -j smerovac1 smerovac2 ... smerovac9). V linuxu není třeba zadávat u pingu žádný parametr, stačí pouze uvést seznam routerů oddělených mezerami, přes které se má směrovat. Já jsem použil program sing. Pro explicitní směrování stačí uvést jako parametr seznam routerů oddělených zavináčem.

Pro demonstraci jsem vybral takovou cestu, aby se lišila od cesty vypočtené směrovacím protokolem RIP. RIP by použil nejkratší cestu pro směrování (D-C), ale já jsem požadoval směrování přes routery D-E-C. Ukázka volného explicitního směrování je na následujícím výpisu:

SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):

# sing 192.168.1.2@192.168.3.2
SINGing to 192.168.1.2 (192.168.1.2): 16 data bytes
16 bytes from 192.168.3.2: seq=0 ttl=61 TOS=0 time=39.201 ms
16 bytes from 192.168.3.2: seq=1 ttl=61 TOS=0 time=38.250 ms

Etherealem jsem odchytil tyto datagramy:

Striktní explicitní směrování

Striktní explicitní směrování (strict source route) se na MS Windows vygeneruje pingem s parametrem -k smerovac1 smerovac2 ... smerovac9. Na linuxu se mi nepodařilo zjistit, jak s linuxovým pingem vygenerovat datagram se striktním explicitním směrováním. Proto jsem opět použil program sing. Jako parametr se uvede seznam routerů oddělených symbolem procento, jak je vidět níže.

Nejprve jsem neuvedl všechny routery na cestě, takže se vrátil datagram s odpovědí Destination unreachable od routeru, který neměl jako svého souseda router, který byl uveden jako další v pořadí. Tím pádem se na cílový počítač datagram ani nedostal. Taková ukázka je na dalším výpisu:

SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):

# sing 192.168.1.2%192.168.3.2
SINGing to 192.168.1.2 (192.168.1.2): 16 data bytes
Ouch!! 192.168.1.2 sings
--- 192.168.1.2 sing statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

Etherealem jsem odchytil tyto datagramy:

Při druhém pokusu jsem už uvedl seznam všech routerů na cestě a pak se mi vrátila i odpověď od cílové stanice.

SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):

# sing 192.168.4.1%192.168.1.2%192.168.2.1%192.168.3.2
SINGing to 192.168.4.1 (192.168.4.1): 16 data bytes
16 bytes from 192.168.3.2: seq=0 ttl=61 TOS=0 time=42.967 ms
16 bytes from 192.168.3.2: seq=1 ttl=61 TOS=0 time=42.719 ms

Etherealem jsem odchytil tyto datagramy:

Upozornění pro směrovač

Volbu IP Router Alert Option jsem odchytil, když se router přihlašoval do multicastové skupiny pro příjem RIPv2 updatu ve zprávě Membership Report protokolu IGMP.

    Source: 192.168.0.2 (192.168.0.2)
    Destination: 224.0.0.22 (224.0.0.22)
    Options: (4 bytes)
        Router Alert: Every router examines packet
Internet Group Management Protocol

Celý datagram k nahlédnutí je tady.

Závěr

Volitelné položky IP záhlaví je možné používat téměř na všech síťových prvcích v internetu. Internetoví poskytovatelé ovšem na většině takových prvků z bezpečnostních důvodů tyto datagramy zahazují. Nebezpečné může být nejspíše pouze explicitní směrování, proto by bylo dobré, aby ostatní IP volby fungovaly kdekoliv v internetu.

Obsah: CISCO Linux
Vypracoval: Dušan Jalůvka jako projekt do Směrovaných a přepínaných sítí.
Email: dusan.jaluvka<zavináč>gmail.com
Web: www.jaluvka.info