9.8. IP et l'IP-Spoofing

Cette méthode de piratage date un peu. Mais elle demeure légendaire par l'utilisation qu'en a fait Kevin Mitnick en 1995 contre le Supercomputer Center de SanDiego protégé par Tsatumo Shimomura. Néanmoins, cette faille était connue depuis février 1985 comme le montre le rapport Weakness in the 4.2BSD Unix TCP/IP software écrit par Robert Morris.

L'IP spoofing se base sur une usurpation d'adresse IP. L'IP spoofing est utilisé lorsque deux hôtes sont en relation de confiance grâce à leurs adresses IP, c'est-à-dire que la seule authentification faite au niveau du serveur consiste en une vérification de l'adresse IP du client.

L'IP spoofing a souvent lieu contre les services rlogin et rsh car leur mécanisme d'authentification est basée sur l'adresse IP. Le principe est simple : dès qu'un client possède une connexion établie sur le serveur avec un mode d'authenfication basée sur l'adresse IP, le pirate va essayer de se faire passer pour le client auprès du serveur. Pour cela, il va empêcher le client de dialoguer avec le serveur et répondra à sa place.

L'IP-Spoofing est une attaque concernant un nombre limité de machines. Vous découvrirez pourquoi en lisant la suite.

9.8.1. Un peu de théorie ...

Le protocole IP est non-orienté connexion, il n'assure aucune vérification de la réception des paquets et ne se soucie guère de la façon de les traiter. IP n'assure qu'un routage d'une adresse vers autre. Il est donc facile de duper le routage IP en injectant des paquets falsifiés ayant des adresses IP valides sur le réseau.

Le protocole TCP, quant à lui, assure une fiabilité de la remise des paquets grâce à des numéros de séquences qui les distingue un à un. Chaque paquet TCP possède deux numéros, le numéro de séquence et le numéro d'acquittement. Ces deux nombres sont codés sur 32 bits. Ils sont uniques, afin de ne pas confondre les paquets lors de leurs traitements.

C'est sur ces bases que nous allons décrire l'attaque.

Imaginons que le client A est connecté en rsh sur le serveur B. Le pirate C va tenter de voler la connexion au client.

Il va en premier lieu réduire au silence le client en le saturant avec des attaques tels que le syn-flooding, le déni de service (voir Section 6.5, « Les attaques par déni de services »).

La seconde partie de l'attaque est assez simple. Le pirate envoie une série de demandes de connexion au serveur ( paquets TCP avec le flag SYN armé) en utilisant l'adresse de A. Le serveur répond avec une série de paquets d'acquittement (flags SYN et ACK armés). C'est là que réside toute la finesse de l'IP spoofing.

Mais d'abord, quelques rappels sur le protocole TCP. Pour l'établisement d'une connexion TCP, le client envoie un paquet avec un numéro de séquence initial (NS1). Le serveur va répondre avec un paquet d'acquittement ayant son propre numéro de séquence (NS2), mais ayant un numéro d'acquittement (NA1) égal au numéro de séquence initial incrémenté d'une unité (NA1=NS1+1). Ensuite le client renvoie un paquet avec un numéro d'acquittement (NA2=NS2+1). Une connexion TCP s'établit donc en trois parties.

Ce principe de numéros de séquences et d'acquittement est utilisé tout le long de la transaction pour en assurer la fiabilité. La subtilité de l'attaque réside dans le fait que le serveur génére la valeur NS2 suivant un cycle particulier. Il peut utiliser, par exemple, soit une fonction générant un nombre aléatoire, soit incrémenter une valeur initiale de 128 toutes les secondes et de 64 après chaque connexion. Tout dépend de l'implémentation de la pile TCP/IP du système.

