Kernel AODV Hack

From YobiWiki
Revision as of 02:06, 26 February 2008 by <bdi>PhilippeTeuwen</bdi> (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Converted with HTML::WikiConverter::MediaWiki from my old phpwiki site


Permettre l'injection locale de paquets HELLO pour réaliser un noeud KernelAodvReseauCitoyen

Remarques préalables sur l'injection de paquets forgés

  • cf Kernel AODV Spoof Hello pour les premiers tests d'injection de paquets HELLO dans kernel_aodv réalisés au laboratoire de Bombolong
  • Lorsque plusieurs interfaces sont reconnues par kernel_aodv, il faut parler à l'IP principale reconnue comme telle par kernel_aodv (cf messages de démarrage du module)
    L'IP principale est simplement la dernière IP que kernel_aodv intègre à sa table.
  • Il faut spoofer l'adresse de la source sinon cela risque d'avoir des conséquences fâcheuses pour la mise à jour de la table de routage.

Voir Injection dynamique de routes dans la table AODV sur ReseauCitoyen:AodvNistInternals

Notes techniques sur la modification du module kernel_aodv

  • Protection du hack par un flag de compilation afin de pouvoir compiler le code original si on le souhaite.
  • Seconde protection (puisque par défaut le hack sera compilé):
    Ajout d'un paramètre au module: "self_injection=0(default)/1" pour activer le code d'injection locale
  • Dans la fonction packet_in() qui se trouve dans le fichier packet_in.c, qui est la fonction accrochée au Netfilter et récupérant les paquets qui arrivent sur la machine, nous ajoutons un code d'interception des paquets envoyés sur le device "lo" qui ont pour destination notre IP AODV principale, nous les vérifions un minimum et nous les passons à la queue de traitement des paquets fraîchement arrivés, après quoi nous disons à Netfilter qu'il peut se débarrasser du paquet forgé.
    Cela donne:


    // If self_injection is active and we receive a locally forget packet:
    if (SELF_INJECTION && (strcmp(dev->name,"lo")==0) && (ip->daddr==g_my_ip))
      {
        //still sanity check...
        aodv_type = (int)packet->data[start_point];
        if (check_packet(packet->len-start_point,aodv_type,packet->data+start_point))
          {
            printk(KERN_NOTICE "AODV: Packet of type: %d and of size %u failed packet check!\n",aodv_type,packet->len-start_point);
            return NF_DROP;

          }
        //place packet in the event queue!
        insert_event_queue_entry(aodv_type,packet);
        //drop our locally forget packet
        return NF_DROP;
      }
  • Il reste un problème dans la fonction find_interface_by_dev() du fichier interface_list.c car si nous avons intercepté un paquet forgé en provenance de "lo" nous n'avons pas changé cette information de provenance et la fonction find_interface_by_dev() perd les pédales.
    Voici le code à ajouter pour éviter cela:
     tmp_ip = tmp_indev->ifa_list->ifa_address;
 
 #ifdef AODV_SELF_INJECTION
     // if self_injection code is active and we receive a local packet
     if (SELF_INJECTION && (strcmp(dev->name,"lo")==0))
         // change 127.0.0.1 to our active IP
         tmp_ip=g_my_ip;
 #endif
  • Remarque: nous aurions peut-être pu spoofer le device de provenance du paquet forgé mais lorsque j'ai fait quelques tentatives j'ai réussi à perdre complètement mon interface loopback jusqu'au reboot suivant!
  • Remarque 2: le spoof de l'adresse source n'a pas l'air nécessaire pour les machines à une seul hop.