Was ist ein Portscan?

Nachdem du die IP-Adresse des Untersuchungsobjekts ermittelt hast und weißt, dass es im Netzwerk aktiv ist, geht es darum, seine Netzwerkzugänge zu ermitteln. Dies geschieht mit einem Portscan.

Bei einem Portscan wird ein Gerät systematisch auf offene Ports untersucht. Ein Port gilt als offen, wenn eine Anwendung auf eingehende Nachrichten lauscht.

Ein Port wiederum ist eine numerische Adresse, die es ermöglicht, spezifische Anwendungen oder Dienste auf einem Computer im Netzwerk zu identifizieren und mit ihnen zu kommunizieren. Ports gehören zur Transportschicht und es gibt 65.535, die in zwei Kategorien unterteilt werden:

  • Well-known Ports (0-1023): Diese Ports sind standardmäßig bestimmten Diensten zugeordnet, wie z. B. Port 80 für HTTP und Port 443 für HTTPS.
  • Registered Ports (1024-49151) und Dynamic/Private Ports (49152-65535): Diese Ports können von Anwendungen dynamisch genutzt oder für benutzerdefinierte Dienste registriert werden.

In der Regel funktioniert ein Portscan so, dass ein Scanner bestimmte Nachrichten an alle oder eine Auswahl von Ports eines Hosts sendet und anhand der erhaltenen Antworten feststellt, ob diese Ports offen sind. Aus den Antworten des Zielgeräts lassen sich folgende Zustände ableiten:

  • Open (geöffnet): Eine Anwendung wartet aktiv auf eingehende Verbindungen auf diesem Port und kann diese akzeptieren. Offene Ports antworten auf eine Verbindungsanfrage.
  • Closed (geschlossen): Es lauscht keine Anwendung auf diesem Port. Daher werden keine Verbindungen akzeptiert.
  • Filtered (gefiltert): Es kann nicht festgestellt werden, ob der Port offen ist, da ein Paketfilter die Anfrage blockiert.
  • Unfiltered (ungefiltert): Die Anfrage wird nicht blockiert, jedoch kann nicht bestimmt werden, ob der Port offen oder geschlossen ist.

Die Nachrichten des Portscanners unterscheiden sich für die Protokolle der Transportschicht, da sie jeweils unterschiedliche Protokollmechanismen verwenden. Die wichtigsten Protokolle der Transportschicht sind TCP und UDP. Für diese beiden Protokolle werden wir uns den Portscan anschauen.

TCP-Portscan

TCP-Portscan mit Nmap

Steigen wir als Erstes direkt in den TCP-Portscan ein. Das ist mit Nmap einfach möglich mit

nmap <ip>

Standardmäßig scannt Nmap 1.000 der am häufigsten offenen TCP-Ports. Du kannst aber frei wählen, welche Ports gescannt werden sollen. Dafür gibt es in Nmap das Flag -p:

Befehl Erläuterung
nmap <ip> -p 80 Scannen eines einzelnen Ports
nmap <ip> -p 22,80 Scannen von mehreren Ports
nmap <ip> -p 1-99 Scannen eines Portbereichs
nmap <ip> -p- Scannen aller 65.535 Ports

Das Transmission Control Protocol (TCP)

Wie bestimmt Nmap nun den Zustand von TCP-Ports? Dafür sehen wir uns das TCP an.

Das Transmission Control Protocol (TCP) ist für eine verlässliche und verbindungsorientierte Übertragung von Daten zwischen Anwendungen auf verschiedenen Geräten in einem Netzwerk verantwortlich. Die Einheit von Daten, die vom TCP verarbeitet werden, wird als Segment bezeichnet.

Es gehört zur Transportschicht und basiert in der Regel auf dem Internet Protocol (IP). Ein TCP-Segment besteht aus dem Header und der Nutzlast, auch als Payload bezeichnet. Die Nutzlast enthält die Daten, die für den Kommunikationspartner bestimmt sind, wie z. B. Protokollinformationen der Anwendungsschicht. Der Header wird vor die Nutzlast gestellt. Er besteht aus mehreren Feldern, die für den Aufbau und die Steuerung von TCP-Verbindungen verwendet werden:

TCP header
Aufbau des TCP-Headers

Die wichtigsten Felder des TCP-Headers sind:

