Utmaningen var: "Skriv en tcpdump / windump filter som kommer att fånga ICMPv6 Multicast Listener paket." Jag har en omfattande skriva upp vad som gör svaret så komplex. Om du känner till IPv6 och bara vill ha svaret, hoppa till slutet.
Först några Bakgrund
Steinar gjort en del kommentarer till tidigare inlägg och var 100% på rätt spår. Om du läser dem och tänkte "Wow, det låter som verkligen stökigt", förstår du omfattningen av problemet också. ![]()
Protokoll Vs. Nästa Header Field
Med IPv4 hade vi alternativen fältet. Detta kan leda till att IP-huvudet att växa från 20 byte till så stora som 60 byte i storlek. Med IPv6, finns det inte längre ett alternativ fält och rubriken är fastställt till 40 bytes i storlek. När alternativ behövs, använder vi förlängning rubriker att identifiera dem. Detta kastar ett intressant kurva boll på oss eftersom med IPv4-protokollet fältet (byte 9) skulle (nästan) alltid identifiera det övre planet transporter (TCP, UDP, etc.). Med IPv6 nästa rubrikfältet (byte 6) kan identifiera det övre lagret transporten, eller det kan identifiera en förlängning header som kommer att omfatta ett visst antal alternativ.
Här är en lista över några IPv6 förlängning rubriker du kan stöta på, liksom den RFC som definierar dem:
| Alternativ # | Alternativ Beskrivning | RFC |
| 0 | Hop-by-hop | 2460 |
| 6 | TCP | 793 |
| 17 | UDP | 768 |
| 43 | Routing | 5095 |
| 44 | Fragmentering | 2460 |
| 50 | ESP | 4303 |
| 51 | AH | 4302 |
| 58 | ICMPv6 | 4443 |
| 59 | Inga nästa rubrik | 2460 |
| 60 | Destination alternativ | 2460 |
| 135 | Rörlighet | 3775 |
IPv6 inte begränsa antalet anknytning rubriker du kan använda i en enda packet.There är dock en publicerad "rekommenderade ordningen" om hur rubriker ska läggas ut. Ordern är:
- IPv6-Header
- Hop-för-Hop Alternativ
- Routing Header
- Fragment Header
- AH
- ESP
- Destination Options
- Mobility Header
- TCP/UDP/ICMPv6
Observera att denna lista är "rekommenderade", men inte obligatoriskt. En IPv6-värd måste kunna bearbeta headers i vad någonsin ordning de mottogs. Detta innebär att du förmodligen kommer att finna leverantörer efter denna lista, men inte angripare. Jag har personligen sett enheter börja agera väldigt konstigt när du bråka med huvudet ordning. Faktum är att jag har stött på en hel del "IPv6-kompatibla kod" som inte kan hantera om önskad ordning inte används.
Chasing Protokollet Header
Så med IPv6 kan vi ha flera rubriker bakom IPv6-header. Om detta låter som ett nytt koncept, är det faktiskt inte. Faktum är att du har säkert jobbat med det redan. När du distribuerar IPSec de två möjliga säkerhet protokoll är ESP och AH. Dessa var faktiskt lånat från IPv6 och masseras att arbeta med IPv4. Både AH och ESP ingår ett nästa rubrikfältet för att identifiera vilken typ av paket det är protecting.This kallas protokoll kedja, som du faktiskt har flera huvuden sitter bakom lager 3-protokoll header.
Så för att räkna ut vad övre planet transporter (TCP, UDP, etc.) används, kan du behöva söka igenom flera rubriker innan du hitta svaret. Detta kallas "jaga huvudet", och tcpdump / Windump ge oss ett filter möjlighet att utföra denna uppgift. Du kan bli fimiliar med proto filtret. I IPv4-världen, om jag säger:
IP-proto tcp
Som filtrerar lyder "kontrollera byte 9 i IPv4-huvudet och om värdet är lika med 6 (protokoll värde för TCP), match på paketet". Detta filter är inte lika effektiva i IPv6 världen naturligtvis på grund byte 6 i IPv6-huvudet kan identifiera det övre lagret transport, eller det kanske bara hitta en frivillig förlängning rubrik som används. För att lösa detta problem var protochain filtret infördes. Skriva:
ip6 protochain tcp
Läser som "Kontrollera byte 6 i IPv6-huvudet för att se om värdet är lika med 6. Om du istället hitta ett värde som identifierar en frivillig förlängning sidhuvud, kolla förlängningen huvudet nästa rubrikfältet till ett värde av 6. Om du hittar fler frivillig förlängning rubriker, fortsätta att upprepa det senaste testet tills du hittar den senaste förlängningen header ".
Ganska enkelt att skriva på engelska, men detta är en mardröm att genomföra i koden. De flesta frivillig förlängning rubriker varierar i längd som bara ökar komplexiteten. Jag har gjort några tester med scapy och du kan faktiskt se skillnaden i prestanda när protochain får åberopas. Faktum är att du kan nog göra ett ganska bra jobb dosering en IDS / IPS genom att tvinga det att bearbeta en massa meningslösa förlängning rubriker.
Skriva våra filter
Så vår första problemet skriftligen utmaningen filtret är att ICMPv6 huvudet kanske inte visas direkt efter IPv6-header. Vi måste se upp för frivillig förlängning rubriker. I själva verket RFC 2710 säger: "Alla är MLD meddelanden beskrivs i detta dokument skickas med en länk-lokal IPv6 Source Adress, en IPv6-Hop gräns på 1 och en IPv6-router Alert alternativet [RTR-alert] i ett Hop-by-hop Alternativ huvudet. "Detta betyder att våra multicast lyssnaren paket är skyldig att ha en Hop-för-Hop förlängningen huvudet med routern Alert inställt. Med detta i åtanke bör vi först kontrollera att:
ip6 protochain icmp6
För att säkerställa att vi bara tittar på ICMPv6 paket. Nu är det bara en fråga om att kontrollera om den typ fältet (byte 0) är satt till 130 (Multicast Listener Query) eller 131 (Multicast Listener rapporten). Detta leder oss till vår andra problem dock. I IPv4-världen jag kan göra en:
ICMP [0] = <Skriv värde interest>
Om jag prova det här med icmp6 jag får:
[Root @ Fubar ~] # tcpdump-nn icmp6 [0] = 130
tcpdump: IPv6 övre skiktet protokollet stöds inte av proto [x]
Med andra ord kan jag inte använda offset med icmp6 att söka efter specifika värden. Windump och tcpdump annonseras som IPv6-kompatibla, men förvänta dig inte att få alla samma funktioner du har med IPv4. Usch!
Så vad gör vi? Vi har att falla tillbaka på att referera till värdet från en offset ip6. Med andra ord, vi måste mäta via IPv6 huvudet, genom den föreskrivna Hop-by-hop huvudet och in i ICMPv6 huvudet för att se om den typ är inställt på 130 eller 131. Några saker att beakta:
- IPv6-header är fastställt till 40 bytes i storlek
- Hop-för-Hop huvudet varierar, men är 4 byte med Router Alert som
- Den typ fältet är byte 0 i ICMPv6 header
Så här är vad vi sluta med:
ip6 protochain icmp6 och (ip6 [44] = 130 eller ip6 [44] = 131)
Puh! Vi fick äntligen det! Eller gjorde vi?
F: Vad händer om paketet har ytterligare förlängning rubriker?
A: Våra filter fungerar inte.
F: Vad händer om Hop-by-Hop huvudet har mer alternativ som än Router Alert?
A: Våra filter fungerar inte.
F: Kan vi fixa de två ovan nämnda problem?
A: Inte förrän tcpdump / Windump filtrering lägger IF / THEN loop support.
Så om vi vill fånga normal ML trafiken kommer ovan filtret fungerar bra. Men om vi vill försäkra vi fånga angripare trickiness också, är filtret kommer inte att flyga.
Vad händer om vi försöker så här:
tcpdump-nn-s 1500-x ip6 protochain icmp6 | grep-i multicast> multicast.txt
och sedan bara använda Wireshark är text2cap verktyg för att konvertera det till libpcap format? Problemet här är vi bara kommer att få huvudet info. Grep kommer att matcha huvudraden som innehåller ordet "multicast", men sedan hoppa över alla de Hex under det som är det faktiska innehållet i paketet.
Så det slutgiltiga svaret är: "Kan inte få theya från Haya" ![]()
Så vad händer om du verkligen behöver för att kunna se denna trafik? Fram till stöd för IPv6 mognar, är det enda 100% metod för att ta alla ICMPv6 trafik och sedan manuellt sortera igenom den.
Åtminstone det är min syn på detta. Om någon kan faktiskt komma med ett 100% fungerande lösning, jag skulle gärna höra den.



