# Internet protocol spoofing

Internet Protocol Spoofing of IP spoofing is een techniek om ongeautoriseerde toegang te verkrijgen tot een computer via diens IP stack. De techniek is gebaseerd op het vervalsen van de identiteit van een andere computer en is bijzonder effectief als de gefingeerde identiteit die is van een entiteit die door de aangevallen computer wordt vertrouwd.

## De basis

IP-spoofing maakt gebruik van twee dingen om een succesvolle aanval op te zetten:
   * Een aangevallen computer herkent de herkomst van TCP/IP-pakketten enkel en alleen aan het IP-adres dat in de IP-header vermeld staat; deze header kan simpelweg aangepast worden.
   * Wanneer een bericht in stukken verzonden wordt over een Internetverbinding, wordt de volgorde van de stukken bijgehouden in een teller in de TCP-header van ieder pakket. De manier waarop de teller voor ieder pakket en voor iedere boodschap wordt verhoogd, maakt dat het volgende nummer dat een computer in een pakket verwacht te ontvangen met een zekere nauwkeurigheid voorspelbaar is.
Bij een IP-spoofing-aanval maakt de aanvaller van deze twee zaken gebruik om te proberen zijn slachtoffer te laten geloven dat hij een andere (vertrouwde) computer is dan hij eigenlijk is.

## Het idee

Computers in een Internetverbinding maken gebruik van het TCP/IP-protocol om berichten te versturen. Deze berichten bestaan uit data die verstuurd worden van een zender Z naar een ontvanger O.
Omdat Internet een onbetrouwbaar medium is, wordt een aantal technieken toegepast om voor de eindgebruikers van Z en O een betrouwbare communicatie te simuleren. Het bericht wordt niet ineens verzonden, maar wordt verdeeld in kleine pakketten die makkelijk opnieuw kunnen worden verzonden. Daarbij wordt ieder pakket verzonden in een "enveloppe" met administratieve informatie, zoals zender, ontvanger, afgelegde route en volgorde van het pakket binnen het bericht.
Om een langdurige verbinding aan te kunnen bieden aan de eindgebruikers, maakt het TCP/IP-protocol gebruik van meerdere lagen. De IP-laag is verantwoordelijk voor het zenden en ontvangen van pakketten. De TCP-laag is verantwoordelijk (onder meer) voor het aan elkaar knopen van pakketten tot zogeheten transmissie-sessies. Een transmissie-sessie bestaat eruit dat de TCP-lagen van Z en O onderling een aantal controle-berichten uitwisselen ("elkaar de hand schudden") om een sessie te openen, dan wederzijds datapakketten overdragen en ten slotte controleberichten uitwisselen om de sessie af te sluiten.
Wanneer Z een sessie wil openen met O, is het aan O om te beslissen of dat mag en hoe de berichten van Z behandeld worden. Wanneer O beslist dat Z een sessie mag openen en bepaalde handelingen op O uit mag voeren, dan zeggen we dat Z vertrouwd wordt door O.
Stel nu dat een aanvaller A een sessie wil openen met O. A zou dit kunnen doen door O ervan te overtuigen dat hij eigenlijk Z is.

## De aanval

Het is voor A niet zo vreselijk moeilijk om te beweren dat hij Z is: als hij het IP-adres van Z weet (en dat moet, want anders kan hij niet beweren dat hij Z is) kan hij TCP/IP-pakketten gaan versturen met het IP-adres van Z als afzender-adres (dat wordt verder nergens nagekeken of verboden).
Het probleem voor A is dat hij, om een sessie te openen met O, niet alleen moet beweren dat hij Z is maar dat hij ook handen moet schudden. Dat wil zeggen, hij moet pakketten uitwisselen. En dat laatste is minder makkelijk want A kan wel pakketten sturen naar O maar O's antwoorden gaan naar Z en niet naar A (want Z was zogenaamd de afzender). Dit heeft voor A twee nadelen:
   * A kan niet zien wat O doet. Hij kan dus de volgorde van de pakketten verprutsen, of iets anders doen waardoor O de verbinding weigert.
   * O ontvangt van Z (eigenlijk A) een verzoek om handen te schudden en een sessie te starten. Daarop zegt O tegen Z (de echte Z): "Dat is prima". Hierop reageert Z uiteraard met de mededeling "Ik weet niet waar je het over hebt" (in TCP-terminologie, een reset-bericht). Waarop O de verbinding verbreekt.
