[Home/Nieuws]  [Magazines]  [Meetings]  [Downloads]  [Redaktie]  [Geschiedenis]


IP Spoofing
door /dev/null

Deze aflevering van Hakken op Internet gaat over IP Spoofing. Sinds de ondertussen bijna legendarische inbraak van Kevin Mitnick bij beveiligingsspecialist Tsutomu Shimomura in december '94 is dit dit een van de meest besproken hackmethoden. Hoewel het concept al in 1985 gepubliceerd werd was deze inbraak de eerste keer dat er in de praktijk gebruik van werd gemaakt. In dit artikel wordt uitgelegd hoe het allemaal in elkaar zit.

De inbraak van Kevin Mitnick
Op kerstmis 1994 brak een anonieme hacker in op computersystemen van computerbeveiligingsexpert Tsutomu Shimomura. Hij bleek op zoek te zijn naar de code voor OKI cellulaire telefoons die zich op een van de computers bevond. Anderhalve maand later, na een intensieve speurtocht, werd dader Kevin Mitnick gearresteerd. Mitnick werd toen al twee jaar gezocht door de FBI. De media stortte zich op het verhaal, waardoor Mitnick uitgroeide tot de meest bekende 'computercrimineel' in de geschiedenis.
Technisch gezien is de inbraak interessant omdat voor het eerst in de praktijk een methode gebruikt werd die tot dan toe alleen in theorie bekend was, namelijk IP spoofing.
Wat was er precies aan de hand? Mitnick wist dat de file die hij zocht te vinden was op een computer met de naam ariel.sdsc.edu. Hij zag dat er een verbinding was naar ariel, vanaf een X-terminal osiris genaamd. Als hij op osiris kon komen, zou hij via de verbinding naar ariel kunnen.
Verder onderzoek leerde dat osiris een lokale server beschouwde als 'trusted host', oftewel iemand kon vanaf de server inloggen op osiris zonder een password te hoeven ingeven. Deze service wordt geleverd door de zogenaamde remote login daemon. Voor authenticatie van de in te loggen gebruiker kijkt deze daemon naar het IP adres van de remote host. Als hij dus verbinding met de daemon kon maken met het adres van de server, zou osiris hem binnen laten. De methode die hij hiervoor gebruikte is IP spoofing, met TCP sequence number prediction om precies te zijn.

Wat is IP Spoofing?
IP spoofing is het gebruik van een ander IP adres dan het adres dat aan de host is toegewezen. In het geval van Mitnick dus het adres van de server. Een IP adres is een logisch adres, wat zoveel wil zeggen dat het niet fysiek in de hardware zit gebakken (zoals meestal bij ethernet adressen). Het fijne is dat een source host in een te versturen IP pakket zelf het source adres neer zet. De standaard kernel vult hier altijd netjes het eigen adres van de host in. Een proces met voldoende
privileges (root onder UNIX, maar bijvoorbeeld iedereen onder DOS) kan echter ieder willekeurig adres neer zetten.
Is dit alles? Alleen maar het adres veranderen en klaar is Kees? Ja, voor het spoofen van IP pakketten is dit alles. Maar met IP alleen kun je niks, wil je contact met een andere computer maken moet je een van de protocollen bovenop IP gebruiken, zoals UDP of TCP. Met UDP blijft het simpel: het is slechts een gebruikersinterface voor IP en voegt behalve portnummers niet veel toe. Onze interesse gaat echter uit naar TCP omdat dat het protocol is dat de remote login daemon gebruikt.

Spoofing voor TCP
Het Internet Protocol (IP) is verbindingsloos en onbetrouwbaar. Het dient alleen om datagrammen te zenden over een netwerk, zonder garanties op (tijdige) aflevering. Het Transmission Control Protocol (TCP) daarentegen is verbindingsgericht en betrouwbaar. TCP draait bovenop IP en maakt van allerlei controlmechanismen gebruik om een betrouwbare verbinding te kunnen leveren. Ik zal hier een korte uitleg geven van het TCP protocol.

Inhoud van een TCP pakket
0                    1                    2                    3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port           |        Destination Port         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Sequence Number                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Acknowledgment Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data  |           |U|A|P|R|S|F|                                |
| Offset| Reserved  |R|C|S|S|Y|I|             Window              |
|       |            |G|K|H|T|N|N|                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum             |          Urgent Pointer         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Options                     |     Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figuur 1. TCP pakket

