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:
- 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.
- De ontvanger (de B host) zendt een pakket terug met een ACK
hiervan en zijn eigen ISN (dus ook met SYN gezet).
- 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:
- Bepaal welke hosts de target host vertrouwd.
- Bepaal welke algoritme de target host gebruikt voor de
generatie van ISN's.
- Flood de port van de trusted host die je als source adres
gaat gebruiken in de gespoofde verbinding.
- Doe een gespoofde handshake met de target host.
- 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.
- Hef de verbinding netjes op met een FIN-pakketje en een ACK
van de FIN van de target host.
- Drain de trusted host met een berg RST's.
- 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).
|