****************************
*                 IP Spoofing               *
****************************
                                             By TruFF  (10/2000)



    L'ip Spoofing est une technique largement utilisée dans de nombreux types d'attaques. Du fait de la possibilité de forger des paquets bruts à l'aide de la programmation RAW SOCKET il est possible d'envoyer des paquets avec une fausse adresse IP de source. Cependant il ne faut pas penser que la tache soit aussi simple que ça, en effet IP ne fonctionne pas tout seul  et il est toujours (ou presque) utilisé avec un protocole de niveau superieur. L'Ip Spoof a fait ses preuves  aussi bien en ICMP, UDP ou TCP cependant la difficulte de sa mise en place varie beaucoup selon le protocle utilisé:

    -    Le protocole ICMP envoie des messages et n'attend aucune réponse en retour, il est donc très facile d'envoyer des messages icmp spoofés.

    -    Le protocole UDP sert quand a lui a la communication entre taches clientes et serveur, ce protocole fonctionne en mode non-connecté (il ne necessite pas la connection à 3 voies du TCP) il est donc assez facile d'envoyer des paquets avec une fausse IP sans que le serveur ne se rende compte  de rien. Cependant il nous sera impossible de recevoir une eventuelle réponse du serveur du fait qu'il renvoie tout vers la fausse IP.

    -    L'IP Spoofing en  utilisant TCP est la plus difficile à mettre en oeuvre surtout lorsqu'elle est utilisée en dehors d'un réseau local. Cependant avec un peu d'entrainement et  beaucoup de nuits sans sommeil il est possible d'utiliser ce procédé.

    Nous allons analyser les différentes possibilités que nous offre l'IP Spoofing suivant le protocole utilisé en s'appuyant sur les articles qui ont fait la renommée de cette technique ainsi qu'un sur un exemple de code personnel. Vous trouverez tous les codes a la fin de l'article.
 
 

1. ICMP Spoofing.

    L'ICMP Spoof est très certainement le plus  répendu car c'est le plus facile à mettre en oeuvre. Il est très utilisé dans les attaques de type DoS. En effet, les DoS consistent à déconnecter (ou molester)  donc il est  préférable de les lancer avec une fausse IP de source de manière à ne pas se faire repérer. Mais il y a d'autre utilisation plus intelligentes de l'ICMP Spoof.

    Un exemple d'une telle attaque est l'envoie  massif de packets ICMP type 3 (Destination Unreachable) vers un host donné. Si par  exemple on sait que ce host est connecté a un serveur et qu'on a l'IP du serveur et bien il suffit d'envoyer une multitude de packets ICMP type 3 avec une adresse  de source correspondant à l'IP du serveur auquel est connecte l'host en question. Celui-ci va penser que les paquets proviennent effectivement du serveur et qu'il ne peut pas l'atteindre et donc il va déconnecté spontanément. C'est le prinicipe du programme Click qui a fait des ravages sur l'Irc pendant un bon moment.

    Une  autre utilisation possible est très bien représentée par le très célèbre Smurf. Smurf peut s'utiliser en ICMP ou en UDP, je ne traite ici que la partie ICMP bien évidemment. En gros il suffit d'envoyer un packet ICMP type 8 (Echo request) vers un serveur Broadcast pour que celui-ci forward le packet à toutes les machines  de son sous-réseau. A la réception de ce paquet les machines vont répondre par un ICMP type 0 (Echo Reply) à la machine qui avait envoyé le request. De ce fait si l'on envoie un packet ICMP type 8 avec une fausse IP de source à un broadcast,  tous les Reply vont etre envoyer vers  cette fausse IP. Donc si l'on envoie beaucoups de paquets a beaucoups de broadcast et bien la box dont on a mis l'IP en adresse source risque fort d'etre deconnectee.

    Enfin le dernier type d'attaque et certainement le meilleur est l'utilisation du ICMP type 5 (Redirect). Ce message est généralement envoyé par un routeur a un host pour lui préciser qu'il devrait l'utiliser car la route est plus rapide. Il suffit donc en théorie d'envoyer un paquet ICMP type 5 à un host avec une IP de source correspond à notre IP et ainsi l'host va dévier sa  route pour passer par notre box en pensant que c'est un routeur. A ce moment la tout le  jeu consiste a émuler le fonctionnement d'un routeur c'est a dire router les paquets vers leur destination et bien sur au passage on sniffe. On peut donc soit receuillir des informations importantes, soit récupérer des numéros de séquences afin de lancer une attaque de type TCP Hijack procédé qui s'apparente au TCP spoofing et qui consiste en fait à prendre la place de l'host sur la connexion qu'il a avec un serveur. Si cette connexion est un telnet et bien on gagne un shell.

    D'autres utilisation de l'ICMP Spoofing sont à étudier notamment avec les ICMP type 9 (Router Advertisement) et ICMP type 10 (Router Solicitation). Il reste donc pas mal de recherche a  faire dans ce domaine. Pour ce faire, il existe de nombreux utilitaires permettant d'envoyer des paquets de tous types; l'un des plus utilisés est Nemesis que vous trouverez sur tous  les  sites de sécurité informatique.
 