Et c'est là que réside tout le problème. Le pirate envoie un grand nombre de demandes de connexion dans un laps de temps déterminé et analyse les acquittements du serveur pour déterminer l'algorithme d'incrémentation. Si cet algorithme est basé sur la génération de nombres aléatoires, l'attaque a peu de chances d'aboutir. Mais si l'algorithme est facilement compréhensible, le pirate va alors envoyer une requête de connexion au serveur en utilisant l'adresse IP du client. Le serveur va répondre avec un paquet d'acquittement de numero de sequence (NS). Le client mis hors service ne pourra répondre, le pirate le fera à sa place.

Pour cela, il doit injecter un paquet ayant un numéro d'acquittement de valeur NA = NS +1. Mais, ayant usurpé l'adresse du client, il ne peut intercepter les paquets lui étant destinés. Il ne peut donc pas connaître cette valeur NS. Il va donc la générer lui-même à partir de son analyse de l'algorithme d'incrémentation. C'est pourquoi cette attaque est aussi qualifiée «d'attaque aveugle». Si le numéro est valide, le pirate a établi la connexion au serveur en se faisant passer pour le client.

Le fait que l'attaque ne se restreigne qu'à une petite partie de systèmes vient du fait que la plupart des piles TCP/IP utilisent des numéros de séquences basés sur des nombres aléatoires. Certains systèmes comme BSD ou HP-UX connaissent de gros problèmes à cause de l'IP-Spoofing.

Illustration

IP spoofing 1
IP spoofing 2
IP spoofing 3
IP spoofing 4
IP spoofing 5
IP spoofing 6
IP spoofing 7

9.8.2. Prévenir l'IP spoofing grâce à Nmap

Nmap invoqué avec l'option -O et -v vous fournit une indication sur la difficulté qu'aura le pirate à procéder à une attaque par IP spoofing contre votre serveur.

Exemple :

[root@nowhere /root]# nmap -O -v 192.168.1.4

Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
Host (192.168.1.4) appears to be up ... good.
Initiating Connect() Scan against (192.168.1.4)
Adding open port 111/tcp
Adding open port 21/tcp
Adding open port 515/tcp
Adding open port 1024/tcp
Adding open port 22/tcp
Adding open port 139/tcp
The Connect() Scan took 1 second to scan 1554 ports.
For OSScan assuming that port 21 is open and port 1 is closed and neither are firewalled
Interesting ports on (192.168.1.4) :
(The 1548 ports scanned but not shown below are in state : closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
111/tcp open sunrpc
139/tcp open netbios-ssn
515/tcp open printer
1024/tcp open kdm

Remote operating system guess : Linux 2.1.19 - 2.2.19
Uptime 0.122 days (since Thu Mar 27 16 :02 :38 2003)
TCP Sequence Prediction : Class=random positive increments
Difficulty=4687481 (Good luck !)
IPID Sequence Generation : Incremental

Nmap run completed -- 1 IP address (1 host up) scanned in 3 seconds

Les lignes intéressantes :

TCP Sequence Prediction : Class=random positive increments
Difficulty=4687481 (Good luck !)

Celles-ci nous renseignent sur la difficulté d'une attaque par IP-Spoofing. Plus le nombre associé à la valeur Difficulty est élevé, plus il est difficile d'entreprendre une attaque. Le message Good Luck ! entre parenthèses est plutôt ironique vis-à-vis de la réussite de l'attaque.

Si, par malchance, lors d'un scan, vous obtenez un nombre très bas avec un message du type "Trivial Joke", cela signifie que votre système est très vulnérable à une attaque par IP-Spoofing.

9.8.3. Comment s'en protéger ?

Sur la plupart des systèmes, les numéros de séquence sont incrémentés de façon aléatoire, ce qui limite déjà une grande partie des attaques par IP spoofing.

Pour se protéger, il faut commençer par supprimer tous les services se basant sur l'authentification IP (rlogin, rsh).

Certains modules comme rp_filter sous Linux permettent une défense contre ces attaques.

L'utilisation de tunnels permet également de parer cette attaque.

9.8.4. Document

Déscription de l'IP-Spoofing : IP-spoofing Demystified.