De uitdaging was: "Schrijf een tcpdump / WinDUMP filter dat vast te leggen ICMPv6 Multicast Listener-pakketten." Ik heb een uitgebreide up schrijf op wat het antwoord zo complex. Als u weet dat IPv6 en wil gewoon het antwoord, ga dan naar het einde.
Eerst wat achtergrond
Steinar een aantal opmerkingen van de vorige palen en was 100% op het juiste spoor. Als je leest ze en dacht: "Wow, dat klinkt echt vies", begrijp je de omvang van het probleem ook. ![]()
Protocol Vs. Volgende Header Field
Met IPv4 hadden we de mogelijkheden veld. Dit kan ertoe leiden dat de IP-header om te groeien van 20 bytes naar zo groot als 60 bytes groot zijn. Met IPv6, is er niet langer een optie veld en de header is vastgesteld op 40 bytes groot. Als er opties nodig zijn, gebruiken we de uitbreiding headers om ze te identificeren. Dit werpt een interessante curve bal bij ons, omdat met het protocol IPv4 veld (byte 9) zou (bijna) altijd identificeren van de bovenste verdieping transport (TCP, UDP, etc.). Met IPv6 het volgende header veld (byte 6) kunnen identificeren van de bovenste laag transport, of het kan een uitbreiding header die enkele aantal opties zal identificeren.
Hier is een lijst van een aantal IPv6-extensie headers je zou tegenkomen, evenals de RFC's die ze definiëren:
| Optie # | Optie Beschrijving | RFC |
| 0 | Hop-by-Hop | 2460 |
| 6 | TCP | 793 |
| 17 | UDP | 768 |
| 43 | Routing | 5095 |
| 44 | Fragmentatie | 2460 |
| 50 | ESP | 4303 |
| 51 | AH | 4302 |
| 58 | ICMPv6 | 4443 |
| 59 | Geen volgende header | 2460 |
| 60 | Bestemming opties | 2460 |
| 135 | Mobiliteit | 3775 |
IPv6 is niet het aantal van de uitbreiding headers u kunt gebruiken in een enkele packet.There is echter een gepubliceerde "aanbevolen om" over hoe de headers moet worden aangelegd. De volgorde is:
- IPv6 Header
- Hop-by-Hop Options
- Routing Header
- Fragment Header
- AH
- ESP
- Destination Options
- Mobiliteit Header
- TCP/UDP/ICMPv6
Let op deze lijst is "aanbevolen", maar niet verplicht. Een IPv6-host moet in staat zijn om de headers proces wat ooit volgorde waarin ze zijn ontvangen. Dit betekent dat je waarschijnlijk leveranciers vindt naar aanleiding van deze lijst, maar niet aanvallers. Ik persoonlijk heb gezien apparaten beginnen met handelen echt vreemd als je knoeien met de kop bestelling. In feite heb ik lopen over heel wat van "IPv6-compatibele code" die niet kan omgaan als de gewenste volgorde wordt niet gebruikt.
Chasing Het protocol Header
Dus met IPv6 kunnen we meerdere koppen achter de IPv6-header. Als dit klinkt als een nieuw concept, is het eigenlijk niet. In feite hebt u waarschijnlijk gewerkt met het reeds. Wanneer u implementeert IPSec de twee mogelijke security protocollen zijn ESP en AH. Deze waren eigenlijk geleend van IPv6 en gemasseerd om te werken aan IPv4. Zowel de AH en ESP zijn een volgende header veld te bepalen welk type packet ze protecting.This wordt aangeduid als het protocol koppelen, als u effectief meerdere koppen zitten achter de laag 3 protocol header.
Dus om erachter te komen wat bovenverdieping transport (TCP, UDP, enz.) wordt gebruikt, kan je zoeken via meerdere headers voordat je het antwoord. Dit wordt aangeduid als "achter de header", en tcpdump / WinDUMP geven ons een filter optie om deze taak uit te voeren. U kunt fimiliar met de proto filter. In het IPv4-wereld, als ik zeg:
ip proto tcp
Dat filter staat "check byte 9 van de IPv4-header en als de waarde gelijk is aan 6 (protocol waarde voor TCP), wedstrijd op het pakket". Dit filter is niet zo effectief in de IPv6 wereld natuurlijk, omdat byte 6 van de IPv6-header kan de bovenste laag vervoer te identificeren, of het kan alleen maar identificeren een optionele uitbreiding header die wordt gebruikt. Om dit probleem oplossen, was de protochain filter geïntroduceerd. Schrijven:
IP6 protochain tcp
Luidt als "Controleer byte 6 van de IPv6-header om te zien of de waarde gelijk is aan 6. Als je in plaats daarvan vindt een waarde die een optionele uitbreiding header identificeert, controleert de uitbreiding header van de volgende header veld voor een waarde van 6. Als u vindt meer optionele uitbreiding koppen, blijf het herhalen van de laatste test totdat je de laatste uitbreiding header ".
Vrij eenvoudig om te schrijven in het Engels, maar dit is een nachtmerrie om te implementeren in code. De meeste optionele uitbreiding headers zijn variabel in lengte die net toevoegt aan de complexiteit. Ik heb gedaan wat testen met scapy en je kunt echt zien het verschil in prestaties wanneer protochain wordt ingeroepen. In feite kon je waarschijnlijk een vrij goed werk van de dosering een IDS / IPS door het te dwingen om veel nutteloze uitbreiding headers proces.
Het schrijven van onze filter
Dus onze eerste probleem bij het schrijven de uitdaging filter is dat de header ICMPv6 mogelijk niet goed weergegeven nadat de IPv6-header. We moeten oppassen voor optionele uitbreiding headers. In feite is RFC 2710 zegt: "Alle MLD berichten beschreven in dit document worden verzonden met een link-local IPv6-adres Source, een IPv6-Hop Limit van 1, en een IPv6-router Alert optie [RTR-ALERT] in een Hop-by-Hop Opties header. "Dit betekent dat onze luisteraar multicast-pakket is nodig om een Hop-by-Hop uitbreiding header met de router Alert optie hebben. Met dit in gedachten, moet onze eerste cheque:
IP6 protochain icmp6
Om ervoor te zorgen we alleen kijken naar ICMPv6 pakketten. Nu is het gewoon een kwestie van controleren om te zien als het type veld (byte 0) is ingesteld op 130 (Multicast Listener Query) of 131 (Multicast Listener Report). Dit brengt ons echter op onze tweede probleem. In het IPv4-wereld die ik kan doen een:
icmp [0] = <typ waarde van interest>
Als ik probeer dit met icmp6 krijg ik:
[Root @ Fubar ~] # tcpdump-nn icmp6 [0] = 130
tcpdump: IPv6 upper-layer protocol wordt niet ondersteund door proto [x]
Met andere woorden, kan ik niet gebruiken offsets met icmp6 om te zoeken naar specifieke waarden. WinDUMP en tcpdump worden aangeboden als IPv6-compatibel, maar verwacht niet dat alle dezelfde functionaliteit die je hebt met IPv4 te krijgen. YUCK!
Dus wat doen we? We zullen moeten terugvallen op verwijzing van de waarde van offset een ip6. Met andere woorden, moeten we meten door middel van de IPv6-header, door middel van de vereiste Hop-by-Hop header, en in de ICMPv6 header om te zien of het type veld is ingesteld op 130 of 131. Sommige dingen rekening te houden met:
- IPv6 header is vastgesteld op 40 bytes groot
- Hop-by-Hop header is variabel, maar vier bytes met router Alert set
- Het type veld is byte 0 binnen de ICMPv6 header
Dus hier is wat we eindigen met:
IP6 protochain icmp6 en (IP6 [44] = 130 of ip6 [44] = 131)
Whew! We hebben eindelijk het! Of hebben we?
Q: Wat gebeurt er als het pakketje heeft extra uitbreiding headers?
A: Onze filter zal niet werken.
Q: Wat gebeurt er als de Hop-by-Hop header heeft meer opties in te stellen dan de router Alert?
A: Onze filter zal niet werken.
Q: Kunnen we vast de twee bovenstaande problemen?
A: Niet tot tcpdump / WinDUMP filtering als / dan loop ondersteuning toevoegt.
Dus als we willen het normale ML verkeer vast te leggen, zal de bovenstaande filter prima werken. Als we echter willen verzekeren vangen we aanvaller lastige ook, wordt het filter niet van plan om te vliegen.
Wat gebeurt er als we proberen iets als dit:
tcpdump-nn-s 1500-x IP6 protochain icmp6 | grep-i multicast> multicast.txt
en dan gewoon gebruik van Wireshark text2cap hulpmiddel om het te converteren naar formaat libpcap? Het probleem hier is dat we zullen alleen maar de header info. Grep zal overeenkomen met de samenvatting lijn die het woord "Multicast" bevat, maar dan slaat u de Hex eronder dat is de feitelijke inhoud van het pakket.
Dus is het uiteindelijke antwoord is: "Kan niet theya krijgen van haya" ![]()
Dus wat als je echt nodig hebt om te kunnen dit verkeer te zien? Tot ondersteuning voor IPv6 rijpt, de enige 100% methode is om alle ICMPv6 verkeer te grijpen en vervolgens handmatig sorteren het.
Tenminste dat is mijn mening op dit punt. Als iemand daadwerkelijk kan komen met een 100% werkende oplossing, ik zou het graag horen.


