Un "sniffer" n'est pas un outil pour se "shooter", mais pour analyser les données qui se trimbalent sur le réseau. C'est un outil d'administrateur, qui est capable du meilleur comme du pire. Si vous voulez jouer avec, il en existe un tout à fait convenable et gratuit, aussi bien en version Linux que Windows, c'est Ethereal. Il nécessite l'installation de la librairie libpcap, disponible elle aussi sous Linux comme sous Windows.
Nous allons juste ici analyser une capture de trames correspondant au dialogue DHCP, et constater que, lorsque ça va bien, ça se passe comme c'est dit dans les livres, ce qui est un peu réconfortant.
La manipulation est faite avec un client sous Windows XP.
No. Time Source Destination Protocol Info 1 0.000000 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0x6719436e 2 0.001182 192.168.0.253 192.168.0.9 ICMP Echo (ping) request 3 0.342454 192.168.0.253 192.168.0.9 DHCP DHCP Offer - Transaction ID 0x6719436e 4 0.344405 0.0.0.0 255.255.255.255 DHCP DHCP Request - Transaction ID 0x6719436e 5 0.348264 192.168.0.253 192.168.0.9 DHCP DHCP ACK - Transaction ID 0x6719436e 6 0.353014 CIS_b9:49:37 Broadcast ARP Who has 192.168.0.9? Tell 192.168.0.9 7 0.571241 CIS_b9:49:37 Broadcast ARP Who has 192.168.0.9? Tell 192.168.0.9 8 1.571441 CIS_b9:49:37 Broadcast ARP Who has 192.168.0.9? Tell 192.168.0.9 9 2.580537 192.168.0.9 192.168.0.255 NBNS Registration NB PCHRIS<00> 10 2.590265 192.168.0.9 192.168.0.255 NBNS Registration NB PCHRIS<03>
Ce ping fait "perdre" une seconde au processus d'attribution d'un bail. En effet, le serveur attend pendant une seconde une éventuelle réponse. Si vous êtes absolument sûr de votre réseau, vous pouvez désactiver ce ping dans le fichier de configuration de DHCPd, mais je ne vous le conseille pas.
Ce qui suit représente l'interprétation exhaustive des trames par le "sniffer". Il est évident qu'en lecture directe sur le réseau, on ne verrait qu'une suite d'octets difficilement interprétable par l'esprit humain.
La lecture en est certes un peu fastidieuse, mais elle est riche d'enseignements... Les points les plus importants sont marqués en gras.
Frame 1 (342 bytes on wire, 342 bytes captured) Arrival Time: Dec 10, 2002 10:10:04.658425000 Time delta from previous packet: 0.000000000 seconds Time relative to first packet: 0.000000000 seconds Frame Number: 1 Packet Length: 342 bytes Capture Length: 342 bytes Ethernet II, Src: 00:20:18:b9:49:37, Dst: ff:ff:ff:ff:ff:ff Destination: ff:ff:ff:ff:ff:ff (Broadcast) *** La destination est inconnue, c'est un Broadcast ARP. On cherche un serveur DHCP Source: 00:20:18:b9:49:37 (CIS_b9:49:37) *** La source, elle, est connue, c'est l'adresse MAC de la machine cliente. Type: IP (0x0800) Internet Protocol, Src Addr: 0.0.0.0 (0.0.0.0), Dst Addr: 255.255.255.255 (255.255.255.255) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 0000 00.. = Differentiated Services Codepoint: Default (0x00) .... ..0. = ECN-Capable Transport (ECT): 0 .... ...0 = ECN-CE: 0 Total Length: 328 Identification: 0x4b10 Flags: 0x00 .0.. = Don't fragment: Not set ..0. = More fragments: Not set Fragment offset: 0 Time to live: 128 Protocol: UDP (0x11) Header checksum: 0xee95 (correct) Source: 0.0.0.0 (0.0.0.0) Destination: 255.255.255.255 (255.255.255.255) *** Même chose niveau IP, mais sans adresse, bien entendu. User Datagram Protocol, Src Port: bootpc (68), Dst Port: bootps (67) Source port: bootpc (68) Destination port: bootps (67) Length: 308 Checksum: 0xf904 (correct) Bootstrap Protocol Message type: Boot Request (1) Hardware type: Ethernet Hardware address length: 6 Hops: 0 Transaction ID: 0x6719436e Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) 0... .... .... .... = Broadcast flag: Unicast .000 0000 0000 0000 = Reserved flags: 0x0000 Client IP address: 0.0.0.0 (0.0.0.0) Your (client) IP address: 0.0.0.0 (0.0.0.0) Next server IP address: 0.0.0.0 (0.0.0.0) Relay agent IP address: 0.0.0.0 (0.0.0.0) Client hardware address: 00:20:18:b9:49:37 Server host name not given Boot file name not given *** Actuellement, le client ne dispose d'aucune configuration. Magic cookie: (OK) Option 53: DHCP Message Type = DHCP Discover Unknown Option Code: 251 (1 bytes) Option 61: Client identifier Hardware type: Ethernet Client hardware address: 00:20:18:b9:49:37 Option 50: Requested IP Address = 192.168.0.9 *** Mais comme il se souvient de l'IP qu'il avait autrefois, *** Il souhaiterait récupérer la même. Option 12: Host Name = "pchris" *** Il connaît aussi son nom d'hôte et le signale au serveur. *** Nous verrons (beaucoup) plus loin que ça peut être utile. Option 60: Vendor class identifier = "MSFT 5.0" Option 55: Parameter Request List 1 = Subnet Mask 15 = Domain Name 3 = Router 6 = Domain Name Server 44 = NetBIOS over TCP/IP Name Server 46 = NetBIOS over TCP/IP Node Type 47 = NetBIOS over TCP/IP Scope 31 = Perform Router Discover 33 = Static Route 43 = Vendor-Specific Information End Option *** La liste des option qui peuvent l'intéresser. *** le serveur peut en connaître bien plus... *** Notez que le client, d'origine Microsoft, demande pas mal d'informations *** sur NetBIOS. Nous ne les lui donnerons pas ici, mais ça peut être utile *** de le faire sur un gros réseau Microsoft. Padding
Frame 2 (62 bytes on wire, 62 bytes captured)
Arrival Time: Dec 10, 2002 10:10:04.659607000
Time delta from previous packet: 0.001182000 seconds
Time relative to first packet: 0.001182000 seconds
Frame Number: 2
Packet Length: 62 bytes
Capture Length: 62 bytes
Ethernet II, Src: 00:00:b4:bb:5d:ee, Dst: 00:20:18:b9:49:37
Destination: 00:20:18:b9:49:37 (CIS_b9:49:37)
Source: 00:00:b4:bb:5d:ee (Edimax_bb:5d:ee)
Type: IP (0x0800)
Internet Protocol, Src Addr: 192.168.0.253 (192.168.0.253), Dst Addr: 192.168.0.9 (192.168.0.9)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 48
Identification: 0x0000
Flags: 0x04
.1.. = Don't fragment: Set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: ICMP (0x01)
Header checksum: 0xb876 (correct)
Source: 192.168.0.253 (192.168.0.253)
Destination: 192.168.0.9 (192.168.0.9)
*** Ping du serveur vers l'adresse 192.168.0.9 supposée disponible...
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0xa7db (correct)
Identifier: 0x5024
Sequence number: 00:00
Data (20 bytes)
0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0010 00 00 00 00 ....
Pas de réponse au ping, on peut continuer tranquille...
Notez que ce ping est facultatif, il n'est pas demandé par la norme DHCP.
Frame 3 (342 bytes on wire, 342 bytes captured) Arrival Time: Dec 10, 2002 10:10:05.000879000 Time delta from previous packet: 0.341272000 seconds Time relative to first packet: 0.342454000 seconds Frame Number: 3 Packet Length: 342 bytes Capture Length: 342 bytes Ethernet II, Src: 00:00:b4:bb:5d:ee, Dst: 00:20:18:b9:49:37 Destination: 00:20:18:b9:49:37 (CIS_b9:49:37) Source: 00:00:b4:bb:5d:ee (Edimax_bb:5d:ee) *** Le serveur ne répond pas ici en Broadcast Ethernet. C'est rendu possible *** par le fait que le client, lors du "Discover" a transmis son adresse MAC Type: IP (0x0800) Internet Protocol, Src Addr: 192.168.0.253 (192.168.0.253), Dst Addr: 192.168.0.9 (192.168.0.9) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x10 (DSCP 0x04: Unknown DSCP; ECN: 0x00) 0001 00.. = Differentiated Services Codepoint: Unknown (0x04) .... ..0. = ECN-Capable Transport (ECT): 0 .... ...0 = ECN-CE: 0 Total Length: 328 Identification: 0x0000 Flags: 0x00 .0.. = Don't fragment: Not set ..0. = More fragments: Not set Fragment offset: 0 Time to live: 16 Protocol: UDP (0x11) Header checksum: 0x273f (correct) Source: 192.168.0.253 (192.168.0.253) Destination: 192.168.0.9 (192.168.0.9) *** Notez que le serveur fait comme si le client disposait déjà de son adresse IP User Datagram Protocol, Src Port: bootps (67), Dst Port: bootpc (68) Source port: bootps (67) Destination port: bootpc (68) Length: 308 Checksum: 0xb216 (correct) Bootstrap Protocol Message type: Boot Reply (2) Hardware type: Ethernet Hardware address length: 6 Hops: 0 Transaction ID: 0x6719436e Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) 0... .... .... .... = Broadcast flag: Unicast .000 0000 0000 0000 = Reserved flags: 0x0000 Client IP address: 0.0.0.0 (0.0.0.0) Your (client) IP address: 192.168.0.9 (192.168.0.9) *** Confirmation de l'IP du client. Next server IP address: 192.168.0.253 (192.168.0.253) *** IP du serveur DHCP qui répond Relay agent IP address: 0.0.0.0 (0.0.0.0) *** Il n'y a pas d'agent de relais DHCP Client hardware address: 00:20:18:b9:49:37 Server host name not given Boot file name not given Magic cookie: (OK) Option 53: DHCP Message Type = DHCP Offer Option 54: Server Identifier = 192.168.0.253 Option 51: IP Address Lease Time = 1 hour Option 1: Subnet Mask = 255.255.255.0 Option 15: Domain Name = "maison.mrs" Option 3: Router = 192.168.0.253 Option 6: Domain Name Server = 192.168.0.253 End Option *** Voilà tout ce que le serveur DHCP peut indiquer au client Padding
Le serveur DHCP vient de proposer une configuration au client.
Il faut aussi, maintenant que le client fasse une demande explicite pour ce bail. N'oublions pas qu'il pourrait y avoir plusieurs DHCP qui répondent, il faut donc qu'il y ait une confirmation au serveur choisi par le client.
Frame 4 (349 bytes on wire, 349 bytes captured) Arrival Time: Dec 10, 2002 10:10:05.002830000 Time delta from previous packet: 0.001951000 seconds Time relative to first packet: 0.344405000 seconds Frame Number: 4 Packet Length: 349 bytes Capture Length: 349 bytes Ethernet II, Src: 00:20:18:b9:49:37, Dst: ff:ff:ff:ff:ff:ff Destination: ff:ff:ff:ff:ff:ff (Broadcast) Source: 00:20:18:b9:49:37 (CIS_b9:49:37) Type: IP (0x0800) Internet Protocol, Src Addr: 0.0.0.0 (0.0.0.0), Dst Addr: 255.255.255.255 (255.255.255.255) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 0000 00.. = Differentiated Services Codepoint: Default (0x00) .... ..0. = ECN-Capable Transport (ECT): 0 .... ...0 = ECN-CE: 0 Total Length: 335 Identification: 0x4b12 Flags: 0x00 .0.. = Don't fragment: Not set ..0. = More fragments: Not set Fragment offset: 0 Time to live: 128 Protocol: UDP (0x11) Header checksum: 0xee8c (correct) Source: 0.0.0.0 (0.0.0.0) Destination: 255.255.255.255 (255.255.255.255) User Datagram Protocol, Src Port: bootpc (68), Dst Port: bootps (67) Source port: bootpc (68) Destination port: bootps (67) Length: 315 Checksum: 0xe94b (correct) Bootstrap Protocol Message type: Boot Request (1) Hardware type: Ethernet Hardware address length: 6 Hops: 0 Transaction ID: 0x6719436e Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) 0... .... .... .... = Broadcast flag: Unicast .000 0000 0000 0000 = Reserved flags: 0x0000 Client IP address: 0.0.0.0 (0.0.0.0) Your (client) IP address: 0.0.0.0 (0.0.0.0) Next server IP address: 0.0.0.0 (0.0.0.0) Relay agent IP address: 0.0.0.0 (0.0.0.0) Client hardware address: 00:20:18:b9:49:37 Server host name not given Boot file name not given Magic cookie: (OK) Option 53: DHCP Message Type = DHCP Request Option 61: Client identifier Hardware type: Ethernet Client hardware address: 00:20:18:b9:49:37 Option 50: Requested IP Address = 192.168.0.9 Option 54: Server Identifier = 192.168.0.253 Option 12: Host Name = "pchris" *** *** Bien que très similaire à la trame DHCP Discover, notez la *** subtile différence, principalement sur l'option 54 *** qui ne figurait pas dans le Discover, et pour cause. *** Option 81: Client Fully Qualified Domain Name (10 bytes) Option 60: Vendor class identifier = "MSFT 5.0" Option 55: Parameter Request List 1 = Subnet Mask 15 = Domain Name 3 = Router 6 = Domain Name Server 44 = NetBIOS over TCP/IP Name Server 46 = NetBIOS over TCP/IP Node Type 47 = NetBIOS over TCP/IP Scope 31 = Perform Router Discover 33 = Static Route 43 = Vendor-Specific Information End Option
C'est presque fini, il ne reste plus au serveur qu'à confirmer l'attribution de ce bail.
Frame 5 (342 bytes on wire, 342 bytes captured)
Arrival Time: Dec 10, 2002 10:10:05.006689000
Time delta from previous packet: 0.003859000 seconds
Time relative to first packet: 0.348264000 seconds
Frame Number: 5
Packet Length: 342 bytes
Capture Length: 342 bytes
Ethernet II, Src: 00:00:b4:bb:5d:ee, Dst: 00:20:18:b9:49:37
Destination: 00:20:18:b9:49:37 (CIS_b9:49:37)
Source: 00:00:b4:bb:5d:ee (Edimax_bb:5d:ee)
Type: IP (0x0800)
Internet Protocol, Src Addr: 192.168.0.253 (192.168.0.253), Dst Addr: 192.168.0.9 (192.168.0.9)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x10 (DSCP 0x04: Unknown DSCP; ECN: 0x00)
0001 00.. = Differentiated Services Codepoint: Unknown (0x04)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 328
Identification: 0x0000
Flags: 0x00
.0.. = Don't fragment: Not set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 16
Protocol: UDP (0x11)
Header checksum: 0x273f (correct)
Source: 192.168.0.253 (192.168.0.253)
Destination: 192.168.0.9 (192.168.0.9)
User Datagram Protocol, Src Port: bootps (67), Dst Port: bootpc (68)
Source port: bootps (67)
Destination port: bootpc (68)
Length: 308
Checksum: 0xaf16 (correct)
Bootstrap Protocol
Message type: Boot Reply (2)
Hardware type: Ethernet
Hardware address length: 6
Hops: 0
Transaction ID: 0x6719436e
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0 (0.0.0.0)
Your (client) IP address: 192.168.0.9 (192.168.0.9)
Next server IP address: 192.168.0.253 (192.168.0.253)
Relay agent IP address: 0.0.0.0 (0.0.0.0)
Client hardware address: 00:20:18:b9:49:37
Server host name not given
Boot file name not given
Magic cookie: (OK)
Option 53: DHCP Message Type = DHCP ACK
Option 54: Server Identifier = 192.168.0.253
Option 51: IP Address Lease Time = 1 hour
Option 1: Subnet Mask = 255.255.255.0
Option 15: Domain Name = "maison.mrs"
Option 3: Router = 192.168.0.251
Option 6: Domain Name Server = 192.168.0.253
End Option
Padding
Pas besoin de regarder de près ce qu'il se passe dans les broadcasts ARP que le client fait par la suite.
Je ne vous assommerai pas encore une fois avec un sniff, croyez-moi sur parole, j'ai fait la manip pour vérifier.
Dans ce cas, le serveur recevra un "echo reply" de la part du noeud utilisant cette IP et ne répondra pas au Discover. Le client, ne recevant pas de réponse, enverra un nouveau discover et le serveur lui proposera une autre IP.
Ce sera la catastrophe annoncée. Le bail sera alloué et il y aura une duplication de l'IP sur le réseau. Mais les broadcast ARP fait par le client qui a reçu l'IP dupliquée mettra à jour cette duplication et la configuration échouera.
Cette situation ne devrait pas se produire sur un réseau proprement configuré. Elle ne devrait apparaître que s'il y a un utilisateur malveillant sur le réseau, qui force une configuration statique quand il ne le faut pas et qui bloque volontairement les échos ICMP.
Pour ceux qui n'ont pas peur de se plonger dans les RFCs, vous trouverez celle qui traite du protocole DHCP ici (RFC 2131).
Lorsque la durée du bail est inférieure à " l'uptime" du client, autrement dit, si votre client reste connecté plus longtemps que la durée de validité de son bail, il va devoir le renouveler.
Pour visualiser cette procédure, nous faisons un petit test, en diminuant la durée de vie du bail à quatre minutes, et nous sniffons :
No. Time Source Destination Protocol Info 1 0.000000 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xe84b4f54 2 0.001347 192.168.0.253 192.168.0.7 ICMP Echo (ping) request 3 0.837995 192.168.0.253 192.168.0.7 DHCP DHCP Offer - Transaction ID 0xe84b4f54 4 0.839967 0.0.0.0 255.255.255.255 DHCP DHCP Request - Transaction ID 0xe84b4f54 5 0.848485 192.168.0.253 192.168.0.7 DHCP DHCP ACK - Transaction ID 0xe84b4f54 ... 75 120.629525 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0xc1494f49 76 120.632278 192.168.0.253 192.168.0.7 DHCP DHCP ACK - Transaction ID 0xc1494f49
Ca semble suffisamment parlant, au bout d'environ 120 secondes, soit 50% de la durée de vie du bail, le client essaye de le renouveler. Ca se passe bien, puisque le serveur répond toute de suite et ça repart pour 4 minutes. Inutile de regarder le détail des trames.
Nous allons faire la même chose, mais en simulant une panne de serveur DHCP :
No. Time Source Destination Protocol Info *** Premier bail, le serveur est en route, tout va bien... 1 0.000000 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xe1fc342 2 0.001302 192.168.0.253 192.168.0.7 DHCP DHCP Offer - Transaction ID 0xe1fc342 3 0.003157 0.0.0.0 255.255.255.255 DHCP DHCP Request - Transaction ID 0xe1fc342 4 0.006847 192.168.0.253 192.168.0.7 DHCP DHCP ACK - Transaction ID 0xe1fc342 ... *** Mi temps, tentative de renouvellement, mais le démon DHCP est stoppé 399 119.949192 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0xe220dc2e *** Comme la machine est polie, elle prévient au moyen d'ICMP qu'il y a un problème *** voyez qu'ICMP peut avoir du bon... 400 119.949376 192.168.0.253 192.168.0.7 ICMP Destination unreachable 401 123.951521 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0xe220dc2e 402 123.951733 192.168.0.253 192.168.0.7 ICMP Destination unreachable ... *** Ca va durer comme ça un petit moment... 405 130.953962 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0xe220dc2e 406 130.954174 192.168.0.253 192.168.0.7 ICMP Destination unreachable 407 178.960775 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0x95759f13 408 178.960990 192.168.0.253 192.168.0.7 ICMP Destination unreachable 409 181.963368 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0x95759f13 410 181.963582 192.168.0.253 192.168.0.7 ICMP Destination unreachable 411 189.966027 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0x95759f13 412 189.966201 192.168.0.253 192.168.0.7 ICMP Destination unreachable ... 415 209.972090 192.168.0.7 192.168.0.253 DHCP DHCP Request - Transaction ID 0x8229871 416 209.972305 192.168.0.253 192.168.0.7 ICMP Destination unreachable *** Le client commence à s'affoler, il multiplie les requêtes... 417 213.975068 192.168.0.7 255.255.255.255 DHCP DHCP Request - Transaction ID 0x8229871 418 220.976509 192.168.0.7 255.255.255.255 DHCP DHCP Request - Transaction ID 0x8229871 419 235.983200 192.168.0.7 255.255.255.255 DHCP DHCP Request - Transaction ID 0x6851e126 420 240.984665 192.168.0.7 255.255.255.255 DHCP DHCP Request - Transaction ID 0x6851e126 421 248.986247 192.168.0.7 255.255.255.255 DHCP DHCP Request - Transaction ID 0x6851e126 *** Le client est désespéré, il cherche un nouveau serveur DHCP 422 265.041026 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xc7517868 423 269.041902 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xc7517868 *** Comme on n'est pas chien, on remet le démon en service... 424 278.042746 0.0.0.0 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xc7517868 425 278.044686 192.168.0.253 192.168.0.7 ICMP Echo (ping) request 426 279.052019 192.168.0.253 192.168.0.7 DHCP DHCP Offer - Transaction ID 0xc7517868 427 279.053983 0.0.0.0 255.255.255.255 DHCP DHCP Request - Transaction ID 0xc7517868 428 279.058503 192.168.0.253 192.168.0.7 DHCP DHCP ACK - Transaction ID 0xc7517868 *** Et l'histoire finit bien.
Mais elle aurait pu mal finir, si ça avait été une bonne, vraie, grosse panne du serveur. En effet, une fois le bail expiré, le client perd bel et bien son IP et est éjecté de fait du réseau... Du temps où les câblés Wanadoo fonctionnaient sur ce système, ils n'ont pas manqué d'assister quelques fois à ce désolant spectacle.