2010-11-29 5 views
2

Ich verwende PCAP, um TCP-Pakete zu erfassen, für die ich die Nutzlast analysieren möchte. Meine Strategie ist wie folgt:So analysieren Sie TCP-Paket-Payload

  1. Ethernet-Header holen und prüfen, ob es ETHERTYPE_IP (IP-Paket)
  2. Überprüfen Sie, ob das Paket hat IPPROTO_TCP Protokoll IP hat Typ (TCP-Paket)
  3. prüfen Nutzlastgröße > 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header)).

  4. Parse-Nutzlast (die Host-URL greifen)

Ich habe nicht die Nutzlast Parsen nicht begonnen, weil ich Diskrepanzen immer bin. Unten ist ein Ausdruck der Nutzlast von 10 erfassten TCP-Paketen unter Verwendung des Filters "host = www.google.com".

Paketnummer: 3: TCP-Paket: Source Port: 80 Dest Hafen: 58723 Keine Daten in Paket

Paketnummer: 4: TCP-Paket: Source Port: 58723 Dest Hafen: 80 keine Daten in Paket

Paketnummer: 5: TCP-Paket: Source Port: 58723 Dest Hafen: 80 Nutzlast: GET/HTTP/1.1 Host: www.goo gle.com Benutzer-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-us) AppleWebKit/533.19.4 (KHTML, wie Gecko) Version/5.0.3 Safari/533.19.4 Akzeptieren: application/xml, application/xhtml + xml, text/html; q = 0.9, text/plain; q = 0.8, image/png, /; q = 0,5 Accept-Language: de-de Accept-Encoding: gzip, deflate Cookie: THICNT = 25; SID = DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v- Verbindung: Keep-Alive

Paketnummer: 6: TCP-Paket: Source Port: 80 Dest Hafen: 58723 Keine Daten in Paket

Paketnummer: 7: TCP Packet : Quellport: 80 Zielport: 58723 Nutzlast: \ 272 u \ 243 \ 255 \ 375 \ 375} \ 336H \ 221 \ 227 \ 206 \ 312 \ \ 322 \ 317N \ 236 \ 255A \ 343 # \ 226 \ 370 ֤ \ 245 [\ 327` \ 306 \ n \ 263 \ 204 \ 313 \ 356 \ 3268) p \ 344 \ 301_Y \ 255 \ 267 \ 240 \ 222x \ 364

Paketnummer: 8: TCP-Paket: Source Port: 58723 Dest Hafen: 80 Keine Daten in Paket

Paketnummer: 9: TCP-Paket: Source Port: 80 Dest Hafen: 58723 Nutzlast: HTTP/1.1 200 OK Datum: Mo, 29 Nov 2010 10:11:36 GMT Läuft ab: -1 Cache-Control: privat, max-age = 0 Content-Type: text/html; charset = UTF-8 Content-Encoding: gzip Server: gws Content-Länge: 8806 X-XSS-Schutz: 1; mode = block \ 213

Warum besteht eine Diskrepanz zwischen den Nutzdaten und den Ports? Idealerweise würde ich nur Pakete wie Paket 5 analysieren. Wie ignoriere ich Pakete wie 7 und 9?

+0

Es ist nicht klar, welchen Teil des Pakets Sie filtern möchten. Ich nehme an, es ist der Quell- oder Zielport. – sashang

+0

Ich möchte die Host-URL abrufen. Ich habe festgestellt, dass ich durch das Filtern von Paketen mit dem Ziel-Port 80 die Unerwünschten "aussortiere", aber was passiert, wenn jemand auf eine URL auf einem Nicht-Standard-Port zugreift? – David

+0

Zum Beispiel verschlüsseln ssh & ssl Daten. Diese Pakete würden wie die aussehen, die Sie nicht wollen. FWIW kann eine erhebliche Menge an Verkehr so ​​sein. Verwenden Sie einen regulären Ausdruck (regex.h), um Pakete auszuwählen - regcomp, regexec usw. Suchen Sie nach Paketen mit Blöcken lesbarer Zeichen. –

Antwort

6

Nur durch die Analyse von Inhalten. Nichts im IP- oder TCP-Header, was "HTTP Request" -Pakete kennzeichnen kann. Selbst "erstes Datenpaket in Verbindung" würde nicht funktionieren, da persistente Verbindungen existieren.

Um sicher zu sein, dass alle URIs abgefangen werden, müssen Sie den TCP-Stream erneut zusammensetzen und die HTTP-Anfrage analysieren: URI kann auf zwei oder mehr Pakete aufgeteilt werden.

2

Wie der IP-Header ist auch der TCP-Header variabler Länge. Sie berücksichtigen das nicht. Anstatt sizeof(struct tcp_header)) blind von der Gesamtpaketgröße zu subtrahieren, müssen Sie den TCP-Header innerhalb der IP-Daten suchen und dann sein Längenfeld verwenden (das wie das IP-Headerlängenfeld mit 4 multipliziert werden muss) tatsächliche Datennutzlast befindet sich.

2

Ihre Größe Berechnung ist falsch - Sie die Subtraktion in Netzwerk-Host-Order nicht tun können, müssen Sie jedes Feld konvertieren Host-Byte-Reihenfolge zuerst:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header)) 

jedoch als Remy Lebeau Punkte aus, müssen Sie tatsächlich das Feld offset im TCP-Header untersuchen, um zu wissen, wo die Payload startet.

Der Unterschied zwischen Paket 5 und 7 Paket ist, dass erstere von den Client wird, zu der Server und die letztere ist eine Antwort vom Server an den Client. Aus diesem Grund werden die Ports umgeschaltet - die Quell- und Zieladressen werden ebenfalls umgeschaltet.

Wenn Sie nur die vom Client eingehenden Pakete anzeigen möchten, überprüfen Sie, ob die Quelladresse der Adresse des Clients entspricht.

+0

danke, ich habe das in meinem Code geändert. – David

Verwandte Themen