Herkeios

Système de détection des intrusions

Sniffing et Analyse


Couches Réseau et Data-Link >>


I°) Ecoute réseau

   Pour notre IDS, nous avons eu besoin de pouvoir récupérer et analyser le traffic réseau transitant par notre interface, et ce afin de principalement pouvoir détecter les attaques par le réseau. Pour ceci, nous avons reconstruit un sniffer, qui est un logiciel permettant cette écoute du réseau.
Il existe de nombreux sniffers disponibles sur internet, possédant des fonctions avancés d'analyse de traffic tels wireshark (http://www.wireshark.org/) ou dsniff(http://www.monkey.org/~dugsong/dsniff/). Mais toujours dans un but d'apprentissage et de pédagogie, il est bien plus intéressant de construire complètement notre application de sniffing. Pour cela, nous utilisons la librairie pcap qui nous fournit des fonctions haut niveau nécessaires à la capture des paquets transitant par une interface réseau. Vooici le code commenté de capture des paquets transitant par la première interface trouvée.
Pcap nous permet de définir une fonction callback (ici appelé la_callback) qui va être exécuté à la réception d'un paquet.
    /* Calllback pour gerer les packets qui arrivent */

    void la_callback(u_char *args,const struct pcap_pkthdr* pkthdr,const u_char* packet)
    {
      /* Affichage du header ethernet et reception du type */

      u_short type = handle_ethernet(pkthdr,packet);

      if(type == ETH_IPv4)
      {/* IP packet */
        handle_IP(pkthdr,packet);

      }else if(type == ETH_ARP)
      {/* arp packet */
        handle_ARP(pkthdr,packet);
      }
    }

    /* fonction de fin du sniffer */
    void fin_sniff(int signo) {

      /* destruction du cache ARP*/
      delete_arp_cache();

      printf("\nFIN\n");
      fflush(stdout);

      exit(0);
    }

    int main()
    {
      char errbuf[PCAP_ERRBUF_SIZE]; /* Buffer d'erreur */
      pcap_t* descr; /* descripteur de capture de packets */

      /* Retourne un pointeur sur la premiere interace reseau utilisable
      rmq : On peut aussi directement la nommer plus tard
      Ou utiliser pcap_findalldevs() pour faire la liste de
      tous ceux disponibles
      */
      dev = pcap_lookupdev(errbuf);
      if(dev == NULL)
      { printf("ERR: %s\n",errbuf); fflush(stdout);exit(1); }

      /* Ouverture de l'interface pour capturer
      BUFSIZ : Taille max de bits a capturer par packets
      rmq : 1514 par defaut pour ethernet, ici on prend la taille buffer optimale
      1 : mode 'promiscious': on prend tous les packets, meme ceux qui ne nous
      sont pas destines
      1000 : Timeout pour la lecture en millisecondes (1000 est la taille adoptee par tcpdump, sniffer reconnu)*/

      descr = pcap_open_live("eth1",BUFSIZ,1,1000,errbuf);
      if(descr == NULL)
      { printf("ERR: open_live: %s\n",errbuf); fflush(stdout); exit(1); }

      printf("\nSNIFF sur %s\n", dev);
      fflush(stdout);

      /* Creation du cache ARP pour la detection d'ARP Poisoning*/
      create_arp_cache();

      /* effacement tu tableau unnamed pour la detection des attaques unnamed */
      raz_unnamed();

      /* SIGINT declenche la fin du sniffer */
      signal(SIGINT, fin_sniff);

      /* Capture des packets
      -1 : nombre de packets a capturer (-1 = on s'arrete jamais sauf en cas d'erreur)
      la callback : fonction qu'on appelle a chaque packet capture */

      if( pcap_loop(descr,-1,la_callback,NULL) <0 )
      { printf("ERR: loop: %s\n", pcap_geterr(descr)); fflush(stdout); exit(1); }

      return 0;
    }

Nous voici donc dans la callback avec un paquet réseau fraichement capturé. Il nous faut alors l'analyser. Pour cela, il suffit de se renseigner un peu sur les protocoles utilisés, puis de créer nos propres structures afin de les appliquer au paquet reçu.
Nous ne détaillerons pas ici ces protocoles, en effet ceux-ci peuvent être facilement trouvé sur internet. Pour nos besoin, nous avons implémenté les protocoles suivants (en indentant suivant la hiérarchie de ceux-ci) :
    ETHERNET
      IPv4
        TCP
        ICMP
        UDP
      ARP
Nous allons donc étudier la réception des paquets et les analyser, couche par couche (Data-link => Ethernet ; Network => IPv4, ARP ; Transport => TCP, UDP, ICMP).


Couches Réseau et Data-Link >>
Site sur la sécurité informatique - Qu'est-ce qu'un IDS ? - L'équipe Herkeios