Technique de l' IP id scanning
 Par patrice salnot - uid@42sec.net


Cette méthode permet d'identifier les services ouverts sur une cible sans laisser de traces ou tout au moins sans laisser apparaître son adresse IP.

Pour appréhender cette méthodologie il est nécessaire de comprendre comment réagis une cible lorsqu'on audit ses services.
Il est également nécessaire de comprendre à quoi correspond un numéro d'ID dans une trame IP et comment il évolue dans certaines implémentations.
Nous allons donc segmenter l'analyse de cette méthode en trois parties :

* Comportement de la pile IP standard face à une requête.
* Évolution du champ ID.
* Description de la méthode.


Analyse du comportement de la pile IP face à une requête 



A --------SYN--------DPRT 23----SPRT 2048-------> B Phase 1

A <-------RST------SPRT 2048---DPRT 23---------- B Phase 2


Schéma D.



A -----SYN-------DPRT 23-SPRT 2048-------------> B Phase 1

A <-------SYN/ACK---DPRT 23-SPRT 2048----------- B Phase 2


Schéma E.


Prenons en considération le contexte du schéma D.
La machine A fait une requête sur le port vingt trois de la machine B.
Si le port est fermé la machine B va renvoyer un paquet à destination de la machine A avec un flag RST.
Par contre si le port vingt trois est ouvert la machine B renverra un paquet contenant le FLAG SYN/ACK à destination de la machine A (cf. schéma E.) .


Évolution du champ ID

0 1 2 3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver= 4 |IHL= 5 |Type of Service| Total Length = 276 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification = 111 |Flg=1| Fragment Offset = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time = 119 | Protocol = 6 | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| source address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| destination address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
\ \
\ \
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Schema F
Présentation d'une en-tête IP.

Le champ identification de la trame IP permet de caractériser de manière unique chaque paquet émis.
La RFC 791 spécifie que le numéro doit être déterminé par la couche supérieure (à savoir TCP UDP ou ICMP).
Dans les implémentations dérivées de Berkeley (notamment 4.2BSD) ce champ est incrémenté d'une unité à chaque trame émise.


Description de la méthode



A --------SYN--------DPRT 23----SPRT 2048-------> B Phase 1

A <-------SYN/ACK--SPRT 2048---DPRT 23---------- B Phase 2

A --------ACK--------DPRT 23----SPRT 2048-------> B Phase 3

Schéma G.


En nous plaçant dans le contexte définis au schéma D, nous voyons que l'envoi d'une trame TCP contenant un flag SYN à destination du port vingt trois de la machine B va provoquer l'envoi d'une trame contenant un FLAG RST de la machine B vers la machine A.
La machine A en recevant cette trame contenant un FLAG RST ne va générer aucun paquet.
Par contre si le port vingt trois est ouvert sur la machine B, celle ci va y faire face en générant une trame contenant un FLAG SYN/ACK.
La machine A en recevant cette trame va renvoyer un paquet contenant un FLAG ACK pour conclure la phase de synchronisation(Cf. schéma G).
En générant cette trame la machine A va incrémenter d'une unité son champ ID dans le cas d'une implémentation de la pile IP dérivée de Berkeley.

Supposons maintenant l'existence d'une machine T qui génère des paquets en usurpant l'adresse IP de A.
L'envoi d'une trame TCP contenant un FLAG SYN venant de la machine T usurpant l'adresse IP de A sur le port vingt trois de la machine B va provoquer l'envoi d'une trame contenant un FLAG SYN/ACK à destination de la machine A si le port est ouvert.
La machine A en recevant ce paquet va y répondre en envoyant un paquet RST à destination de la machine B.
L'envoi de ce paquet va incrémenter d'une unité la valeur du champ ID de la machine A.

Dans la même situation si le port vingt trois de la machine B est fermé elle va envoyer une trame contenant un FLAG RST à destination de la machine A pour résilier la connexion.
La machine A en recevant ce paquet contenant une demande de résiliation de connexion ne va pas y répondre et par conséquent la valeur contenue dans le champ ID ne sera pas incrémenté.

La machine T en observant l'évolution des valeurs du champ ID de la machine A peut donc déterminer quels ports de la machine B sont ouverts. 

Aucune trace de l'adresse IP de la machine T ne sera générée sur la machine B.