De eerste stap in de aanval van A moet dus zijn om op de een of andere manier Z uit de lucht te halen, zodat deze geen reset-bericht kan sturen. Hiervoor wordt vaak een Denial of Service aanval gebruikt, bijvoorbeeld middels SYN-flooding (het opsturen van zoveel SYN-berichten dat de TCP/IP-stack van Z eraan onderdoor gaat).
Daarna kan A beginnen aan een handenschud-procedure met O. Hierbij wordt A gehinderd door het feit dat O denkt dat het handenschudden door Z is begonnen en dus al zijn antwoorden naar Z stuurt. A ziet dus niet hoe O reageert op A's poging tot handen schudden.
Wat de IP-stack betreft, maakt dit niet uit. Maar de TCP-stack van O kijkt naar de volgorde van berichten en bepaalt bij welk nummer de teller van de pakketten in het bericht begint te lopen. Binnen een bericht moeten de pakketten over en weer oplopende, opvolgende nummers hebben. Maar het nummer van het eerste pakket kan in principe overal liggen in het 32-bit gebied, dus tussen 0 en 4.294.967.295.
Op dit punt maken de meeste spoofing-aanvallen gebruik van het feit dat de nummertoewijzing van TCP-stacks meestal toch niet op toeval berust maar redelijk voorspelbaar is. Als A zijn aanval begint door onder zijn eigen adres een paar pakketten te sturen naar O, dan krijgt A van O vaak een aantal reset-berichten (met een TCP cijfer). Uit een enkel bericht weet A zo'n beetje waar de teller van O is. Met meerdere berichten kan A kijken hoeveel tijd pakketten nodig hebben om de reis van A naar O en terug te maken en hoe snel de teller van O bijgewerkt wordt. Hiermee kan A vaak redelijk schatten hoe de teller van O van waarde verandert.
Met deze informatie kan A proberen om handen te schudden met O. Hierbij stuurt A een aanvraag voor een sessie naar O (en beweert daarbij Z te zijn). Dan schat A in hoelang O nodig heeft om een reactie naar Z te sturen en welk nummer die reactie zal hebben. Daarna stuurt A op zijn beurt weer de benodigde reactie (weer zogenaamd van Z), met het juiste cijfer.
Er zijn op dit moment een aantal mogelijkheden:
* Als A te laag ingeschat heeft, ontvangt O een pakket met een cijfer dat al langsgekomen is. O neemt dan aan dat het een herhaald pakket is en gooit het weg. Op dat moment faalt de aanval (maar A kan natuurlijk gokken waar het verkeerd is gegaan en nog eens proberen).
* Als A goed heeft gegokt, heeft A een sessie met O. Dan kan A proberen om O een paar commando's te sturen.
* Als A te hoog heeft gegokt, zijn er weer twee mogelijkheden:
** A heeft te hoog gegokt maar wel in mogelijke gebied van nummers (er is een limiet aan hoever de nummers vooruit mogen lopen op het volgende, verwachte nummer). In dat geval neemt de TCP-stack aan dat er nog pakketten moeten komen en wordt het aanvallende pakket opgeslagen tot de ontbrekende pakketten aankomen. Als gevolg hiervan kan de aanval alsnog slagen en een andere communicatie falen.
** A heeft te hoog gegokt en veel te hoog gegokt. De TCP-stack van O gooit het pakket weg. Maar de TCP-stack stuurt wel een bericht naar Z met daarin het volgende getal dat verwacht werd. Als A nu weer een reset-bericht laat genereren door O, kan A uit de "sprong" in cijfers wellicht gokken wat er verkeerd gegaan is bij zijn aanval.

## Het nut

Een spoofing-aanval is meestal een voorbereiding op iets groters. Een sessie is nooit een groot geheel, vooral omdat het niet opgemerkt mag worden door de beheerder van het aangevallen systeem en omdat A door zijn blindheid te gelimiteerd is om echt grote dingen te kunnen doen. De meeste spoof-aanvallen dienen om een achterdeur in het doelsysteem in te bouwen waardoor A later makkelijk in kan loggen op het doelsysteem – bij voorkeur als beheerder. Dan kan A het doelsysteem volledig overnemen.

## Tegenmaatregelen

Er zijn verscheidene tegenmaatregelen tegen de verschillende variaties op spoofing-aanvallen. De meeste verdedigingen zijn gebaseerd op pakket-filtering door firewalls. Te denken valt dan aan analyse van pakketten door het aangevallen systeem om te herkennen dat een pakket niet mogelijk kan komen van het systeem dat in het pakket beweerd wordt. Bijvoorbeeld: een pakket dat van het open internet komt, kan niet van binnen het interne netwerk komen.
Van heel andere orde is de verdediging van het systeem dat door een aanvaller nagebootst wordt. De aanvaller moet dit systeem uitschakelen. Als dit systeem gewapend is tegen de bekendere DOS-aanvallen (zoals SYN-floods), dan is dat ook een verdediging tegen spoofing.
* IP Spoofing: An Introduction (Matthew Tanase)