AFFICHER CET ARTICLE EN MODE PAGE ENTIERE
SOMMAIRE
1) Introduction
2) Pourquoi ARP ?
3) La détection d'os
4) Prise d'empreinte
5) Reférences
Depuis la création d'outils comme nmap, queso ou xprobe, la détection d'un système d'exploitation est un jeu d'enfant pour les pirates. Malheureusement l'utilisation de tels outils sont facilement détectables par des systèmes de détection d'intrusion (ids). En effet, la plupart de ces outils utilisent des bogues ou des caratéristiques de chacune des piles tcp/ip de chaque OS. Ils emmetent alors des paquets malformés et en fonction de la (non)réponse, déterminent grace à une base d'empreintes le système d'exploitation. En étudiant ces différents outils, on peut remarquer qu'ils utilisent principalement les protocoles TCP, UDP, ICMP mais pas le protocol ARP. La raison de cela est simple, ce protocol est utilisé sur des réseaux locaux et peu (pas) sur internet. Cette article décrit donc comment identifier le système d'exploitation d'une machine sur un reseau local en utilisant le protocol ARP.
Tout simplement puisqu'il est énormement utilisé dans les réseaux locaux et qu'il est différent des autres protocoles tel que TCP. En effet, ARP agit au niveau de la couche 2 et 3 du modèle d'OSI ce qui correspond à la couche Internet du modèle TCP/IP. Son role est de permettre à une machine X de déterminer l'addresse physique (MAC) d'une machine Y en connaissant uniquement l'addresse logique (IP). Il est définit dans la RFC 826.
Le problème avec ARP dans le but d'une détection de système d'exploitation est qu'il agit sur "les couches basses" du modèle OSI, c'est à dire que les trames sont traitées par le matériel qui peut très bien dropper la trame (filtrage matériel), ce qui rend l'OS Fingerprint innopérable. En contre partie on peut détecter le type de matériel réseau présent sur une machine ("hardware-fingerprint").
Il y a plusieurs méthodes plus ou moins fiable pour détecter un système d'exploitation avec arp. Je n'en développerai que quelques une, les plus fiables basées le couple spoofing et promiscuité.
Evil ARP
La première technique est d'envoyée un paquet ARP (arp-request) forgé contenant une fausse addresse IP source n'appartenant pas au réseau vers une hote A. La trame passe sans problème (normalement) les couches basses du modèle d'OSI pour arriver au kernel. C'est ici que tout se joue et que des différentes possibilités interviennent:
1. Le noyau fait une vérification et regarde si l'ip source fait bien partit bien de son réseau. Si ce n'est pas le cas il peut ignoré le paquet.
2. Le noyau fait pas de vérification et envoie une réponse vers la fausse IP qu'il peut envoyer plusieurs fois selon l'OS.
Vous l'aurez compris, c'est la 2ème possibilités qui va permettre de détecter le système d'exploitation selon le nombre de réponses envoyées. Pour cela il faut envoyer le paquet avec l'ip source falsifiées, basculer la carte réseau en mode 'promisc' et sniffer les trames réseaux pour déterminer si la machine répond ou non et combien de fois.
Evil Ping
Cette deuxième méthode ressemble à la première. Il s'agit d'envoyer un paquet icmp ECHO_REQUEST (ping) forgé avec une ip source n'appartenant pas au réseau vers une machine quelconque. Le paquet va passer sans problème les couches basses du modèle d'OSI pour arriver au noyau. A ce moment là, c'est comme tout à l'heure, soit on a une vérification sur l'ip source soit comme dans la plupart des cas le noyau répond et comme il connait pas l'addresse physique correspondant à l'ip source emet un ou plusieurs paquets ARP (arp-request). C'est là qu'on retrouve les différences entre les OS. L'un va envoyer un seul paquet comme les windows par exemple, d'autre comme openbsd ou linux, vont envoyer plusieurs paquets, 3 au total a différent intervale de temps. Cette méthode est surement la plus fiable de tous, c'est celle qui est implémentée dans le seul outil d'os fingerprint basé sur arp que
je connais, induce-arp de concept. L'inconvégniant de cette méthode est que la machine distante peut dropper les paquets icmp ECHO_REQUEST, il faut donc s'assurer en envoyant un ping normal que la machine répond à ceux-ci.
Evil HW Addresse
Cette dernière méthode présentée dans cette article a été "empreinté" aux outils de detection du mode promiscuous à distante tel que neped ou Promiscan. Il s'agit d'envoyer des requêtes arp (arp-request) avec des adresses physiques falsifiés (broadcast, multicast) comme FF:FF:FF:FF:FF:FE, FF:FF:FF:FF:FF:FF, FF:00:00:00:00:00 qui représentent des adresses de broadcast ou 01:00:00:00:00:00, 01:00:00:01:00:00 qui sont des adresses de multicast. Ainsi certaines machines vont répondrent et d'autres non. Avec cette méthode on peut ainsi détecter sur quel mode fonctionne la carte réseau (promisc, multicast ...).
Nous voilà maintenant dans le moment incontournable pour réaliser un outil de détection d'os, la mise en place de la base d'empreintes pour chaque OS. La prise d'empreinte est un travail qui pour être complet dois se faire à plusieurs. Moi je suis tout seul donc j'ai réalisé les tests sur seulement 3 OS, windows XP, linux Debian/Sarge avec un kernel 2.4.27 et un OpenBSD 3.5 mais le principale ici n'est pas le nombre mais comment procéder pour réaliser une prise d'empreinte.
Pour réalisé les différents tests cités plus haut, j'ai utilisé le programme scapy developpé par cartel-securité et le sniffeur tcpdump à partir d'une machine sous linux. Sa (scapy) principale fonction est la génération de trames réseau. Il gère bien entendu le protocole Arp.
Voici comment procéder avec scapy pour chaque méthode:
Infos pour les exemples de dessous:
- Adresse MAC de la machine: 41:41:41:41:41:41
- Adresse IP de la machine: 192.168.0.2
- Spoofed adresse MAC: 00:01:02:03:04:05
- Spoofed IP: 172.128.0.1
Evil ARP
# scapy.py
Welcome to Scapy (0.9.15.1beta)
>>> srp(Ether(dst="41:41:41:41:41:41") / ARP(op = 'who-has', pdst = 'nope'))
Evil Ping
# scapy.py
Welcome to Scapy (0.9.15.1beta)
>>> srp(IP(src='172.128.0.1',dst='192.168.0.2')/ICMP())
Evil Hw Addr
# scapy.py
Welcome to Scapy (0.9.15.1beta)
>>> srp(Ether(dst="FF:FF:FF:FF:FF:FF",src="00:01:02:03:04:05") / ARP(op = 'who-has', pdst = 'nope'))
Je ne me suis pas encore tellement amusé a trouver des empreintes mais en voici quelques unes:
- Windows XP:
(Evil ARP) Réponse: oui.
Nombre(s) de paquet(s) envoyé(s): 1.
(Evil Ping) Idem que Evil ARP.
(Evil HW Addr) Si promisc réponse à: - FF:FF:FF:FF:FF:FE
- FF:FF:00:00:00:00
- Linux (2.4.27)
(Evil ARP) Réponse: non.
(Evil Ping) Réponse: oui.
Nombre(s) de paquet(s) envoyé(s): 3.
Intervalle entre chaque paquet: 1 seconde.
(Evil HW Addr) Si promisc réponse à: - FF:FF:FF:FF:FF:FE
- FF:FF:00:00:00:00
- FF:00:00:00:00:00
- 01:00:E5:00:00:01
- OpenBSD (3.5)
(Evil ARP) Réponse: non.
(Evil Ping) Réponse: oui.
Nombre(s) de paquet(s) envoyé(s): 3.
Intervalle entre chaque paquet: 6 secondes.
(Evil HW Addr) Si promisc réponse à: - FF:FF:FF:FF:FF:FE
- FF:FF:00:00:00:00
- FF:00:00:00:00:00
- 01:00:E5:00:00:01
Voilà pour les maigres résultats que j'ai récolté. On remarquera que les 2 OS OpenBSD et Linux se ressemblent beaucoup.
[] induce-arp by concept - arp-based os detection
[] Détection de sniffers et IDS sur un réseau local - Norman Girard
[] http://www.cartel-securite.fr/pbiondi/scapy.html
[] tcpdump.org
BY ANDRAS
Copyright © 2005 ARENHACK - DHS