Bezeichnung Erläuterung
Source port (Quellport) Gibt den Quellport auf der Senderseite an
Destination port (Zielport) Gibt den Zielport auf der Empfängerseite an
Sequence number (Sequenznummer) Gibt die Position des ersten Datenbytes im aktuellen Segment innerhalb des Datenstroms oder die Initialisierungs-Sequenznummer falls das SYN-Flag gesetzt ist
Acknowledgment number (Bestätigungsnummer) Gibt die Sequenznummer an, die der Absender dieses TCP-Segments als Nächstes erwartet
Flags (Steuerbits) Werden für die Steuerung der TCP-Verbindung verwendet; die wichtigsten sind:
SYN - Initiiert die Verbindung
ACK - Bestätigt den Erhalt von Datenpaketen
RST - Setzt die Verbindung zurück
Checksum (Prüfsumme) Dient zur Erkennung von Übertragungsfehlern

Die Steuerinformationen im TCP-Header gewährleisten eine zuverlässige Datenübertragung. TCP ist verbindungsorientiert und zustandsbehaftet, was bedeutet, dass eine Verbindung aufgebaut und wieder abgebaut wird. Dies erfolgt durch den sogenannten Drei-Wege-Handschlag, bei dem das Zielgerät über seine IP-Adresse identifiziert wird, während die Portnummer die spezifische Anwendung auf diesem Gerät adressiert. Der Drei-Wege-Handschlag zwischen deinem Computer und dem LUPFER verläuft dabei folgendermaßen:

  1. Der Computer sendet ein TCP-Segment mit gesetztem SYN-Bit an den LUPFER.
  2. Der LUPFER sendet ein TCP-Segment zurück, in dem das SYN-Bit und das ACK-Bit gesetzt sind.
  3. Der Computer antwortet mit einem TCP-Segment mit gesetztem ACK-Bit.

Danach ist die Verbindung hergestellt.

TCP 3-way-handshake
TCP 3-Wege-Handschlag

Ist der Port des LUPFERs dagegen geschlossen, dann antwortet er auf das SYN-Paket mit einem TCP-Segment, in dem das RST-Bit gesetzt ist.

Refused TCP connection
Fehlgeschlagener 3-Wege-Handschlag wegen eines geschlossenen Ports

Mit diesem Verbindungsaufbau prüft Nmap, ob ein Port offen oder geschlossen ist. Dies kannst du selbst prüfen, indem du die Ausgabe von Nmap konfigurierst. Dafür gibt es unter anderem zwei Optionen:

Flag Erläuterung
-v Aktiviert den Verbose-Modus, der zusätzliche Informationen zum Fortschritt und zu den Ergebnissen des Scans anzeigt
-d Aktiviert den Debugging-Modus, der technische Details über den Scanprozess und die Netzwerkinteraktionen ausgibt

Wie du der Ausgabe entnehmen kannst, wird dieser Portscan als SYN Stealth Scan oder auch TCP SYN Scan bezeichnet. Du kannst ihn in Nmap auch explizit mit dem Flag -sS aufrufen. Der Befehl lautet dann:

nmap -sS <ip>

Um festzustellen, ob ein TCP-Port offen oder geschlossen ist, ist kein kompletter Verbindungsaufbau erforderlich. Dies setzt der TCP SYN Scan um, der ein SYN-Segment an den Zielhost sendet, den Verbindungsaufbau jedoch nach Erhalt des SYN-ACK-Segments abbricht, indem er mit einem RST-Segment antwortet.

Du kannst dir in Nmap auch die Gründe für den Status eines gescannten Ports anzeigen lassen. Dafür gibt es das Flag --reason.

Nmap gibt also an, dass der offene Port 22 mit einem SYN-ACK-Segment auf die Verbindungsanfrage reagiert, während der geschlossene Port 21 die Verbindungsanfrage mit einem RST-Segment ablehnt.

Die Nachrichten von Nmap erreichen den LUPFER ungehindert. Dies ist aber keine Selbstverständlichkeit. Ein Paketfilter kann theoretisch verhindern, dass Anfragen den Zielhost erreichen, sodass der Zustand des Ports als "Gefiltert" eingeschätzt wird. In diesem Fall antwortet der Host entweder gar nicht oder mit einer ICMP-Fehlermeldung.

Weitere Scan-Techniken erlauben nun, den Zustand des TCP-Ports genauer zu ermitteln. Diese nutzen aus, wenn Paketfilter zwar Anfragen zum Verbindungsaufbau (SYN-Segmente) blockieren, jedoch andere TCP-Segmente nicht behandeln. Damit erreichen diese Segmente den Zielhost, der entsprechend darauf antwortet. Neben den Steuerbits SYN, ACK und RST werden dabei weitere Flags genutzt, die in TCP-Segmenten gesetzt sein können. Dies sind:

Flag Bedeutung
FIN Signalisiert das Ende der Übertragung vom Absender
PSH Fordert die Datenübermittlung ohne Pufferung an
URG Setzt den Urgent-Zeiger zum Übertragen von dringenden Daten

