De uitdaging was: "Schrijf een tcpdump / WinDUMP filter dat zal vast te leggen ICMPv6 Multicast Listener pakketten." Ik heb een uitgebreide up te schrijven over wat het antwoord zo complex. Als u weet dat IPv6 en wil gewoon het antwoord, ga dan naar het einde.
Eerst een paar Achtergrond
Steinar een aantal opmerkingen van de vorige posts en was 100% op schema. 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 opties veld. Dit kan ertoe leiden dat de IP-header om van 20 bytes groeien zo groot als 60 bytes groot. Met IPv6 er niet langer een opties veld en de header wordt vastgesteld op 40 bytes in grootte. Bij opties nodig zijn, gebruiken we 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 niveau transport (TCP, UDP, enz.). Met IPv6 de volgende header veld (byte 6) kunnen identificeren van de bovenste laag vervoer, of is het misschien een uitbreiding header die sommige aantal opties zal identificeren.
Hier is een lijst van een aantal IPv6-extensie headers u misschien in de, evenals de RFC's die hen te 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 heeft geen beperking van het aantal extensie 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
- Bestemming Opties
- Mobiliteit Header
- TCP/UDP/ICMPv6
Let op deze lijst wordt "aanbevolen", maar niet verplicht. Een IPv6-host moet in staat zijn om de headers te verwerken in wat ooit volgorde waarin ze zijn ontvangen. Dit betekent dat je waarschijnlijk vinden verkopers het volgen van deze lijst, maar niet aanvallers. Ik heb persoonlijk gezien apparaten te starten die echt vreemd als je knoeien met de kop bestelling. In feite heb ik lopen over heel wat van "IPv6-compatibele code", die niet om kan gaan als de gewenste volgorde niet wordt 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 implementeren IPSec de twee mogelijke veiligheidsprotocollen zijn ESP en AH. Deze waren eigenlijk geleend van IPv6 en gemasseerd om te werken aan IPv4. Zowel AH en ESP zijn onder andere een volgende header veld te identificeren welk type packet ze protecting.This wordt aangeduid als protocol koppelen, als u effectief meerdere koppen zitten achter de laag 3 protocol header.
Dus om erachter te komen wat bovenste niveau transport (TCP, UDP, enz.) wordt gebruikt, kan het nodig zijn om te zoeken door meerdere headers voordat u het antwoord vinden. 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 leest "controleer byte 9 van de IPv4-header en als de waarde gelijk is aan 6 (protocol waarde voor TCP), passen op de verpakking". Dit filter is niet zo effectief in de IPv6-wereld natuurlijk door byte 6 van de IPv6-header kan de bovenste laag vervoer te identificeren, of het misschien gewoon te identificeren een optionele uitbreiding header die wordt gebruikt. Om dit probleem op te lossen, werd de protochain filter geïntroduceerd. Schrijven:
IP6 protochain tcp
Leest 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 u de uitbreiding header's volgende header veld voor een waarde van 6. Als u 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 uit te voeren in de 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 wel een redelijk goede baan van het doseren van een IDS / IPS door het te dwingen om veel nutteloze uitbreiding headers te verwerken.
Het schrijven van onze filter
Dus onze eerste probleem bij het schrijven de uitdaging filter is dat de ICMPv6 kop niet recht achter de IPv6-header. We moeten oppassen voor optionele uitbreiding headers. In feite RFC 2710 stelt: "Alle MLD berichten beschreven in dit document worden verstuurd met een link-local IPv6-adres Bron, 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 vereist om een hop-by-Hop uitbreiding header met de router Alert optie is ingesteld. Met dit in gedachten, zou onze eerste controle zijn:
IP6 protochain icmp6
Om ervoor te zorgen we alleen kijken naar ICMPv6 pakketten. Nu is het gewoon een kwestie van controleren om te zien of het type gebied (byte 0) is ingesteld op 130 (Multicast Listener Query) of 131 (Multicast Listener-rapport). Dit brengt ons echter naar onze tweede probleem. In het IPv4-wereld die ik kan doen:
icmp [0] = <typ hier waarde van interest>
Als ik probeer dit met icmp6 krijg ik:
[Root @ Fubar ~] # tcpdump-nn icmp6 [0] = 130
tcpdump: IPv6 bovenste 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 moeten terug te vallen op dat verwijst naar de waarde van offset een ip6. Met andere woorden, zullen we moeten 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 4 bytes met router Alert ingesteld
- 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)
Oef! We hebben eindelijk heb het! Of hebben wij?
Q: Wat gebeurt er als het pakket heeft extra uitbreiding headers?
A: Onze filter zal niet werken.
V: Wat 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 bovengenoemde problemen?
A: Niet tot tcpdump / WinDUMP filtering voegt als / dan loop ondersteuning.
Dus als we willen normale ML verkeer vast te leggen, zal de bovenstaande filter 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 maken van text2cap programma Wireshark's te converteren naar formaat libpcap? Het probleem hier is dat we zullen alleen maar de header info. Grep zal de samenvatting lijn die het woord "Multicast" bevat dan overeenkomen met maar sla alle Hex eronder dat is de werkelijke inhoud van het zakje.
Dus het definitieve antwoord is: "Kan niet theyâ krijgen van haya" ![]()
Dus wat als je echt moet kunnen om dit verkeer te zien? Tot ondersteuning voor IPv6 rijpt, de enige 100% methode is om alle ICMPv6 het verkeer te grijpen en vervolgens handmatig sorteren doorheen.
Tenminste, dat is mijn mening op dit punt. Als iemand daadwerkelijk kan komen met een 100% werkende oplossing, ik zou het graag horen.



