Le IP-Spoofing est une attaque engendrée par un individu qui essaye de truquer une machine destinataire pour qu'elle croit que cette machine est actuellement une autre machine. On 'spoof' quand on forge de l'information (comme notre IP) dans un packet TCP/IP et on l'envoie vers une machine destinataire. Lorsque la machine destinataire reçoit le packet et essaye d'identifier la source, elle lit le IP inclus dans le packet TCP/IP et est truquée à croire que le packet vient d'une autre source. Le IP-Spoofing est habituellement utilisé pour exploiter une relation de confiance et compromettre le système cible en devenant root.
 

Relations de Confiance

En Unix, il est très facile d'obtenir la confiance d'une machine. Supposons deux machines A et B sur lesquels on a des comptes. Pour faciliter l'alternance d'une machine vers l'autre, on va créer une relation de confiance de type duplex intégral. Sur la machine A, on va créer un fichier '.rhosts' dans notre répertoire maison qui contient 'IP.de.machine.B login' et sur la machine B, on va créer un fichier '.rhosts' dans notre répertoire maison qui contient 'IP.de.machine.A login'. Une fois cette relation créée, on a juste à utiliser l'une des diverses commandes r* (rlogin, rsh, ...) pour alterner d'une machine vers l'autre, sans être obligé‚ d'entrer notre mot de passe.
 

Une attaque simple

Il est maintenant trivial d'imaginer une attaque. On sélectionne une cible qu'on sait qui utilise une relation de confiance. On décide quelle sorte de login à distance qu'on va simuler (rlogin est un bon choix). On forge un packet de connexion et on l'envoie vers le site cible (il est à noter qu'on doit connaitre la façon que rlogin initie une connexion vers une machine), en lui faisant croire qu'on est l'utilisateur X qui connecte du site A.B.C.D. Quand la cible reçoit le packet, elle est truquée par nos informations fausses et nous permet de connecter. Il est à noter que nous ne verrons pas les réponses de la cible, car elle va envoyer ses réponses à l'adresse forgé. On devra anticiper ce que la cible va répondre.
 

Un niveau plus élevé de spoofing

Il existe deux genres de spoofing avancé: le spoofing non-aveugle (lorsque l'attaquant se retrouve sur le même 'subnet' que la cible) et le spoofing aveugle (lorsque l'attaquant ne se retrouve pas sur le même 'subnet' que la cible). Le spoofing non-aveugle est le plus simple des deux genres, car on peut intercepter facilement des packets qui voyages entre la machine source et la machine destinataire.
 

Spoofing non-aveugle

Puisqu'on est sur le même subnet que la machine qu'on veut attaquer, on peut intercepter des packets qui sont destinées à notre cible. En utilisant un 'sniffer' (expliqué plus loin), ceci est très facile. Une fois un packet intercepté, on peut voir où les numéros de séquence de la connexion sont rendus. Après avoir intercepté quelques packets, on peut déduire à quelle intervalle que le numéro de séquence augmente.
 

'Hijack' de la connexion

Une fois les numéros de séquence connus, on peut voler ('hijack') la connexion de A et accéder B. Pour commencer, on va rendre inaccessible la machine A pour qu'elle ne puisse pas communiquer avec B durant notre attaque. On peut rendre A inaccessible en utilisant un blocage de service tel un Saturage-SYN ('SYN Flooding'). Une fois la machine rendue inaccessible, on va envoyer le bon numéro de séquence vers B et prendre contrôle de la connexion. Cette attaque se fait quand même sans le blocage de A (une fois on envoye le bon numéro de séquence vers B, A n'aura plus le bon numéro de séquence et ne pourra donc plus communiquer avec B). Si par malchance A serait encore vivante, on aurait quand même la connexion, car A n'aurait plus le bon numéro de séquence, se qui ferait B rejeter tout ses packets. Puisqu'on ne peut pas voir les réponses de B, on cherchera a mettre en place une porte ('backdoor') pour qu'on puisse entrer par rlogin sur B. Une façon simple serait d'envoyer un 'echo "+ +" >> ~/.rhosts' et ensuite faire un rlogin sur B à travers le compte à A. Puisque son fichier '.rhosts' contient la ligne '+ +', il acceptera toute connexion rlogin sans nécessiter un mot de passe.

Maintenant, imaginer qu'on volerait la connexion à root. On pourrait faire des gros dégâts sur le système. :)

 

Spoofing aveugle

