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 0xf
0x0f
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.
'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. –
Vielen Dank sehr umfassende Antwort! – kingasmk
@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. –