Drei bekannte Scan-Methoden, die keinen Verbindungsaufbau initiieren, sondern bei denen andere TCP-Segmente versendet werden, sind:

Scan-Methode Flag in Nmap Beschreibung
TCP NULL Scan -sN Sendet Segmente ohne gesetzte Flag
TCP FIN Scan -sF Sendet FIN-Segmente
TCP XMAS Scan -sX Sendet Segmente mit gesetzten FIN-, PSH- und URG-Flags

Erreichen diese Segmente das Ziel und der Port antwortet mit einem RST-Segment, ist der Port geschlossen. Ist der Port dagegen geöffnet, bleibt er stumm und sendet keine Antwort. Dieses Verhalten entspricht den TCP-Protokollspezifikationen, die vorsehen, dass ein geschlossener Port auf ein Segment ohne gesetztes RST-Bit mit einem RST-Segment antwortet. Ein offener Port hingegen ignoriert ungültige Segmente, die nicht zum aktuellen Verbindungskontext passen.

Wenn der Host nicht antwortet, muss der Port nicht zwangsläufig offen sein. Er kann entweder offen oder gefiltert sein, da die Segmente möglicherweise aufgrund einer Filterung das Ziel nicht erreichen.

Werden die Segmente gefiltert, kann das Ziel auch eine ICMP-Fehlermeldung "Port unreachable" senden. Damit kann der Port eindeutig als gefiltert klassifiziert werden.

Dann gibt es noch den TCP ACK Scan, mit dem festgestellt werden kann, ob die Nachrichten an einen Port gefiltert werden. Erreicht ein ACK-Segment den Port, antwortet der Host grundsätzlich mit einem RST-Segment, unabhängig davon, ob er offen oder geschlossen ist. Reagiert der Host dagegen gar nicht oder mit einer ICMP-Fehlermeldung "Port unreachable", dann gilt der Port als gefiltert.

UDP-Portscan

UDP-Portscan mit Nmap

Nun wenden wir uns dem UDP-Portscan zu. In Nmap lässt sich ein UDP-Portscan durch folgenden Befehl starten:

sudo nmap -sU -F <ip>

Dabei benötigst du mit sudo erhöhte Benutzerrechte, um den UDP-Portscan über das Flag -sU zu starten. Das Flag -F sorgt dafür, dass nur die 100 am häufigsten verwendeten Ports gescannt werden.

Ein UDP-Port ist offen oder gefiltert. Gleichzeitig sollte dir aufgefallen sein, dass der UDP-Portscan deutlich langsamer ist als der TCP-Portscan. Warum das so ist, sollte gleich klar werden.

Das User Data Protocol (UDP)

Das User Datagram Protocol (UDP) ist ein einfaches, verbindungsloses Protokoll, das eine unzuverlässige, aber schnelle Übertragung von Daten ermöglicht. Die Einheit von Daten, die vom UDP verarbeitet werden, wird als Datagramm bezeichnet.

Wie TCP gehört es zur Transportschicht und adressiert die spezifische Anwendung auf dem Zielgerät über die Portnummer und die IP-Adresse. Ein UDP-Datagramm setzt sich wie ein TCP-Segment aus einem Header und der Nutzlast zusammen. Der Header besteht aus vier Feldern:

UDP header
Aufbau des UDP-Headers

Die Bedeutung der Felder des UDP-Header ist:

Bezeichnung Erläuterung
Source port (Quellport) Gibt den Quellport auf der Senderseite an
Destination port (Zielport) Gibt den Zielport auf der Empfängerseite an
Length (Länge) Gibt die Länge des Datagramms (Header und Nutzlast) an
Checksum (Prüfsumme) Dient zur Erkennung von Übertragungsfehlern

Der UDP-Header enthält also deutlich weniger Steuerinformationen als der TCP-Header. Ein Verbindungsaufbau ist damit nicht möglich. Stattdessen sendet der Absender für gewöhnlich direkt eine Anfrage an den Empfänger.

UDP communication
UDP-Kommunikation

Auf diese Anfrage antwortet der Host nur, wenn der Dienst die Anfrage erwartet und für sie eine Antwort vorsieht. Zur Erinnerung: TCP sieht dagegen vor, dass der Erhalt jeder Nachricht bestätigt wird, auch wenn keine Verbindung besteht.

Für einen UDP-Portscan sendet Nmap ein leeres Datagramm an die zu untersuchenden Ports. Darauf sind folgende Reaktionen des Hosts möglich:

  • Er antwortet mit einer ICMP-Fehlermeldung "Port unreachable", wenn der Port geschlossen ist.
  • Er antwortet mit einer anderen ICMP-Fehlermeldung, wenn ein Paketfilter verhindert, dass die Nachricht den Port erreicht. Der Port gilt als gefiltert.
  • Der Dienst hinter dem Port antwortet mit einem UDP-Datagramm, wenn der Port offen ist.
  • Der Host antwortet gar nicht. Dann kann der Port offen sein, aber der dahinterstehende Dienst sieht nicht vor, auf das leere Datagramm zu antworten, oder ein Paketfilter verhindert, dass es den Port erreicht.

