Le défi était: "Ecrire un filtre tcpdump / WinDump qui va capturer les paquets ICMPv6 Multicast Listener.« J'ai une vaste écrire sur ce qui fait la réponse si complexe. Si vous connaissez l'IPv6 et veulent juste la réponse, passez à la fin.
D'abord, le contexte
Steinar a fait quelques commentaires sur les publications précédentes et a été de 100% sur la bonne voie. Si vous les lisez et j'ai pensé «Wow, ça sonne vraiment désordre», vous comprenez l'ampleur du problème ainsi. ![]()
Protocole Vs. Champ-tête suivant
Avec IPv4 nous avons eu le champ des options. Cela pourrait provoquer l'en-tête IP pour passer de 20 octets à aussi grande que 60 octets en taille. Avec IPv6, il n'est plus un champ de possibilités et de l'en-tête est fixé à 40 octets. Lorsque les options sont nécessaires, nous utilisons têtes d'extension pour les identifier. Cela jette une balle courbe intéressante à nous, car avec le champ protocole IPv4 (octet 9) serait (presque) toujours d'identifier le transport de niveau supérieur (TCP, UDP, etc.) Avec IPv6 le champ d'en-tête suivant (octet 6) pourraient identifier le transport de la couche supérieure, ou il pourrait identifier une tête d'extension qui comprendra un certain nombre d'options.
Voici une liste de quelques têtes d'extension IPv6 que vous pourriez rencontrer, ainsi que les RFC qui les définissent:
| Option # | Option Description | RFC |
| 0 | Hop-by-Hop | 2460 |
| 6 | TCP | 793 |
| 17 | UDP | 768 |
| 43 | Routage | 5095 |
| 44 | La fragmentation | 2460 |
| 50 | ESP | 4303 |
| 51 | AH | 4302 |
| 58 | ICMPv6 | 4443 |
| 59 | Aucun en-tête suivant | 2460 |
| 60 | Options de destination | 2460 |
| 135 | Mobilité | 3775 |
IPv6 ne limite pas le nombre de têtes d'extension, vous pouvez utiliser dans une seule packet.There est cependant une publication "afin recommandé" la façon dont les têtes doivent être énoncées. L'ordre est:
- Tête IPv6
- Hop-by-Hop options
- Entête de routage
- Fragment tête
- AH
- ESP
- Options de destination
- Tête de mobilité
- TCP/UDP/ICMPv6
Notez que cette liste est «recommandé», mais pas obligatoire. Un hôte IPv6 doit être capable de traiter les en-têtes de ce que jamais l'ordre de leur réception. Cela signifie que vous trouverez probablement fournisseurs suivants cette liste, mais pas les attaquants. J'ai personnellement vu des dispositifs de commencer à agir vraiment bizarre quand vous salir avec l'ordre d'en-tête. En fait j'ai couru à travers un peu de "code compatible IPv6", qui ne peut pas traiter si l'ordre de préférence n'est pas utilisé.
Chasing l'entête du protocole
Donc, avec l'IPv6 que nous pouvons avoir plusieurs en-têtes derrière la tête IPv6. Si cela ressemble à un nouveau concept, il n'est pas réellement. En fait, vous avez probablement déjà travaillé avec elle. Lorsque vous déployez les deux protocoles IPSec de sécurité possibles sont ESP et AH. Il s'agissait en fait empruntée à l'IPv6 et massé à travailler sur IPv4. AH et ESP inclure un champ d'en-tête suivante pour identifier ce type de paquet, ils sont protecting.This est appelée chaînage du protocole, comme vous avez effectivement plusieurs en-têtes assis derrière l'en-tête du protocole de couche 3.
Donc, pour comprendre ce que le transport de niveau supérieur (TCP, UDP, etc) est utilisé, vous pouvez avoir à chercher dans plusieurs en-têtes avant de trouver la réponse. Ceci est appelé «chassant l'en-tête", et tcpdump / WinDump nous donner une option de filtre pour effectuer cette tâche. Vous pouvez être fimiliar avec le filtre proto. Dans le monde IPv4, si je dis:
ip proto tcp
Ce filtre se lit «chèque octet 9 de l'en-tête IPv4 et si la valeur est égale à 6 (valeur de protocole pour TCP), un match sur le paquet". Ce filtre n'est pas aussi efficace dans le monde IPv6, bien sûr, car l'octet 6 de l'en-tête IPv6 pourraient identifier le transport de la couche supérieure, ou il peut simplement identifier un en-tête d'extension optionnel qui est utilisé. Pour résoudre ce problème, le filtre protochain a été introduite. Rédaction:
ip6 protochain tcp
Se lit comme "Check octet 6 de l'en-tête IPv6 pour voir si la valeur est égale à 6. Si au contraire vous trouver une valeur qui identifie une tête d'extension en option, vérifiez le champ d'en-tête d'extension de tête suivant pour une valeur de 6. Si vous trouvez plus de têtes d'extension optionnelle, ne cesse de répéter le dernier test jusqu'à ce que vous trouver la tête de la dernière prolongation ».
Assez simple d'écrire en anglais, mais cela est un cauchemar pour mettre en œuvre dans le code. La plupart des têtes d'extension optionnels sont de longueur variable, qui ne fait qu'ajouter à la complexité. J'ai fait quelques tests avec Scapy et vous pouvez réellement voir la différence dans les performances lors de protochain est invoquée. En fait, vous pourriez probablement faire un bon travail de dosage un IDS / IPS en le forçant à traiter un grand nombre de têtes d'extension inutile.
Ecrire notre filtre
Donc, notre premier problème par écrit le filtre défi est que l'en-tête ICMPv6 peuvent ne pas apparaître immédiatement après l'en-tête IPv6. Nous devons nous méfier des têtes d'extension optionnelle. En fait RFC 2710 stipule: "Tous les messages MLD décrites dans ce document sont envoyés avec une adresse de lien local IPv6 source, une limite de 1 IPv6 Hop, et une option routeur IPv6 Alert [RTR-ALERT] dans un Hop-by-Hop tête Options ". Cela signifie que nos paquets Multicast Listener est nécessaire d'avoir une tête d'extension Hop-by-Hop avec l'option d'alerte du routeur. Dans cet esprit, notre première vérification devrait être:
ip6 protochain icmp6
Pour nous assurer que nous ne regardant paquets ICMPv6. Maintenant, il est juste une question de vérification pour voir si le champ Type (octet 0) est fixé à 130 (Multicast Listener Query) ou 131 (Multicast Listener Report). Ceci nous amène à notre second problème cependant. Dans le monde IPv4 je peux faire un:
ICMP [0] = valeur <type de interest>
Si j'essaie cela avec icmp6 j'obtiens:
[Root @ fubar ~] # tcpdump-nn icmp6 [0] = 130
tcpdump: IPv6 protocole de couche supérieure n'est pas supporté par proto [x]
En d'autres termes, je ne peux pas utiliser les compensations avec les icmp6 pour rechercher des valeurs spécifiques. WinDump et tcpdump sont annoncés comme compatibles avec IPv6, mais ne vous attendez pas à obtenir toutes les mêmes fonctionnalités que vous avez avec IPv4. Beurk!
Alors, que faisons-nous? Nous aurons à se replier sur le référencement de la valeur à partir d'un ip6 offset. En d'autres termes, nous aurons à mesurer à travers l'en-tête IPv6, à travers la nécessaire Hop-by-Hop-tête, et dans la tête ICMPv6 pour voir si le champ type est fixé à 130 ou 131. Certaines choses à prendre en considération:
- Tête IPv6 est fixé à 40 octets
- Hop-by-Hop-tête est variable, mais 4 octets avec Router Alert jeu
- Le champ type est de 0 octet dans l'en-tête ICMPv6
Alors voici ce que nous nous retrouvons avec:
ip6 protochain icmp6 et (ip6 [44] = 130 ou ip6 [44] = 131)
Ouf! Nous avons finalement eu! Ou avons-nous?
Q: Que faire si le paquet a-têtes d'extension supplémentaires?
R: Notre filtre ne fonctionnera pas.
Q: Que faire si l'entête Hop-by-Hop a plus d'options mis à Router Alert?
R: Notre filtre ne fonctionnera pas.
Q: Peut-on fixer les deux problèmes ci-dessus?
R: Non jusqu'au tcpdump / WinDump filtrage ajoute SI soutien boucle / THEN.
Donc, si nous voulons capturer le trafic ML normal, le filtre ci-dessus fonctionne parfaitement. Si toutefois nous voulons nous assurer que nous rattraper rouerie attaquant ainsi, le filtre ne va pas voler.
Que si nous essayons quelque chose comme ceci:
tcpdump-nn-s 1500-x ip6 protochain icmp6 | grep-i multidiffusion> multicast.txt
et ensuite il suffit d'utiliser l'outil Wireshark text2cap pour le convertir en format de Libpcap? Le problème ici est que nous ne recevoir que les informations d'en-tête. Grep va correspondre à la ligne de résumé, qui contient le mot «Multicast» mais ensuite sauter toutes les Hex-dessous de lui qui est le contenu réel du paquet.
Donc la réponse finale est: "Impossible d'obtenir à partir theyâ haya" ![]()
Alors que faire si vous avez vraiment besoin d'être en mesure de voir ce trafic? Jusqu'au support IPv6 arrive à maturité, la seule méthode 100% est de saisir l'ensemble du trafic ICMPv6 et ensuite trier manuellement à travers elle.
Du moins c'est mon avis à ce sujet. Si quelqu'un peut effectivement arriver à une solution de travail à 100%, je serais ravi de l'entendre.



