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:
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 VerbindungACK - Bestätigt den Erhalt von DatenpaketenRST - 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:
- Der Computer sendet ein TCP-Segment mit gesetztem SYN-Bit an den LUPFER.
- Der LUPFER sendet ein TCP-Segment zurück, in dem das SYN-Bit und das ACK-Bit gesetzt sind.
- Der Computer antwortet mit einem TCP-Segment mit gesetztem ACK-Bit.
Danach ist die Verbindung hergestellt.
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.
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:
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.
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:
- Nur TCP-Ports scannen, auf denen du Dienste vermutest
- Mit dem TCP SYN Scan starten
- Bei gegebenenfalls gefilterten Ports TCP FIN/NULL/XMAS Scan starten
- Falls keine offenen TCP-Ports erkannt wurden, Top 1.000 TCP-Ports scannen
- Falls keine offenen TCP-Ports erkannt wurden, alle TCP-Ports scannen
- Nur UDP-Ports scannen, auf denen du Dienste vermutest
- Falls keine offenen UDP-Ports erkannt wurden, Top 100 UDP-Ports scannen
- 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" |