Der letzte Fall kommt recht häufig vor, unter anderem auch beim UDP-Portscan des LUPFERs. Es ist also schwieriger als bei TCP, den Zustand eines UDP-Ports genau zu bestimmen.

Dann bleibt noch die Frage, warum der UDP-Portscan langsamer ist als der TCP-Portscan. Dafür gibt es zwei Gründe:

  • UDP-Dienste bestätigen den Erhalt von Datagrammen in der Regel nicht. Auch Paketfilter sehen häufig nicht vor, dass der Absender eine Antwort erhält. Daher warten Portscanner eine gewisse Zeitspanne bis zum Timeout auf eine Reaktion des Hosts. Außerdem senden sie ihr Datagramm wiederholt, um sicherzustellen, dass es nicht unterwegs verloren gegangen ist.
  • Ist ein UDP-Port geschlossen, antwortet der Host normalerweise mit einer ICMP-Fehlermeldung "Port unreachable". Viele Betriebssysteme sehen aber vor, die Rate der ICMP-Fehlermeldungen "Port unreachable" zu begrenzen. Um zu vermeiden, dass der Zielhost auf eingehende Datagramme an geschlossene Ports nicht reagiert, werden Portscanner langsamer.

Strategie für Portscan

Die verschiedenen Scan-Techniken unterscheiden sich in der Genauigkeit und Geschwindigkeit. Deshalb solltst du zunächst mit der kleinstmöglichen Anzahl an Ports und dem TCP SYN Scan beginnen. Andere Scanarten und weitere Ports solltest du in Betracht ziehen, falls keine offenen Ports erkannt werden können.

Hier ist eine mögliche Strategie zur Planung von Portscans:

  1. Nur TCP-Ports scannen, auf denen du Dienste vermutest
    1. Mit dem TCP SYN Scan starten
    2. Bei gegebenenfalls gefilterten Ports TCP FIN/NULL/XMAS Scan starten
  2. Falls keine offenen TCP-Ports erkannt wurden, Top 1.000 TCP-Ports scannen
  3. Falls keine offenen TCP-Ports erkannt wurden, alle TCP-Ports scannen
  4. Nur UDP-Ports scannen, auf denen du Dienste vermutest
  5. Falls keine offenen UDP-Ports erkannt wurden, Top 100 UDP-Ports scannen
  6. Falls keine offenen UDP-Ports erkannt wurden, alle UDP-Ports scannen

Und hier ist noch einmal eine Übersicht der wichtigsten Scan-Methoden:

Beschreibung Ergebnis
TCP Connect Scan
Vollständiger Drei-Wege-Handshake
Offen: Verbindung erfolgreich
Geschlossen: RST erhalten
Gefiltert: Keine Antwort oder ICMP-Fehlermeldung "Port unreachable"
TCP SYN Scan
Sendet SYN-Pakete
Offen: SYN/ACK erhalten
Geschlossen: RST erhalten
Gefiltert: Keine Antwort oder ICMP-Fehlermeldung "Port unreachable"
TCP FIN Scan
Sendet FIN-Pakete
Offen | Gefiltert: Keine Antwort
Gefiltert: ICMP-Fehlermeldung "Port unreachable"
Geschlossen: RST erhalten
TCP NULL Scan
Sendet Pakete ohne gesetzte Flag
Offen | Gefiltert: Keine Antwort
Gefiltert: ICMP-Fehlermeldung "Port unreachable"
Geschlossen: RST erhalten
TCP XMAS Scan
Sendet Pakete mit FIN, URG und PSH Flags gesetzt
Offen | Gefiltert: Keine Antwort
Gefiltert: ICMP-Fehlermeldung "Port unreachable"
Geschlossen: RST erhalten
TCP ACK Scan
Sendet ACK-Pakete, prüft auf Antwort
Ungefiltert: RST erhalten
Gefiltert: Keine Antwort oder ICMP-Fehlermeldung "Port unreachable"
UDP Scan
Sendet UDP-Paket, prüft auf Antwort
Offen: Eine Antwort, aber keine ICMP-Nachricht
Offen | gefiltert: Keine Antwort
Gefiltert: Eine ICMP-Nachricht, aber keine ICMP-Fehlermeldung "Port unreachable"
Geschlossen: ICMP-Fehlermeldung "Port unreachable"