2012-08-01 19 views
7

Ich versuche, die HTTP-Header mit tcpdump zu schnüffeln.Understanding Tcpdump Filter & Bit-Maskierung

Diese Filter funktionieren gut, aber ich kann es nicht verstehen -

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

ich es gegoogelt habe, aber ich kann keine nützlichen Informationen

Hier finden ist der ganze tcpdump Befehl

sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

Antwort

15

Es ist nicht der BPF-Filter, der HTTP-Header erhält, aber der "-A" -Schalter Ihres tcpdump-Befehls.

Ihr tcpdump-Befehl sucht nach TCP-Verkehr zu einem bestimmten Ziel oder von einer bestimmten Quelle auf eth0, wo der endgültige BPF-Filter eine Berechnung beinhaltet, die zu einer Summe ungleich Null führt. Mit der Option "-A" wird jedes Paket in ASCII ohne den Link-Level-Header gedruckt.

Ich habe die Berechnung unten erklärt, aber ich glaube, es gibt einige Probleme im eigentlichen Filter, möglicherweise durch Kopieren und Einfügen. Wenn Sie diese Filter in tcpdump verwenden, verwenden Sie tcp Bit-Maskierung, die in der Regel verwendet, wenn Felder untersuchen, die auf Byte-Grenzen fallen nicht

  • ip[2:2] auf die beiden Bytes bezieht (dh 3. & 4. Byte) im IP-Header, beginnend bei Byte 2 (erinnern Sie sich, dass es bei Offset 0 beginnt). Diese Summe repräsentiert die Gesamtlänge des IP-Pakets, die maximal 65535 Bytes betragen kann.

Für die bitmask hier für Klarheit, ich habe eine '0' so vorgehängten Maske 0xf0x0f wird. Die führende "0" auf der Maske wird gemäß dem Kommentar von GuyHarris unten fallen gelassen.

  • ip[0]&0x0f bezieht sich auf die zweite Hälfte des Bytes 0 (dh das 1. Byte) im IP-Header, der die IP-Header-Länge in 32-Bit-Worten und als solche geben, dies in der Regel mit 4 multipliziert wird eine solche Berechnung.

  • tcp[12]&0xf0) bezieht sich auf die erste Hälfte von Byte 12 (dh das elfte Byte), das Datenoffsetfeld, das die Größe des TCP-Headers in 32-Bit-Wörtern angibt und als solches typischerweise mit multipliziert wird 4 für eine solche Berechnung.

Sie müssen die letzten 2 Längen von 4 multiplizieren, weil sie 32-Bit/4-Byte-Worte sind und so muss für die Berechnung in Bytes auf insgesamt übersetzt werden als richtig

Ihre Filter sollen Berechnung:

  • Die Paketlänge IP (in Byte) - Die IP-Header-Länge - Die TCP-Header-Länge

und für diesen Wert werden sucht zie ro, das heißt so etwas wie dieses

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

Wenn Sie die Subtraktion durchführen, Sie suchen einen von Null insgesamt.Diese von Null verschiedene Summe bedeutet, dass Daten über der Schicht 4 vorliegen, d. H. Daten in der tcp-Nutzlast, typischerweise Anwendungsverkehr.

Sie können auch port 80 unter der Annahme, die meisten HTTP-Verkehr-Port ist über 80 Jahre ist

Ein solcher Filter häufig von Sicherheits Folk zum Hinzufügen von Daten auf einem SYN zu erkennen, die nicht normal ist, aber die RFCs nach, es ist erlaubt. so würde das Ganze in etwa so aussehen -

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide ist ein sehr guter, kostenloser Online-Guide auf TCP/IP btw.

Aktualisiert: Ändern Sie die ‚führende Null‘ Abschnitt auf der Bit-Maske nach dem Update von Guy Harris.

+1

'0x0f' und' 0xf' dasselbe sind; führende Nullen können in Hex-Werten weggelassen werden. Der Code könnte jedoch * deutlicher * lesen, wenn die führenden Nullen jedoch vorhanden sind. Das "<< 2" ist das gleiche wie "* 4"; das '>> 2' ist jedoch'/2' (dividiere durch 2), was falsch ist - es ist wahrscheinlich ein Tippfehler. –

+1

Vielen Dank sehr umfassende Antwort! – kingasmk

+1

@GuyHarris thx, ich war nicht sicher, ob die führende Null gelöscht wurde, also dachte ich nur, ich würde meinen Kommentar aus Gründen der Klarheit einfügen. Da ">> 2" dasselbe ist wie "* 4", habe ich es einfach aus '' 2 ''geändert, da' * 4 'ziemlich klar ist und es für notwendig hielt, den Unterschied der Werte zu erklären (32 -Bit Wörter gegen Bytes), und Zweifel um den ''2' Tippfehler zu entfernen. –