![]() |
guill.net
-
La page des réseaux
|
![]() |
|
![]() ![]() ![]() |
I - Généralités
Présentation
L'IP spoofing est un mécanisme qui consiste à se faire passer pour une personne ayant une adresse IP attribuée, on falsifie donc l'adresse IP. Ceci n'est que la partie émergée d'un iceberg, car les mécanismes mis en œuvre sont en fait assez complexes.
Quels sont les acteurs lors d'un mécanisme d'IP spoofing?
A: un ordinateur
cible ou victime
B: un serveur
ou une machine qui a confiance en A
X: une machine
ayant une adresse forgée (ou spoofée)
Z: une machine
attaque
Représentation
du séquencement des trames dans ce document
|
|
|
|
|
|
|
|
L'unité
de temps représente le séquencement des trames telles qu'elles
doivent avoir lieu
@A symbolise
la machine A
L'action représente
l'information échangée
II - Pré-requis
Pour comprendre le fonctionnement de l'IP spoofing, mieux vaut avoir quelques notions sur les systèmes d'exploitation et le fonctionnement des réseaux. Les quelques points suivant permettent de clarifier de façon succincte les mécanismes utiles à la compréhension du spoofing.
Relations
de confiance:
Dans le monde
informatique, il est fréquent que certaines personnes aient des
droits sur des ressources alors que d'autres personnes n'y ont pas accès.
Rlogin:
Ce protocole
client serveur basé sur TCP permet de se connecter d'une machine
A sur une machine B à distance et cela en tenant compte de la relation
de confiance, c'est à dire que si le client est identifié
(par son adresse IP) dans ce cas, on ne lui demande pas de mot de passe,
la connexion est directement établie.
IP:
Comme IP travaille
en mode datagramme, il n'y a pas de maintien de connexion fait à
ce niveau. La couche IP est chargée de router les datagramme sans
se soucier ni de la destination, ni de la source du datagramme. On voit
bien ici que la falsification d'un datagramme IP ne l'empêche pas
de circuler sur le réseau.
TCP:
TCP est fiable
et orienté connexion. Plusieurs mécanismes de fiabilité
sont présents mais seulement deux ont de l'importance pour ce présent
document : le séquencement des paquets et leur acquittement. Ces
mécanismes rendent l'en-tête TCP nettement plus difficile
à falsifier que le datagramme IP.
Séquencement
et acquittement:
En affectant
un numéro de séquence à chaque paquet TCP et en demandant
un acquittement à la réception, il est possible de ré-émettre
les paquets perdus. Les numéros de séquence servent au récepteur
pour ordonner les paquets reçus. Ainsi, même en passant par
des routes différentes les paquets TCP sont automatiquement réordonnés.
Les numéros de séquence sont codés sur un champ de
32 bits. Chaque champ comprend le numéro de séquence des
quatres premiers octets de donnée. Le numéro d'acquittemnt
d'une entité attend toujours le numéro de séquence
de l'autre entité.
Etablissement
de connexion TCP:
Un mécanisme
basé sur TCP comme une connexion d'un client Rlogin de la machine
A sur un démon Rlogin sur la machine B a lieu comme-suit:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
En (1) le client demande une connexion au serveur en positionnant son numéro de séquence dans l'en-tête TCP. Pour cela, il utilise le ISN (initial sequence number). A la réception de ce paquet (2), le serveur répond avec son bit SYN et ACK, il place également son ISN dans l'entête et un numéro d'acquittement (qui correpond à ISN+1 du client). Le client accepte l'ISN serveur (3). Dès lors, les transferts peuvent commencer.
Incrémentation
de numéro de séquence et ISN :
Au démarrage
de la machine, l'ISN est initialisé à 1. A chaque seconde
écoulée, l'ISN s'incrémente de 128 000 et à
chaque connexion établie il s'incrémente également
de 64 000. Ce mécanisme d'incrémentation automatique est
utilisé pour éviter qu'une ancienne connexion TCP établie
vienne perturber (par un nombre de données important) une connexion
TCP avec des numéros de séquence trop proches.
Ports :
Pour autoriser
plusieurs connexions simultanées, TCP utilise des ports. Ces ports
sont utilisés par la pile IP pour identifier les communications
réseau. Combinés avec une adresse IP, les ports TCP permettent
ainsi d'identifier clairement l'utilisation du paquet et sa destination.
Pour identifier les serveurs, on leur attribue des numéros de port
spécifiques suivant le service fourni, comme par exemple le port
513 pour le rlogin.
III - L'attaque
En bref
L'IP spoofing nécessite plusieurs étapes. Premièrement, l'attaquant doit choisir sa victime (un serveur). Ensuite, il doit trouver une configuration pour laquelle la victime autorise une connexion avec une machine de confiance. L'intérêt réside alors dans le but de se faire passer pour cette machine autorisée. Pour cela, la machine autorisée est rendue invalide (pour ne pas pouvoir réagir), les numéros de séquence du serveur sont analysés. Une connexion simulée avec des paquets falsifiés de l'attaquant est alors demandée au serveur avec des numéros de séquence devinés. Si la connexion est établie, l'attaquant modifie alors des informations pour permettre de revenir plus facilement ultérieurement.
En détails
En général, une attaque par IP spoofing est menée d'un compte root vers un autre compte root.
Attaque à
l'aveugle :
Un point qu'il
ne faut pas oublier dans l'IP spoofing est que les attaques se font en
aveugle. En effet, comme l'attaquant subtilise l'identité d'une
machine de confiance pour contourner la sécurité d'un serveur,
les datagrammes renvoyés par le serveur sont à destination
de la machine de confiance (qui a été invalidée) car
les datagrammes IP fonctionnent sans connexion, donc l'attaquant ne les
voit jamais. Comme la machine de confiance a été au préalable
rendue inopérationnelle, elle n'est pas capable de répondre
aux datagrammes reçus et c'est donc à l'attaquant d'être
suffisamment documenté sur l'état de la communication des
machines pour pouvoir prédire ce que le serveur attend en retour.
1 - Configuration
de confiance :
Une fois que
la cible a été choisie, encore faut-il que celle-ci accepte
tout utilisateur comme ayant certains droits, sinon, l'attaque prend fin
ici. Cela peut ne pas être facile mais des commandes telles que 'showmount
-e' ou 'rpcinfo' peuvent aider dans cette tâche, le but étant
ici de récupérer le maximum d'informations.
2 - Invalidation
de la machine de confiance :
Pour éviter
que la machine de confiance ne puisse répondre au serveur lorsque
celui-ci répond aux datagrammes falsifiés, il est important
d'invalider la machine de confiance. Ceci est généralement
effectué par le biais d'un mécanisme appelé TCP SYN
flooding (connexions en masse). Quand une connexion est demandée
avec le bit SYN activé, le récepteur renvoie un SYN/ACK et
attend le ACK de la part de l'émetteur. Tant que l'émetteur
n'a pas renvoyé son ACK, la connexion n'est pas établie.
Il y a cependant une limite du nombre de requêtes SYN qui peuvent
être effectuées sur une même socket, cette limite s'appelle
le backlog et représente la longueur de la file d'attente des transmissions
incomplètes. Si cette limite est atteinte, les futures connexions
TCP sont tout simplement ignorées jusqu'à ce que des connexions
en attente soient établies. L'implémentation du backlog dépend
du système d'exploitation mais est couramment de 5. L'attaquant
envoie ainsi plusieurs requêtes SYN sur le port TCP qu'elle veut
invalider. L'attaquant doit s'assurer que les paquets envoyés sont
encore une fois falsifiés comme provenant d'une machine inatteignable
(unreachable host) car sinon celle-ci renverrait un ReSeT (bit RST positionnée)
à
chaque SYN/ACK ce qui rendrait vains tous les efforts. L'attaque a lieu
comme suit :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
En (1), l'attaquant
envoie toute une multitude de requêtes SYN pour remplir le backlog.
En (M), la
cible renvoie des paquets TCP SYN/ACK à ce qu'elle croit être
l'émetteur. Cette phase dure un petit moment et pendant ce temps,
aucune connexion sur le port TCP utilisé n'est prise en compte.
En (N), lorsqu'un
certain temps s'est écoulé la machine cible décide
d'annuler la connexion.
3 - Echantillonnage
des numéros de séquence et prédiction :
L'attaquant
doit avoir une idée du nombre contenu dans le numéro de séquence
de la cible (le serveur), pour cela il va se connecter sur un port TCP
de la machine cible (par exemple SMTP) et analyser les trames qui transitent.
Ce processus est recommencé plusieurs fois et à chaque fois
on conserve le numéro de séquence de la cible de façon
à établir des statistiques sur l'incrémentation (dépendant
du temps de transfert). L'attaquant possède alors toute les clés
: le dernier numéro de séquence émis, les données
de changement ISN (128 000/seconde et 64 000/connexion) et le temps nécessaire.
Aussitôt après avoir pris connaissance de ces paramètres,
l'attaque est lancée. Plusieurs cas peuvent alors se produire :
-le numéro
d'acknowledge correspond parfaitement, et dans ce cas les données
sont placées en attente dans le buffer TCP
-si le numéro
d'acquittement est inférieur au numéro attendu, alors le
paquet est supprimé (considéré comme une ré-émission)
-si le numéro
est supérieur à ce qui est attendu mais reste dans la limite
acceptable par la fenêtre de transmission, dans ce cas il est maintenu
en attente des paquets intermédiaires sinon il est purement supprimé.
Voici le mécanisme de l'attaque :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
En (1), l'attaquant
simule l'adresse IP de la personne de confiance (qui subit une attaque
de déni de service) et envoie sa connexion sur le port 513 (Rlogin
est le plus utilisé) de la victime.
En (2), la
cible répond à la machine falsifiée qu'elle autorise
la communication. Comme la machine falsifiée est " un peu perdue
", elle supprime le paquet au lieu de renvoyer un RST comme elle aurait
du le faire.
En (3), l'attaquant
renvoi un paquet avec le numéro de séquence de la cible prédit
+ 1 puisqu'on l'acquitte.
Si la prédiction
est bonne, la cible accepte le ACK, et la sécurité est alors
compromise puisque les transfert peuvent commencer (4).
Une méthode permet de ne pas attaquer en aveugle, c'est l'utilisation du source routing. En effet, avec l'utilisation des champs options du datagramme IP, il est possible de spécifier une route pour un paquet de donnée. Ainsi, il suffit que l'attaquant rajoute ce champ option avec un chemin de retour passant par lui de façon à ce qu'il puisse voir le contenu de tous les messages à destination de la machine usurpée. Dans ce cas, l'utilisation devient nettement plus simple, puisque l'attaquant n'a plus besoin de faire de prédiction de numéro de séquence et il peut contrôler la validité de tous les messages envoyés et reçus.
Généralement, l'attaquant laisse une porte ouverte (backdoor) derrière lui de façon à pouvoir revenir plus tard de façon beaucoup plus simple. Une modifiaction du fichier rhost est souvent effectuée pour permettre un accès ultérieur.
IV- Mesures préventives
Ne pas faire confiance
Une solution permettant d'empêcher ce type d'attaque est de ne pas se baser sur une authentification par adresse IP. Désactiver toutes les commandes r* (permettant à une machine distante d'effectuer des actions) comme rsh (ouverture de shell), rlogin (ouverture de terminal), supprimer tous les fichiers .rhosts (liste des utilisateurs ayant des droits) et vider le fichier /etc/host.equiv. Cela obligera les utilisateurs à ce conecter par d'autres moyens (telnet, SSH…)
Filtrer les paquets
Dans le cas d'une connexion directe sur Internet, la méthode la plus utilisé consiste à filtrer les paquets entrants au niveau du routeur d'accès de façon à ce qu'une connexion extérieure au réseau ne puisse pas avoir une adresse IP qui soit interne au réseau. Comme les relations de confiance sont souvent attribuées au sein même du réseau, cela prémunit relativement bien contre les attaques.
Désactiver le source routing
Comme l'utilisation du source routing permet de faciliter considérablement l'utilisation de l'IP Spoofing, il est préférable de désactiver le source routing sur tous les routeurs d'accès de l'entreprise de façon à ce qu'une route destinée à un ordinateur interne au réseau ne passe pas par le réseau externe.
Utiliser le chiffrement
Une méthode évidente pour se protéger contre l'IP spoofing consiste à chiffrer ou authentifier toutes les données qui circulent sur le réseau interne. Cependant cette méthode n'est pas encore un standard….
Utiliser un numéro de séquence initial aléatoire
Les attaques par IP spoofing fonctionnent parce que les numéros de séquence peuvent être devinés. Pour résoudre ce problème, il faudrait une modification de l'implémentation de la pile IP qui tienne compte de l'adresse comme le montre la formule suivante : ISN=M+F(localhost,localport,remotehost,remoteport). M est ici le compteur de la machine et F est un algorithme de Hash qui ne doit pas être visible de l'extérieur.