Einführung
Willkommen zum Lab über Berkeley Packet Filters (BPF)!
Stellen Sie sich vor, Sie versuchen, ein einziges, spezifisches Gespräch in einem überfüllten, lauten Stadion zu finden. Genau so fühlt es sich an, rohen Netzwerkverkehr zu analysieren. Ein ausgelasteter Server kann Tausende von Paketen pro Sekunde verarbeiten. Um die spezifischen Daten zu finden, die Sie benötigen, brauchen Sie ein hochpräzises Sieb.
Hier kommen Berkeley Packet Filters (BPF) ins Spiel. BPF ist eine tief integrierte, hocheffiziente Technologie, die es Ihnen ermöglicht, Regeln festzulegen – wie ein spezialisiertes Fischernetz –, um nur den Netzwerkverkehr einzufangen, der Sie wirklich interessiert, während der Rest unbemerkt vorbeiziehen kann.
Der wichtige Punkt ist, dass Filtern nicht nur eine Frage der Bequemlichkeit ist. Es geht darum, das Rauschen zu reduzieren, bevor es zu einem Problem wird. Ohne Filter wird die Paketanalyse schnell zu einer Informationsüberflutung. Mit Filtern können Sie einen riesigen, chaotischen Datenstrom in eine fokussierte Fragestellung verwandeln, wie zum Beispiel: „Zeige mir den Datenverkehr von diesem Host“ oder „Zeige mir nur Webanfragen an diesen Port“. Diese Fähigkeit ist einer der Hauptgründe, warum tcpdump selbst in großen Produktionsumgebungen unverzichtbar bleibt.
In diesem Lab verwenden Sie tcpdump, um das Schreiben dieser BPF-Regeln zu üben. Sie lernen, wie Sie den chaotischen Netzwerkstrom nach spezifischen IP-Adressen filtern, die Richtung des Datenverkehrs steuern (Senden vs. Empfangen) und gezielt bestimmte Anwendungsports ansprechen. Am Ende werden Sie wissen, wie Sie diese Regeln kombinieren, um chirurgisch genau die Ereignisse zu extrahieren, die Sie benötigen.
Filtern nach IP-Adresse (Host/Netzwerk)
Die grundlegendste Art, Datenverkehr zu filtern, besteht darin, sich auf eine bestimmte Maschine zu konzentrieren, die durch ihre IP-Adresse identifiziert wird. Wenn Sie tcpdump ohne Filter ausführen, erfasst es unerbittlich jedes Paket, das es sieht. Um dem Programm mitzuteilen, dass es alles ignorieren soll, außer dem Datenverkehr, der eine bestimmte Maschine betrifft, verwenden Sie das Schlüsselwort host, gefolgt von der IP-Adresse.
Dies ist ein guter Moment, um zwei Konzepte zu trennen, die Anfänger oft verwechseln: Eine Schnittstelle (Interface) ist der Ort, an dem Sie zuhören, während ein IP-Filter beschreibt, welche Gespräche Sie von diesem Abhörpunkt aus interessieren. Mit anderen Worten: -i lo bestimmt, wo Ihr Mikrofon platziert ist, und host 127.0.0.1 bestimmt, welchen Sprecher im Raum Sie hören möchten.
Um sicherzustellen, dass wir Datenverkehr beobachten können, läuft bereits ein Hintergrundskript in Ihrer Umgebung. Es sendet kontinuierlich Daten an Ihre lokale Maschine, die immer die interne IP-Adresse 127.0.0.1 (auch bekannt als localhost) hat.
Lassen Sie uns 5 Pakete erfassen, die diesen lokalen Host betreffen. Wir verwenden -i lo, um auf der lokalen Loopback-Schnittstelle zu lauschen, und -c 5, um den Vorgang automatisch zu beenden.
Führen Sie den folgenden Befehl in Ihrem Terminal aus:
sudo tcpdump -i lo -c 5 host 127.0.0.1
Ihr Bildschirm zeigt eine Ausgabe ähnlich dieser:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:15:32.123456 IP localhost.45678 > localhost.http-alt: Flags [S], seq 123456789, win 65495, options [mss 65495,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
10:15:32.123489 IP localhost.http-alt > localhost.45678: Flags [S.], seq 987654321, ack 123456790, win 65483, options [mss 65495,sackOK,TS val 123456 ecr 123456,nop,wscale 7], length 0
10:15:32.124000 IP localhost > localhost: ICMP echo request, id 1234, seq 1, length 64
...
5 packets captured
Beachten Sie, dass in jedem aufgelisteten Paket localhost (der freundliche Name für 127.0.0.1) vorhanden ist. Der host-Filter ist sehr umfassend: Er erfasst das Paket unabhängig davon, ob die angegebene IP-Adresse die Daten gesendet oder empfangen hat.
Wenn Sie jemals eine ganze Nachbarschaft von Computern überwachen müssen, anstatt nur ein einzelnes Haus, können Sie das Schlüsselwort host durch net ersetzen (zum Beispiel net 192.168.1.0/24). Für den Moment bleiben wir bei der Untersuchung unseres einzelnen Hosts.
Filtern nach Richtung (Quelle/Ziel)
Zu wissen, dass ein bestimmter Computer an einem Gespräch beteiligt ist, ist hilfreich, aber manchmal benötigen Sie mehr Präzision. Stellen Sie sich ein Postamt vor: Sie möchten vielleicht nur die Briefe sehen, die eine Person versendet, und die Briefe, die sie empfängt, komplett ignorieren.
Die Richtung ist wichtig, da Sende- und Empfangsverkehr oft unterschiedliche investigative Fragen beantworten. Ausgehender Datenverkehr kann aufdecken, was ein Host zu kontaktieren versucht, was nützlich ist, wenn man nach Malware-Callbacks oder Datenexfiltration sucht. Eingehender Datenverkehr kann aufdecken, welche Dienste angegriffen werden, was bei der Untersuchung von Scans oder Angriffen auf einen Server hilfreich ist.
BPF bietet Ihnen die Modifikatoren src (Quelle) und dst (Ziel), um die genaue Richtung des Datenverkehrs festzulegen.
Lassen Sie uns unseren Filter verfeinern, um nur die Pakete zu erfassen, die von 127.0.0.1 stammen. Durch die Kombination des src-Modifikators mit unserem vorherigen host-Schlüsselwort sagen wir tcpdump genau, wonach es suchen soll.
Führen Sie den folgenden Befehl aus:
sudo tcpdump -i lo -c 3 src host 127.0.0.1
Ein kleiner Tipp: src 127.0.0.1 zu schreiben funktioniert ebenfalls, da das Wort host implizit angenommen wird. Es als src host auszuschreiben, gilt jedoch als bewährte Methode, da es Ihren Befehl unglaublich leicht lesbar macht.
Ihre Ausgabe wird so aussehen:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:20:15.555111 IP localhost.54321 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 234567 ecr 234567], length 84
10:20:15.555888 IP localhost.http-alt > localhost.54321: Flags [.], ack 85, win 512, options [nop,nop,TS val 234568 ecr 234567], length 0
10:20:16.111222 IP localhost > localhost: ICMP echo request, id 5678, seq 1, length 64
3 packets captured
Wenn Sie sich die Ausgabe genau ansehen, stellt der erste Teil der Paketbeschreibung (der Abschnitt vor dem >-Symbol) den Absender (Quelle) dar. Da wir auf der internen Loopback-Schnittstelle erfassen, steht auf beiden Seiten localhost. In einem realen Szenario, das mehrere Computer umfasst, garantiert src jedoch, dass Sie nur den ausgehenden Datenverkehr von dieser spezifischen Adresse sehen.
Wenn Sie umgekehrt als Empfänger agieren und nur den eingehenden Datenverkehr beobachten möchten, der auf der Maschine ankommt, würden Sie einfach dst host 127.0.0.1 verwenden.
Filtern nach Port und Protokoll
Das Filtern nach IP-Adressen bringt uns zur richtigen Maschine, aber moderne Server führen viele Aufgaben gleichzeitig aus. Ein einzelner Server kann gleichzeitig als Webserver, E-Mail-Server und sicherer Zugangspunkt fungieren. Diese verschiedenen Dienste werden durch nummerierte „Türen“, sogenannte Ports, voneinander getrennt gehalten.
Ports sind keine physischen Anschlüsse. Es sind logische Nummern, die vom Betriebssystem verwendet werden, um viele Gespräche gleichzeitig getrennt zu halten. Deshalb bedeutet „gleicher Host“ nicht unbedingt „gleiche Anwendung“. Eine Maschine kann an vielen unabhängigen Netzwerkaktivitäten beteiligt sein, und die Port-Filterung hilft Ihnen, genau den Dienst zu isolieren, den Sie untersuchen möchten.
Zum Beispiel fließt regulärer Webverkehr fast immer über Port 80. Um einen bestimmten Dienst zu fokussieren und den Rest zu ignorieren, verwenden wir das Schlüsselwort port.
Unser Hintergrundskript generiert im Stillen Webverkehr auf Port 8080. Lassen Sie uns tcpdump so konfigurieren, dass nur die Daten erfasst werden, die durch diese spezifische Tür fließen.
Führen Sie den folgenden Befehl aus:
sudo tcpdump -i lo -c 4 port 8080
Beispielausgabe:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:25:10.123456 IP localhost.34567 > localhost.http-alt: Flags [S], seq 1122334455, win 65495, options [mss 65495,sackOK,TS val 345678 ecr 0,nop,wscale 7], length 0
10:25:10.123489 IP localhost.http-alt > localhost.34567: Flags [S.], seq 5544332211, ack 1122334456, win 65483, options [mss 65495,sackOK,TS val 345678 ecr 345678,nop,wscale 7], length 0
10:25:10.123501 IP localhost.34567 > localhost.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 345678 ecr 345678], length 0
10:25:10.124111 IP localhost.34567 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 345679 ecr 345678], length 84
4 packets captured
Vielleicht erinnern Sie sich aus früheren Schritten, dass ICMP-Pakete (Ping) vorhanden waren. In dieser Ausgabe gibt es jedoch absolut keine Anzeichen dafür. Der Filter port 8080 hat erfolgreich alles irrelevante Geplapper ignoriert und eine saubere Sicht nur auf den Webdienst ermöglicht.
Zusätzlich zu Ports können Sie auch direkt nach dem allgemeinen Netzwerkprotokoll filtern, indem Sie es einfach benennen, z. B. mit Schlüsselwörtern wie tcp, udp oder icmp. Lassen Sie uns dies testen, indem wir nur die ICMP-Pakete (Ping) erfassen und den geschäftigen Webverkehr effektiv ignorieren.
Führen Sie diesen Befehl aus:
sudo tcpdump -i lo -c 2 icmp
Beispielausgabe:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:05.999111 IP localhost > localhost: ICMP echo request, id 9012, seq 1, length 64
10:28:05.999133 IP localhost > localhost: ICMP echo reply, id 9012, seq 1, length 64
2 packets captured
Die Verwendung von port und Protokoll-Schlüsselwörtern ermöglicht es Ihnen, das Rauschen zu durchschneiden und sich genau auf die Anwendung zu konzentrieren, die Sie untersuchen möchten.
Kombinieren von Filtern mit Logik (AND/OR)
Um Berkeley Packet Filters wirklich zu meistern, müssen wir lernen, wie man mehrere Regeln miteinander kombiniert. Untersuchungen in der Praxis sind selten einfach; oft müssen Sie hochspezifische Szenarien definieren.
Hier beginnt BPF sich weniger wie eine Liste von Schlüsselwörtern und mehr wie eine kleine Abfragesprache für Pakete anzufühlen. Sie beschreiben den gewünschten Datenverkehr auf eine strukturierte, logische Weise. Später im Kurs wird diese Denkweise in vielen Tools wieder auftauchen: SIEM-Suchen, Intrusion-Detection-Regeln und sogar datenbankähnliche Log-Abfragen basieren alle auf der gleichen Gewohnheit, einen breiten Datensatz auf eine präzise Bedingung einzugrenzen.
BPF ermöglicht es Ihnen, Bedingungen mit Standard-Logikoperatoren zu verknüpfen:
and(beide Regeln müssen wahr sein)or(mindestens eine Regel muss wahr sein)not(die Regel muss explizit falsch sein)
Ein wichtiger Tipp: Wenn Sie solche logischen Operatoren im Linux-Terminal verwenden, ist es eine sehr gute Angewohnheit, Ihren gesamten BPF-Ausdruck in Anführungszeichen zu setzen (wie "port 80 and tcp"). Dies stellt sicher, dass die Linux-Shell Ihre Filterbefehle nicht versehentlich mit Systembefehlen verwechselt.
Lassen Sie uns das testen. Wir möchten Datenverkehr erfassen, der strikt das TCP-Protokoll verwendet und aktiv an den Zielport 8080 gerichtet ist.
Führen Sie den folgenden Befehl aus:
sudo tcpdump -i lo -c 4 "tcp and dst port 8080"
Beispielausgabe:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:32:15.111222 IP localhost.45678 > localhost.http-alt: Flags [S], seq 2233445566, win 65495, options [mss 65495,sackOK,TS val 456789 ecr 0,nop,wscale 7], length 0
10:32:15.111255 IP localhost.45678 > localhost.http-alt: Flags [.], ack 3344556678, win 512, options [nop,nop,TS val 456789 ecr 456789], length 0
...
4 packets captured
In diesem maßgeschneiderten Ergebnis erscheint localhost.http-alt nur auf der rechten Seite des >-Pfeils, was beweist, dass wir nur Pakete erfasst haben, die für genau diesen Port bestimmt waren.
Schauen wir uns abschließend den not-Operator an. Er ist unglaublich nützlich, um das „bekannte Rauschen“ herauszufiltern, damit Sie sich auf das Unbekannte konzentrieren können. Stellen Sie sich vor, wir möchten den gesamten Datenverkehr auf der Loopback-Schnittstelle überwachen, außer unserem lauten Webverkehr auf Port 8080.
Führen Sie diesen Befehl aus:
sudo tcpdump -i lo -c 2 "not port 8080"
Beispielausgabe:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:22.333444 IP localhost > localhost: ICMP echo request, id 3456, seq 1, length 64
10:35:22.333466 IP localhost > localhost: ICMP echo reply, id 3456, seq 1, length 64
2 packets captured
Da wir tcpdump explizit angewiesen haben, Port 8080 aus den Ergebnissen zu verbannen, hat es stattdessen friedlich die zugrunde liegenden ICMP-Ping-Pakete im Hintergrund erfasst. Durch die strategische Verknüpfung von and, or und not können Sie eine unglaublich präzise Linse schmieden, um genau das zu sehen, was Sie in jedem Netzwerk benötigen.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben erfolgreich den ersten Schritt in die Welt der fortgeschrittenen Paketfilterung gemacht.
Sie haben gelernt, wie man einen chaotischen Netzwerkstrom durchsiebt, um genau das zu finden, was man braucht. Sie haben geübt, spezifische Computer mit dem host-Schlüsselwort anzusprechen und die Flussrichtung mit src und dst zu steuern. Sie haben bestimmte Anwendungen isoliert, indem Sie nach einem eindeutigen port und Protokoll gefiltert haben. Am wichtigsten ist, dass Sie gelernt haben, all diese einzelnen Teile mithilfe logischer Operatoren (and, or, not) zu kombinieren, um chirurgisch präzise und hochspezifische Suchanfragen zu erstellen.
Diese Fähigkeiten sind unverzichtbar. Egal, ob Sie ein Systemadministrator sind, der eine unerwünschte Verbindung aufspürt, oder ein Sicherheitsanalyst, der einen raffinierten Angriff verfolgt: Die Beherrschung von Berkeley Packet Filters stellt sicher, dass Sie nie wieder vom Rauschen des Netzwerks überwältigt werden. Experimentieren Sie weiter mit verschiedenen Kombinationen!