In figuur 1 staat de opbouw van een individueel TCP pakket. Eén regel is 32 bits breed. De Source en Destination Ports zijn de bekende UNIX ports. In ons geval willen we naar port 513 van de remote login daemon. In het computernetwerken jargon wordt de remote TCP handler de peer genoemd. Het Sequence Number geeft aan welk volgnummer de eerste data byte in het pakket heeft. Alle data die een host zendt via een TCP verbinding krijgt een volgnummer. Per verzonden byte wordt dit nummer met 1 opgehoogd. Het Acknowledgment Number geeft aan welk sequence number van de andere host verwacht wordt. De daar aan voorafgaande bytes zijn dan dus geaccepteerd. Data Offset bevat het aantal 32 bit woorden dat de header groot is. Dit is afhankelijk van het aantal Options dat wordt meegegeven, maar het is dus minimaal 4. Vervolgens komen er een aantal vlaggen:

  • URG. Als deze vlag wordt gezet als er in het pakket ergens urgente data is, zoals afbreek-codes als control-C in een telnet sessie. De 'Urgent Pointer' geeft aan waar deze data te vinden is.
  • ACK. Geeft aan dat 'Acknowledgement Number' geldig is. Wanneer een verbinding geopend is, hoort deze vlag altijd gezet te zijn.
  • PSH. De ontvangende TCP handler moet zo snel mogelijk de data doorgeven ('pushen') aan het bovenliggende protocol. Er mag dus niet gebufferd worden. Voor interactieve verbindingen, zoals telnet staat deze vlag altijd aan.
  • RST. Als er een ernstige niet te corrigeren fout is opgetreden wordt deze 'reset' vlag gezet om de verbinding abrupt op te heffen.
  • SYN. Deze synchronisatie vlag wordt alleen gebruikt bij het opzetten van de verbinding.
  • FIN. De finish vlag geeft aan dat de host geen data meer heeft om te zenden en de verbinding wil beëindigen. De host blijft nog wel wachten op data van de andere kant, totdat deze ook een FIN message stuurt. In het Window veld staat hoeveel bytes de peer mag zenden zonder op een acknowledgment te hoeven wachten. Deze methode, bekend als een 'sliding window protocol' verhoogt de performance van de verbinding. De checksum is een controlegetal voor de data en de header van het pakket. Met de options, tot slot, kunnen eventueel nog dingen worden ingesteld als de maximale grootte van een pakket.

Initialisatie van een TCP verbinding
Het opzetten van een TCP verbinding geschiedt met behulp van een zogeheten three way hand shake protocol:

  1. De host die de verbinding wil opzetten (de A host) verzendt een pakket met de SYN vlag gezet. In het Sequence Number veld zet hij het zogeheten Initial Sequence Number.
  2. De ontvanger (de B host) zendt een pakket terug met een ACK hiervan en zijn eigen ISN (dus ook met SYN gezet).
  3. De A host zendt een ACK voor het pakket uit stap 2.

Wat is het nut van een ISN, waarom niet gewoon bij 0 beginnen? Een TCP verbingen wordt volledig bepaald door de gebruikte IP-adressen en port nummers. Nadat een verbinding gesloten is kan dezelfde combinatie worden hergebruikt. Als nu een verdwaald pakket uit een oude verbinding opeens opduikt kan deze een nieuwe verbinding in de war sturen. Door nu een ISN te kiezen dat bij de nieuwe verbinding een heel andere waarde heeft is de kans klein dat het oude pakket een sequence number bevat dat binnen de toegestane waarden valt (= Acked Seq. Nr. t/m Acked Seq. Nr. + Window). RFC 793 specificeert dat het ISN gegenereerd moet worden aan de hand van een klok die iedere 4 microseconden met 1 opgehoogd wordt.

Sequence number prediction
Bovenstaand handshake protocol maakt het moeilijk om een TCP verbinding te spoofen: de spoofer kan niet zien welk ISN de target host gebruikt (alle replies gaan tenslotte naar de host waarvan het IP-adres 'geleend' is), waardoor deze in stap 3 van de handshake niet geACKed kan worden. Gelukkig zijn er veel OS programmeurs die geen RFC's lezen. In BSD4.2 en daarvan afgeleide systemen wordt het ISN iedere seconde met 128000 en iedere verbinding met 64000 opgehoogd, erg voorspelbaar dus.Wat Mitnick's programma dan ook deed, was eerst een gewone verbinding naar de target host maken en vervolgens het terug ontvangen ISN + 64000 gebruiken voor de gespoofde verbinding. Praktijktesten wijzen uit dat dit in bijna 90% procent van de gevallen goed gaat (in de overige gevallen was +192000 dus juist geweest).

