Kernel AODV Hack
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.