2. UDP Spoofing.

    Si l'on envoie un paquet à un serveur qui fonctionne avec le protocole UDP, celui-ci traite le paquet directement. Il n'y a aucunement besoin de satisfaire le processus de connection offert par TCP. De ce fait il est tres simple d'envoyer des paquets UDP spoofés. Un service qui fonctionne sous UDP est le service Talk qui permet a un utilisateur de discuter avec un autre utilisateur. Si l'on Spoof son IP en prenant celle d'un autre utilisateur on pourra se faire passer pour celui-ci sur le service Talk. Et c'est ainsi qu'on peut obtenir des informations inportantes en utilisant le Social Enginnering.

    Cette technique est aussi utilisée dans des codes de DoS comme Boink ou l'on envoie des packet UDP spoofés.
 
 

3. TCP Spoofing.

    Sans doute la meilleure mais aussi la plus difficile a mettre en place, le TCP Spoofing permet de cacher son IP sur la plupart des services (Telnet, Ftp, Smtp,......) utilisés sur les réseaux TCP/IP notamment l'Internet.

    Le problème avec le TCP Spoofing provient du fait que ce protocole fonctionne en mode  connecté. De ce fait il faut étabir une connection en trois temps que vous connaissez déja je suppose (reportez vous au RFC 793 sinon). En effet lorsque l'on envoie notre Syn avec une fausse  IP, le serveur renvoie le Ack/Syn vers la fausse IP. Tout le problème consiste donc a connaitre la valeur de l'ISN (Initial Sequence number) envoyé par le serveur et ici deux cas se présentent:

    -    vous êtes sur un LAN (réseau local) et vous essayez de vous faire passer aux yeux du serveur pour une autre machine. Dans ce cas la manipulation  est assez simple. Vous envoyez  votre Syn avec la fausse IP (qui est celle d'une autre box sur le LAN) le serveur  envoie le Ack/Syn vers cette  fausse IP mais la vous avez lancé un sniffer qui va récupérer le Ack/Syn au passage et donc vous avez la valeur de l'ISN du serveur. Il ne vous reste plus qu'a renvoyer le Ack correspondant (toujours avec la fausse IP) et la connection est établie. Le programme FyreSpoof que j'ai développer automatise ce processus. Cependant encore une fois ce n'est pas aussi simple car la machine dont vous essayez de spoofer l'ip va aussi recevoir le Ack/Syn du serveur mais puisqu'elle n'a pas envoyé de Syn elle va automatiquement envoyé un Rst au serveur ce qui aura pour but de fermer la connexion. Pour que ce phénomène ne se produise pas il y 2 possibilités: soit l'on déconnecte la machine du réseau physiquement, soit on utilise une attaque de type DoS (Syn Flood par exemple) de manière à bouffer  toute la bande passante de la machine dont on veut prendre l'IP et ainsi l'empecher d'envoyer le Rst ou meme l'empecher de recevoir le Syn/Ack. Cette méthode est très utile quand on l'utilise sur des services de type rlogin par exemple.

    -    vous  êtes sur Internet et vous souhaitez  avoir une IP quelconque pour  vous connecter a un serveur qui utilise TCP. Et bien la les choses se compliquent pour récupérer le Ack/Syn  du serveur. Si vous avez accés au réseau local du serveur (routeur compromis) la technique est identique à celle utilisée sur un LAN, vous sniffez le Ack/Syn au niveau du  routeur. Si par contre vous n'avez  accès à rien et bien la seule solution est de prédire l'ISN que va envoyer le serveur de manière à acquitter le serveur. Les ISN sont gérés 'aléatoirement' mais comme rien  n'est vraiment aléatoire en  informatique il est possible  de prédire l'ISN qui va être envoyé à partir de valeurs d'ISN envoyés précédamment. Selon l'article 'Ip Spoofing Demystified' de Daemon9 parru dans Phrack 48, les ISN dépendraient a la fois du temps et du nombre de connexion acceptées. A chaque seconde l'ISN est incrémenté de 128000 et à chaque connexion acceptée il est incrémenté de 64000. Donc si l'on réalise une connexion avec sa propre IP on récupère l'ISN puis on établie juste dérriere une connexion on peut prédire l'SN. Si les 2 connexions sont assez proches dans le temps on peut supposer qu'aucune connexion n'a été établie, de plus nous avons sauvegarder le temps écoulé entre nos 2 connexions et nous avons calculer celui du Average Round Trip ( ce qui correspond au temps moyen que met un paquet pour arriver au serveur) on peut précisément prédire l'ISN. Cependant le Phrack 48 commence à se faire vieux et aucune machine n'utilise plus ce mode de génération  des ISN. La belle époque est donc terminée. De manière à étudier l'évolution des ISN en fonction du temps notamment, il faudra récupérer plusieurs ISN et essayer d'établir des corrélations avec le temps et le nombre de connections à l'aide de régressions ( linéaires, exponentielles....) et aussi vérifier l'algorithme de génération des ISN dans la pile TCP/IP de l'OS en question. Bref c'est loin d'être facile surtout sur des systèmes de type *nix qui nous renvoient souvent des Difficulty=999999 lorsque l'on scan avec Nmap. Ce nombre correspond à la difficulté de la prédiction de séquence. Mais, vous avez certainement remarqué que les OS Microsoft renvoyaient de valeur comprises en 1 et 50  pour la plupart du temps ( avec une petite remarque précisant que la génération des numéros de séquence dépend implicitement du temps). Il est donc assez facile de prédire l'ISN sur de tel systèmes. De plus bien que la prédiction soit difficile sous *nix et bien il y a  quelques jours un exploit à été publié et il présente la manière de procéder pour prédire un ISN sur un système FreeBSD à partir des 4 ISN précédent, donc rien n'est impossible.

    Le TCP Spoofing à été le plus largement utilisé avec le service Rlogin. Ce service  permet de se connecter à un serveur comme avec un telnet mais à la différence près que l'authentification se fait par l'IP et non par la combinaison login/pass. Si l'on spoofe l'IP de quelqu'un autorisé à se connecter au serveur en rlogin et bien on pourra se connecter sans aucun problème et obtenir un shell.
 
 

4. Protection.

    Apres avoir lu les dangers que peuvent apporter de telles attaques vous vous dites surement que vous etes succeptible d'en subir une un jour ou l'autre. Les plus courantes sont celles de type ICMP Spoof dans les DoS, pour remédier a cela le plus simple c'est de configurer son firewall pour qu'il refuse tous les paquets ICMP car leur importance n'est aucunement capitale pour le fonctionne de TCP/iP. Un exemple est l'utilisation d'IpChains: ipchains -A input -s 0.0.0.0/0.0.0.0 -p icmp -j DENY qui aura pour but de refuser tous les paquets ICMP. Vous pouvez utiliser l'option --icmp-type pour préciser  le type des ICMP a refuser si vous ne voulez pas tous les refuser.
    Pour l'UDP Spoofing la règle à respecter est d'utiliser le moins possible ces  services à moins qu'il ne représentent aucun danger potentiel. Le service Talk est à éviter bien évidamment.
    Enfin pour le TCP, les  services tels que rlogin sont a supprimer et même le telnet. On leur préférera l'utilisation de SSH qui est un genre de telnet crypté et qui est aussi dangereux car  des
 
 

5. Code et références.
    5.1. Code.

    FyreSpoof      By TruFF                 LAN Tcp Spoofer
    FyreSniff        By ]FS[                  Sniffer
    FyRaw           By ]FS[ & TruFF       Librairie C pour la programmation Raw_Socket
    SniffLib          By ]FS[ & TruFF       Librairie C pour la capture de paquets

   5.2. Documentation.

    Ip Spoofing Demystified      By Daemon9
    Dns Id Hacking                  By Adm crew
    Ip Hijacking                      By Patrice SALNOT
 

    5.3. RFC's.

    RFC 791 IP Protocol
    RFC 793 TCP Protocol
    RFC 768 UDP Protocol
    RFC 792 ICMP Protocol
    RFC 1034 DNS Protocol
    RFC 1948 Defending Against Sequence Number Attacks
    RFC 1750 Randomness Recommendations for Security
 
 

- EOF -