Flooding
Er is nu één probleem dat een geslaagde aanval in de weg staat: alle replies van de target host gaan naar de trusted host Deze verwacht helemaal niets en stuurt dan ook prompt RST pakketten terug om de target host te laten stoppen. De gespoofde verbinding wordt zo snel de nek omgedraaid. Gelukkig is er een methode om de trusted host stil te houden. Deze heet 'flooding'. Het principe achter flooding is als volgt: per port houdt de kernel een queue bij van alle half open verbindingen. Dat zijn verbindingen waar bij al wel een SYN-ACK (stap 2) verstuurd is, maar nog geen ACK hiervan ontvangen is. Wanneer de queue helemaal vol zit (bij sommige kernels is dit al bij 8 verbindingen!) worden alle nieuwe aanvragen voor een verbinding genegeerd. Het mooie is nu dat de SYN-ACK van de target host ook wordt aangezien als een aanvraag voor een nieuwe verbinding, omdat de SYN vlag gezet is!
De makkelijkste manier om te flooden is om SYN pakketten te sturen met IP-adressen van onbereikbare host als source. De SYN-ACKs verdwijnen dan in het niets en de half open verbinding blijven in de queue staan tot een time out (die soms heel lang kan duren!). Het is dan ook netjes om na een geslaagde spoofing de host te 'drainen', d.w.z. RST-pakketten te zenden die de queue weer leeg maken.

IP Spoofing samengevat
Samengevat bestaat een IP spoofing attack uit de volgende stappen:

  1. Bepaal welke hosts de target host vertrouwd.
  2. Bepaal welke algoritme de target host gebruikt voor de generatie van ISN's.
  3. Flood de port van de trusted host die je als source adres gaat gebruiken in de gespoofde verbinding.
  4. Doe een gespoofde handshake met de target host.
  5. Zend de gewenste data via de zojuist gecreëerde eenwegs verbinding. Mitnick gebruikte hier echo "+ +" > .rhosts om zo via een gewone verbinding toegang te kunnen krijgen.
  6. Hef de verbinding netjes op met een FIN-pakketje en een ACK van de FIN van de target host.
  7. Drain de trusted host met een berg RST's.
  8. Geniet van de nieuw verworven privileges op de target host. Mitnick begon van de gehackte osiris meteen de volgende computer (ariel) te kraken, met een methode die connection hijacking genoemd wordt, maar dat valt buiten de scope van dit artikel

Zachte waar
Om met IP spoofing te kunnen experimenteren heb ik een simpele implementatie van IP spoofing geschreven. Het werkt onder Linux kernel versie > ± 1.3.70. De programma's 'sndsyn' en 'sndrst' dienen om de trusted host te flooden dan wel weer bereikbaar te maken. Met 'detseq' kan gekeken worden met welke hoeveelheid het initiële volgnummer wordt opgehoogd bij iedere nieuwe verbinding. 'spoof' tenslotte, doet het eigenlijke werk. Als je in de te zenden data een geldige login zet, ben je binnen. Zie de bijgevoegde README file voor meer informatie over compilatie en gebruik van de programma's.

Leesvoer
Ten eerste zijn RFC 791 en 793 zeer lezenswaardig. Zij geven een beschrijving van respectievelijk het IP en het TCP protocol. Een must is ook "A Weakness in the 4.2BSD Unix TCP/IP Software" geschreven Robert T. Morris. Ja, dit is dezelfde Morris die later de bekende Internet worm maakte! In deze publikatie wordt voor het eerst het principe van een IP Spoofing Attack beschreven. Het dateert overigens al uit 1985, dus ondertussen heeft iedereen al 11 jaar de tijd gehad om zich tegen spoofing te wapenen! (Geen medelijden voor slachtoffers dus.)
Voor wie om het te grote ego van Shimomura heen kan lezen is "Takedown" van John Markoff en Tsutomu Shimomura zelf wel aardig. Dit is zeker niet het enige boek over Mitnick vs Shimomura, kijk in de betere boekhandel als je er nog niet over uitgelezen bent (of een wat hackervriendelijker perpectief zoekt).

De informatie in 't Klaphek dient slechts een educatief doel. Gebruik van deze informatie zou strafbaar kunnen zijn. De redaktie wijst iedere verantwoordelijkheid voor gebruik door lezers van de in 't Klaphek opgenomen informatie af. De mening van een auteur weerspiegelt niet noodzakelijkerwijs de mening van de redaktie of uitgever.