Qu’est-ce que l’idle port scan ?
Comme dit précédemment, cette technique vous permettra de scanner une autre machine en vous faisant passer pour quelqu’un d’autre.
Idle en anglais veut dire, à peu de choses près, inactif. Le principe est donc de scanner quelqu’un en faisant semblant d’être inactif.
Comment est-ce possible ?
Pour tous ceux qui ont déjà essayé de se faire passer pour quelqu’un d’autre sur un réseau, vous savez d’ores et déjà que ce n’est pas simple.
Le principal problème est que si j’envoie un paquet sur le réseau en me faisant passer pour mon voisin, les réponses vont être envoyées à mon voisin, je ne les verrai pas, et cela ne me servira donc à rien...
Découvrez la théorie du scan de port
Comment scanner un port, sans recevoir les réponses ?
Imaginons que nous voulions nous faire passer pour notre voisin vis-à-vis de Mme Michu, pour scanner un de ses ports.
Étant donné que nous allons envoyer le premier SYN en nous faisant passer pour notre voisin, Mme Michu va lui répondre, et nous ne saurons pas quelle est sa réponse.
Il serait nécessaire pour nous de savoir si elle a répondu, et surtout ce qu’elle a répondu !
Deux cas sont possibles :
soit son port est ouvert, et elle a répondu SYN+ACK ;
soit son port est fermé, et elle a répondu RST.
Quelle différence y a-t-il entre ces deux cas ?
Une différence énorme !
Dans le premier cas, mon voisin qui jusqu’à maintenant n’a rien demandé à personne va recevoir un segment SYN+ACK venant de Mme Michu. Étant donné qu’il n’a rien demandé, il va le faire savoir en renvoyant un RST, vu qu’il ne veut pas parler à Mme Michu.
Dans le second cas, il ne va rien répondre du tout. Il reçoit une demande de réinitialisation de connexion pour une connexion qu’il n’a jamais sollicitée. Il ne va donc pas répondre à une demande de fermeture de connexion qu’il n’a jamais demandé d’ouvrir ! Sinon, cela pourrait faire une loooooooongue partie de ping-pong.
Premier cas : il répond.
Deuxième cas : il ne répond pas.
Cette différence est-elle extraordinaire ?
OUI !
La question à se poser est donc :
Qu’est-ce qui change dans ma machine quand je réponds à un paquet ?
L’IPID
L’IPID est normalement incrémenté de 1 à chaque envoi.
Donc dès que j’envoie un paquet, l’IPID envoyé dans l’en-tête IP est incrémenté de 1 par rapport au paquet précédent.
Par exemple :
j’envoie un paquet : IPID = 2145 ;
j’envoie un autre paquet : IPID = 2146 ;
j’envoie encore un paquet : IPID = 2147 ;
j’envoie encore un autre paquet : IPID = 2148...
Vous avez saisi ?
Nous sommes bien avancés, mais dans notre problème initial, nous voulions savoir si notre voisin avait envoyé un paquet. Pour cela, il faudrait connaître la valeur de l’IPID avant et après notre envoi (celui où l’on se faisait passer pour Mme Michu).
Peut-on connaître l’IPID de notre voisin ?
La réponse est... peut-être.
Pour cela, il faudrait pouvoir l’obliger à nous envoyer un paquet pour pouvoir lire l’IPID dans l’en-tête IP de la réponse.
Comment obliger notre voisin à nous envoyer un paquet ?
Il suffit a priori de lui envoyer un segment SYN sur un port TCP ouvert. Dans ce cas, il nous répondra avec un segment SYN+ACK, et nous pourrons lire dans l’en-tête de couche 3 l’IPID !
Il suffit donc que le voisin ait une application en écoute sur sa machine en TCP, ce qui est pratiquement toujours le cas... tant qu’il n’a pas de firewall activé.
Comment savoir si notre voisin a des ports ouverts ?
Il suffit de faire un scan de ports.
Si nous trouvons au moins un port ouvert, c’est gagné !
Nous pouvons donc maintenant connaître l’IPID de notre voisin à un instant t. Nous avons tout ce qu’il faut, c’est à nous de jouer !
Le déroulement du scan complet
Je trouve un voisin ayant un port ouvert (ou toute autre machine sur Internet...).
Je lui envoie une demande de connexion avec un SYN.
Il me répond avec SYN+ACK et je lis dans l’en-tête de couche 3 son IPID qui vaut, par exemple, 100.
J’envoie un SYN à Mme Michu avec comme adresse IP source l’adresse de mon voisin (Mme Michu pense donc que cette demande de connexion vient de mon voisin).
Il y a maintenant deux cas possibles :
1- Le port scanné de Mme Michu est ouvert.
2- Le port scanné de Mme Michu est fermé.
Cas numéro 1 :
Mme Michu répond à mon voisin avec un SYN+ACK. Mon voisin s’empresse de répondre avec un RST, son IPID a donc augmenté de 1 et vaut 101.
Je renvoie alors un SYN à mon voisin sur son port ouvert. Il me répond avec SYN+ACK et je lis son IPID qui vaut maintenant... 102 ! (Puisqu’il vient d’envoyer un nouveau paquet pour me répondre !)
Cas numéro 2 :
Mme Michu répond à mon voisin avec un RST. Mon voisin ne répond pas, son IPID reste donc à 100.
Je renvoie alors un SYN à mon voisin sur son port ouvert. Il me répond avec SYN+ACK et je lis son IPID qui vaut maintenant 101 ! (Puisqu’il vient d’envoyer un nouveau paquet pour me répondre.)
La différence entre les deux ?
Dans le premier cas, où le port de Mme Michu était ouvert, je reçois un IPID de 102.
Dans le second cas, où le port de Mme Michu était fermé, je reçois un IPID de 101.
Mais... pour que cette attaque fonctionne, il faut se trouver dans certaines conditions favorables.
Il faut trouver un voisin avec un port ouvert.
Il faut en plus que les IPID de ce voisin augmentent exactement de 1 à chaque envoi (Ce n’est pas toujours le cas. Notamment, la plupart des systèmes modernes ont des IPID aléatoires et non incrémentaux comme au bon vieux temps. Cependant, c’est plus rarement le cas sur des systèmes simples comme ceux des imprimantes ou autres périphériques réseau...).
Il faut qu’il y ait peu de trafic vers ce voisin, sinon l’IPID peut augmenter à cause d’autres requêtes, et les résultats seront faussés.
Si ces conditions sont réunies (ce qui n’est pas bien compliqué à trouver), alors banco !
Limitations
Je peux donc scanner la maison blanche et faire porter le chapeau à mon voisin ?
Malheureusement, non, ce serait trop beau.
Déjà, même si Mme Michu ne voit rien venir de vous, votre voisin, lui, a toutes les informations pour remonter jusqu’à vous.
Si jamais la machine de votre voisin n’enregistre rien, les routeurs de son fournisseur d’accès eux le feront et permettront très facilement de remonter à vous.
Donc comme pour les scans de ports simples, l’idle scan nécessite d’être effectué dans un environnement que vous maîtrisez et que vous connaissiez les conséquences associées.
La mise en pratique
La mise en pratique est on ne peut plus simple étant donné que l’outil Nmap intègre déjà cette fonctionnalité.
Donc allons-y !
Étape 1 : trouver un voisin
Pour cela, nous allons scanner une plage d’adresses pour voir les machines présentes dessus, en les pingant.
# nmap -sP 10.8.98.0/24 Starting Nmap 4.62 ( http://nmap.org ) at 2010-02-11 15:36 CET Host 10.8.98.98 appears to be up. MAC Address: 00:08:02:4F:08:7E (Compaq Computer) Host 10.8.98.99 appears to be up. MAC Address: 00:08:02:4F:09:2F (Compaq Computer) Host 10.8.98.100 appears to be up. MAC Address: 00:08:02:3F:EE:E3 (Compaq Computer) Host 10.8.98.156 appears to be up. MAC Address: 00:08:02:3F:E0:B5 (Compaq Computer) Host 10.8.98.172 appears to be up. MAC Address: 00:08:02:42:B1:75 (Compaq Computer) Host 10.8.98.235 appears to be up. Host 10.8.98.238 appears to be up. MAC Address: 00:08:02:37:AE:EE (Compaq Computer) Host 10.8.98.240 appears to be up. MAC Address: 00:15:00:37:9F:A5 (Intel Corporate) Host 10.8.98.241 appears to be up. MAC Address: 0C:EE:E6:B5:8A:21 (Unknown) Nmap done: 256 IP addresses (9 hosts up) scanned in 2.715 seconds
Il y a le choix !
Nous allons maintenant essayer de voir si l’une de ces machines a un port ouvert pour nous permettre de jouer le rôle du voisin. Nous allons les scanner une par une, tout en essayant de connaître le système d’exploitation qui est installé.
# nmap -sS -O 10.8.98.98 Starting Nmap 4.62 ( http://nmap.org ) at 2010-02-11 15:40 CET Interesting ports on 10.8.98.98: Not shown: 1706 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 110/tcp open pop3 111/tcp open rpcbind 143/tcp open imap 901/tcp open samba-swat 993/tcp open imaps 2049/tcp open nfs MAC Address: 00:08:02:4F:08:7E (Compaq Computer) Device type: general purpose Running: Linux 2.6.X OS details: Linux 2.6.13 - 2.6.24 Uptime: 34.971 days (since Thu Jan 7 16:21:17 2010) Network Distance: 1 hop OS detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 1.992 seconds
Nous avons ici une multitude de ports ouverts, mais malheureusement, la machine semble tourner avec un noyau Linux 2.6 ne permettant pas l’attaque, car les IPID de ce noyau sont aléatoires.
Recherchons plutôt un Windows.
# nmap -O 10.8.98.0/24 Starting Nmap 4.62 ( http://nmap.org ) at 2010-02-11 15:43 CET Interesting ports on 10.8.98.98: [Bla bla] Running: Linux 2.6.X [Bla bla] Running: Linux 2.6.X [Bla bla] Running: Linux 2.6.X [Bla bla] Running: Linux 2.6.X Interesting ports on 10.8.98.240: Not shown: 1709 closed ports PORT STATE SERVICE 80/tcp open http 135/tcp open msrpc 139/tcp open netbios-ssn 443/tcp open https 445/tcp open microsoft-ds 1026/tcp open LSA-or-nterm MAC Address: 00:15:00:37:9F:A5 (Intel Corporate) Device type: general purpose Running: Microsoft Windows XP|2003 OS details: Microsoft Windows XP SP2, Microsoft Windows XP SP2 or Windows Server 2003 SP0/SP1 Network Distance: 1 hop Nmap done: 256 IP addresses (9 hosts up) scanned in 21.354 seconds
Bingo ! Une des machines semble être sous Windows XP SP2.
Elle a les ports Windows standard ouverts et n’a donc pas de firewall activé.
Nous avons trouvé notre voisin idéal ! Le gagnant est 10.8.98.240 !
Etape 2 : réaliser l’idle scan
Il ne nous reste plus qu’à réaliser l’attaque, pour par exemple scanner l’adresse 10.8.98.98 dont nous avons déjà scanné les ports précédemment. Nous allons utiliser le port 445 trouvé ouvert sur notre voisin idéal.
# nmap -P0 -sI 10.8.98.240:445 10.8.98.98 Starting Nmap 4.62 ( http://nmap.org ) at 2010-02-11 15:52 CET Idle scan using zombie 10.8.98.240 (10.8.98.240:445); Class: Incremental Interesting ports on 10.8.98.98: Not shown: 1706 closed|filtered ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 110/tcp open pop3 111/tcp open rpcbind 143/tcp open imap 901/tcp open samba-swat 993/tcp open imaps 2049/tcp open nfs MAC Address: 00:08:02:4F:08:7E (Compaq Computer) Nmap done: 1 IP address (1 host up) scanned in 17.545 seconds
Cela a marché !
Revenons un peu sur la commande.
nmap -P0 -sI 10.8.98.240:445 10.8.98.98
Le -P0 est obligatoire, sinon notre machine envoie un ping à Mme Michu qui sait maintenant qui la scanne. Le -P0 oblige Nmap à ne pas faire de ping avant de scanner une machine.
Nous précisons ensuite l’option -sI (grand i et non pas L) indiquant que nous voulons faire un idle scan.
Puis qui sera notre voisin et quel port utiliser : 10.8.98.240:445.
Et enfin la victime, Mme Michu : 10.8.98.98.
Le résultat est conforme à ce que nous avons vu auparavant.
Un autre point est important dans le résultat :
Idle scan using zombie 10.8.98.240 (10.8.98.240:445); Class: Incremental
Le Class: Incremental ici est très important, et nous confirme que notre voisin incrémente bien les IPID de 1 et non aléatoirement.
Que se serait-il passé si nous avions essayé avec une machine Linux comme voisin ?
Malheureusement, il n’est pas possible d’utiliser un tel OS, car il utilise des IPID aléatoires...
# nmap -P0 -sI 10.8.98.99:80 10.8.98.98 Starting Nmap 4.62 ( http://nmap.org ) at 2010-02-11 16:01 CET Idle scan zombie 10.8.98.99 (10.8.98.99) port 80 cannot be used because IP ID sequencability class is: All zeros. Try another proxy. QUITTING!
Le résultat est sans appel. Impossible de réaliser l’idle scan, les IPID du voisin ne sont pas bons...
Nous avons donc vu comment réaliser un idle scan.
L’intérêt d’un tel scan est de ne pas être vu directement par la machine scannée.
Cela peut être intéressant pour être furtif, mais aussi pour voir si un filtrage différent est appliqué en fonction des adresses IP sources. Par exemple pour voir si le filtrage est le même pour ma machine que pour celle d’un administrateur réseau...
Pour tous les fans de scans, je vous invite à poursuivre ce tuto par la lecture de l’excellent site Nmap qui vous en dira plus sur les différentes méthodes de scan disponibles.
Conclusion
Nous venons de réaliser une attaque réseau relativement avancée, mais ce qu’il faut retenir est que nous n’aurions pas pu comprendre cette attaque sans avoir une vision précise et détaillée du fonctionnement du protocole IP.
Certaines fonctionnalités des protocoles ne vous seront que très rarement utiles. Par contre, elles vous permettront de mieux comprendre le réseau dans sa globalité. Par ailleurs, si vous avez l’intention un jour de faire de la sécurité, il vous faudra connaître en détail les systèmes que vous allez étudier. Que ce soit en réseau, en systèmes, en programmation, ou dans tout domaine connexe à l’informatique.
Maintenant que nous connaissons en détail le fonctionnement du protocole IP, nous allons pouvoir étudier à son tour le protocole TCP.