La grosse difficulté avec le spoofing aveugle est qu'on ne peut pas intercepter les packets qui voyagent entre A et B, car nous ne sommes plus sur le même subnet qu'une des machines. Sans les packets interceptés, on ne peut pas déduire les numéros de séquence, ce qui veut dire qu'on devra essayer un numéro de séquence aléatoire.
 

'Hijack' de la connexion

Le vol d'une connexion est plus difficile dans le spoofing aveugle. Puisque le numéro de séquence sera inconnu, on devra en choisir au quasi-hazard. Avant débuter notre attaque, on va connecter à une porte de la machine B (la porte 513 --SMTP-- est bonne) pour obtenir une idée des numéros de séquences initial du système. On devra ensuite calculer le temps de transmission aller-retour (TTA). On aura besoin du TTA pour calculer le bon numéro de séquence (on saura que le numéro de séquence est augmenté de 64 000 par seconde, de 128 000 par seconde, etc.). Aussitôt qu'on a obtenu notre numéro de séquence, on devra rendre A inaccessible (en utilisant un blocage de service) et envoyer immédiatement notre numéro de séquence, car une nouvelle connexion à B va fausser notre calcul.

 

Il y a plusieurs scénarios qui peuvent se présenter après l'envoi de notre packet:

- si notre numéro de séquence est exacte, on à voler la connexion

- si notre numéro de séquence est inférieur au vrai numéro de séquence, B va tout simplement laisser tomber le packet en croyant qu'il s'agit d'une retransmission

- si notre numéro de séquence est supérieur au vrai numéro de séquence et encore dans la fenêtre, B va garder le packet en supposant qu'il s'agit d'un packet futur et va attendre la réception des packets manquant

- si notre numéro de séquence est supérieur au vrai numéro de séquence mais pas dans la fenêtre, B va laisser tomber notre packet et transmettre un packet avec le numéro de séquence qu'il attend

 

Si on réussi à obtenir le bon numéro de séquence et voler la connexion de A, on va procéder comme dans le spoofing non-aveugle pour installer une porte pour entrer dans B.

 

Méthodes préventives

Malgré que ces attaques sont dangereuses, il n'est toutefois pas impossible de prévenir une attaque de vol de connexion sur un réseau. Vous trouverez quelques méthodes décrites plus bas.
 

Désactiver les relations de confiance

La façon la plus simple d’éliminer la menace de vol de connexion est d’éliminer toutes connexions r* (rlogin, rsh, …). De cette façon, même si un individu vole la connexion telnet à quelqu’un, il lui est impossible de connecter avec rlogin sans entrer le mot de passe, et donc n’aura pas de ‘backdoor’ dans le système.
 

Filtrage de packets

Le filtrage de packets au niveau du routeur peu aussi grandement réduire les risques de sécurité. Premièrement, on s’assure qu’il n’y a aucune relation de confiance possible vers une machine qui est à l’extérieur du réseau (ceci se configure dans le fichier ‘/etc/hosts.equiv’). Ensuite, on configure le routeur à ne pas accepter aucun packet venant de l’extérieur qui prétend venir de l’intérieur (même si le IP de la source est forgé dans le packet, il dois néanmoins passer par le routeur extérieur du réseau).
 

Cryptographie

Une autre alternative serait d’obliger les packets d’être codés avant d’être envoyer sur le réseau. Il existe quelques solutions de ce genre, mais il serait encore longtemp avant qu’une de ces solutions devienne un standard.
 

Numéros de séquence initial aléatoire

Puisque les numéros de séquence en TCP/IP ne sont pas générés aléatoirement, on peut le calculer avec une certaine précision si on sait ce qu’on fait. En rendant tout les numéros de séquence initial de connexions aléatoires, il serait presque impossible de déduire le numéro de séquence courant d’une connexion.
 
Une fois une machine est compromise (root est obtenu), un 'hacker' procédera habituellement à l'installation d'un 'sniffer'. Un sniffer est un proramme qui est executé en arrière-plan sous root. Celui-ci 'sniff' toute les connexions entrant et sortant de la machine compromise, ainsi que les connexions faites sur le même sous-réseau (subnet). Ces informations sont stockées dans un fichier pour lecture futur. Puisque les informations de connexions faites à distance (telnet, ftp, rlogin...) sont transmises en texte sans être codés (transmise en 'clear text'), le 'hacker' pourra intercepter les mots de passes d'utilisateurs sur le système compromis, ainsi que sur des systèmes qui furent accédés de la machine compromise.