[Tout ce qui suit a été étudié seulement sous Linux 2.4]
Envoyons une requête ARP-Request à une machine que
l'on soupconne de sniffer le brin (C'est-à-dire d'avoir le mode
promiscious d'activé). Voici ce qu'elle va faire :
À la réception d'une trame Ethernet, on regarde l'adresse MAC destinatrice. Si le bit de poids faible de l'octet le plus fort est à la valeur 1, cela signifie que c'est soit une adresse Multicast, soit Broadcast.
Après une rapide comparaison avec memcmp(), on
s'appercoit que la trame est de type PACKET_MULTICAST.
C'est ici que tout se joue : En mode normal (Non
promiscious), la trame serait droppée directement mais
l'interface est en mode Promiscious (Avec le flag
AcceptMulticast d'activé) donc la trame a le droit
de remonter les couches.
On arrive alors dans le code de gestion ARP (RFC
826).
C'est la fonction arp_rcv() qui est appelée.
Elle vérifie que la trame n'est ni pour quelqu'un d'autre, ni
pour l'interface loopback ou que le drapeau
IFF_NOARP n'est pas levé. Si ces conditions sont
remplies, on appelle arp_process() qui va se charger
de répondre à la requete. Bingo !
Une réponse va alors être envoyée. On peut donc savoir que la machine a son interface en mode promiscious : Normalement, on devrait s'attendre à ne rien recevoir.
Exemple en utilisant scapy :
Envoyons donc une requête ARP au sujet de la machine nope en mettant en adresse MAC de destinataire une adresse Multicast.
Welcome to Scapy (0.9.16.1beta) >>> srp(Ether(dst="1:42:42:42:42:42") / ARP(op = 'who-has', pdst='nope')) Begin emission: .Finished to send 1 packets. ....................................................................... ^C Received 1365 packets, got 0 answers, remaining 1 packets
Aucune réponse.
On recommence, mais cette fois avec un tcpdump(1) qui tourne sur la machine distante.
Welcome to Scapy (0.9.16.1beta)
>>> srp(Ether(dst="1:42:42:42:42:42") / \
ARP(op = 'who-has', pdst='nope'))[0][0][1].display()
Begin emission:
*Finished to send 1 packets.
Received 1 packets, got 1 answers, remaining 0 packets
---[ Ethernet ]---
dst = 00:c0:9f:0c:59:4b
src = 00:50:fc:0a:2f:c7
type = 0x806
---[ ARP ]---
hwtype = 0x1
ptype = 0x800
hwlen = 6
plen = 4
op = is-at
hwsrc = 00:50:fc:0a:2f:c7
psrc = 192.168.0.38
hwdst = 00:c0:9f:0c:59:4b
pdst = 192.168.0.1
---[ Padding ]---
load = '\xb7Q\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x04nope\x00'
Jeannie Longo, euh bingo !