Just Another Geek!/ blog/ posts/ Détection d'interface en mode promiscious

[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 !