La sfida è stata: "Scrivere un tcpdump / windump filtro che cattura pacchetti ICMPv6 Multicast Listener." Ho un ampio scrivere su ciò che rende la risposta così complessa. Se conosci IPv6 e vogliono solo la risposta, andare alla fine.
In primo luogo, alcuni di fondo
Steinar fatto alcuni commenti al post precedenti ed è stata del 100% in pista. Se le leggi e pensato "Wow, che suona davvero disordinato", si capisce la portata del problema pure. ![]()
Protocollo vs. Intestazione campo successivo
Con IPv4 abbiamo avuto il campo delle opzioni. Ciò potrebbe causare l'intestazione IP di crescere da 20 byte a grande come 60 byte di dimensione. Con IPv6, non c'è più un campo di opzioni e l'intestazione è di 40 byte di dimensione. Quando le opzioni sono necessari, usiamo le intestazioni di estensione per identificarli. Questo getta una palla interessante curva a noi perché con il campo protocollo IPv4 (byte 9) sarebbe (quasi) sempre identificare il trasporto di livello superiore (TCP, UDP, ecc.) Con IPv6 il campo di intestazione successivo (byte 6) potrebbe identificare il trasporto strato superiore, o potrebbe identificare un'intestazione di estensione che includerà un certo numero di opzioni.
Ecco un elenco di alcune intestazioni di estensione IPv6 si potrebbe incorrere in, così come la RFC che li definiscono:
| Opzione # | Opzione Descrizione | RFC |
| 0 | Hop-by-hop | 2460 |
| 6 | TCP | 793 |
| 17 | UDP | 768 |
| 43 | Routing | 5095 |
| 44 | Frammentazione | 2460 |
| 50 | ESP | 4303 |
| 51 | AH | 4302 |
| 58 | ICMPv6 | 4443 |
| 59 | Nessun colpo di testa successivo | 2460 |
| 60 | Destinazione delle opzioni | 2460 |
| 135 | Mobilità | 3775 |
IPv6 non limita il numero di intestazioni di estensione è possibile utilizzare in un packet.There singolo pubblicato è comunque un "ordine consigliato" di come le intestazioni dovrebbe essere steso. L'ordine è il seguente:
- IPv6 Header
- Hop-by-Hop Options
- Routing Header
- Fragment Header
- AH
- ESP
- Opzioni di destinazione
- Mobilità Header
- TCP/UDP/ICMPv6
Nota che questa lista è "raccomandato", ma non obbligatorio. Un host IPv6 deve essere in grado di elaborare le intestazioni in quello che mai nell'ordine in cui sono state ricevute. Questo significa che probabilmente troverete fornitori seguendo questa lista, ma non gli aggressori. Ho visto personalmente i dispositivi cominciare ad agire veramente strano quando si fa confusione con l'ordine di intestazione. In realtà ho imbattuto in un bel po 'di "codice IPv6 compatibile" che non può trattare se l'ordine preferito non viene utilizzato.
Chasing L'intestazione protocollo
Così, con IPv6 possiamo avere più intestazioni dietro l'intestazione IPv6. Se questo suona come un nuovo concetto, non è in realtà. In realtà probabilmente avete già lavorato con lui. Quando si distribuisce IPSec i due protocolli di sicurezza possibili sono ESP e AH. Questi sono stati effettivamente presi in prestito da IPv6 e massaggiato per lavorare su IPv4. Sia AH ed ESP comprende un campo accanto intestazione per identificare il tipo di pacchetto sono protecting.This viene indicato come concatenamento protocollo, come effettivamente hanno più intestazioni seduto dietro l'intestazione di livello 3 del protocollo.
Quindi, per capire cosa di trasporto di livello superiore (TCP, UDP, ecc) è in uso, potrebbe essere necessario cercare attraverso più intestazioni prima di trovare la risposta. Questo è denominato "inseguire l'intestazione" e tcpdump / windump ci danno un'opzione di filtro per eseguire questa operazione. Si può essere fimiliar con il filtro proto. Nel mondo IPv4, se dico:
ip proto tcp
Che filtrano legge "controllo byte 9 dell'intestazione IPv4 e se il valore è pari a 6 (valore protocollo TCP), incontro sul pacchetto". Questo filtro non è così efficace nel mondo IPv6, naturalmente, perché byte 6 dell'intestazione IPv6 potrebbe identificare il trasporto strato superiore, o potrebbe semplicemente identificare un header opzionale estensione che viene utilizzato. Per risolvere questo problema, il filtro protochain è stato introdotto. Di scrittura:
ip6 protochain tcp
Legge come "Verifica byte 6 dell'intestazione IPv6 per vedere se il valore è uguale a 6. Se invece si trova un valore che identifica un'intestazione opzionale estensione, verificare campo successivo colpo di testa l'intestazione di estensione per un valore di 6. Se si trova più intestazioni di estensione opzionale, continua a ripetere l'ultimo test fino a trovare l'intestazione ultima estensione ".
Abbastanza semplice da scrivere in inglese, ma questo è un incubo per implementare nel codice. Intestazioni di estensione più opzionali sono di lunghezza variabile che aggiunge solo per la complessità. Ho fatto alcuni test con Scapy e si può effettivamente vedere la differenza di prestazioni quando protochain viene invocato. In realtà probabilmente si potrebbe fare un buon lavoro di dosaggio un IDS / IPS, costringendola a processo un sacco di intestazioni di estensione inutile.
Scrittura nostro filtro
Quindi il nostro primo problema per iscritto il filtro sfida è che l'intestazione ICMPv6 potrebbero non apparire subito dopo l'header IPv6. Dobbiamo guardare fuori per le intestazioni di estensione opzionale. Infatti RFC 2710 afferma: "Tutti i messaggi MLD descritte in questo documento vengono inviati con un indirizzo link-local Fonte IPv6, un limite hop IPv6 pari a 1, e una opzione IPv6 Router Alert [RTR-ALERT] in un hop-by-hop Opzioni intestazione. "Questo significa il nostro pacchetto ascoltatore multicast è necessario per avere un hop-by-hop extension header con l'opzione router Alert. Con questo in mente, il nostro primo controllo deve essere:
ip6 protochain icmp6
Per garantire che stiamo solo guardando ICMPv6 pacchetti. Ora è solo una questione di controllo per vedere se il campo di tipo (byte 0) è impostato su 130 (Multicast Listener query) o 131 (Multicast Listener Report). Questo ci porta al nostro secondo problema però. Nel mondo IPv4 che posso fare un:
icmp [0] = valore <tipo di interest>
Se provo questo con icmp6 ottengo:
[Root @ fubar ~] # tcpdump-nn icmp6 [0] = 130
tcpdump: IPv6 protocollo dello strato superiore non è supportata dal proto [x]
In altre parole, non posso utilizzare gli offset con icmp6 per la ricerca di valori specifici. Windump e tcpdump sono pubblicizzati come IPv6 compatibili, ma non aspettatevi di ottenere le stesse funzionalità che hai con IPv4. YUCK!
Allora cosa facciamo? Dovremo ripiegare su riferimento al valore da un ip6 offset. In altre parole, dovremo misurare attraverso l'intestazione IPv6, attraverso la richiesta Hop-by-Hop intestazione, e nell'intestazione ICMPv6 per vedere se il campo tipo è impostato su 130 o 131. Alcune cose da tenere in considerazione:
- Header IPv6 è fissata a 40 byte di dimensione
- Hop-by-Hop intestazione è variabile, ma 4 byte con Router Alert set
- Il campo tipo è 0 byte all'interno dell'intestazione ICMPv6
Ecco quello che finisce con:
ip6 protochain icmp6 e (ip6 [44] = 130 o ip6 [44] = 131)
Caspita! Abbiamo finalmente capito! O abbiamo fatto?
D: Cosa succede se il pacchetto ha intestazioni di estensione aggiuntiva?
R: Il nostro filtro non funziona.
D: Cosa succede se il hop-by-Hop testata ha più possibilità di impostare Router Alert?
R: Il nostro filtro non funziona.
D: Possiamo risolvere questi due problemi?
R: Non fino a tcpdump / windump filtraggio aggiunge IF / THEN supporto del ciclo.
Quindi, se vogliamo catturare il traffico normale ML, il filtro sopra funziona bene. Se però vogliamo assicurare prendiamo accorgimenti attaccante così, il filtro non sta per volare.
Che cosa succede se proviamo qualcosa di simile:
tcpdump-nn s-1500-x ip6 protochain icmp6 | grep-i multicast> multicast.txt
e poi basta utilizzare lo strumento text2cap Wireshark per convertirlo in formato libpcap? Il problema qui è che sarà solo ottenere le informazioni di intestazione. Grep corrisponderà la linea di sintesi che contiene la parola "multicast", ma poi saltare tutte le Hex sotto di essa che è il contenuto effettivo del pacchetto.
Quindi la risposta finale è: "Impossibile ottenere theya da haya" ![]()
Che importa se si ha realmente bisogno per poter vedere questo traffico? Fino a quando il supporto per IPv6 matura, l'unico metodo 100% è quello di catturare tutto il traffico ICMPv6 e poi ordinare manualmente attraverso di essa.
Almeno questa è la mia opinione su questo. Se qualcuno può effettivamente trovare una soluzione di lavoro al 100%, mi piacerebbe sentire.



