24.04.2021
Portscanner wie nmap sind eines der wichtigsten Arbeitsmittel von Administratoren. Dieses HowTo beschreibt den Einsatz des populären Portscanner Nmap unter Linux & Windows Systemen.
Protokolle & Ports
Um einen Dienst auf einen IP-Host eindeutig zu identifizieren werden drei Angaben benötigt:
- das Protokoll (z.B. TCP)
- die IP-Adresse (z.B. 10.0.0.1)
- die Portnummer (z.B. 80 für HTTP)
Diese drei Angaben identifizieren einen Webserver (HTTP) der auf dem Host mit der IP-Adresse 10.0.0.1 läuft. Die Portnummer ist eine 16-Bit-Zahl zwischen 0 und 65535. Für Standarddienste werden die Portnummern von der IANA vergeben. Dort finden Sie auch die aktuelle Liste der Portnummern. Die Aufgabe eines Portscanners ist es nun, die offenen Ports eines Systems zu ermitteln. Also die Ports, auf denen ein Service angeboten wird.
Beispiel:
Sehen wir uns dazu ein erstes Beispiel an.
[root] ~ $ nmap -sT lxu.io
Starting nmap 3.20 ( www.insecure.org/nmap/ ) at 2005-03-01 18:18 CEST Interesting ports on lxu.io (10.0.0.1):
(The 1610 ports scanned but not shown below are in state: closed)
Port State Service 80/tcp open
http Nmap run completed -- 1 IP address (1 host up) scanned in 9.966 seconds
Mit dem Linux Kommando: nmap -sT lxu.io
untersucht nmap den Host lxu.io auf offene TCP-Ports. Dabei überprüft nmap standartmässig nicht alle 65535 TCP-Ports. Per Default werden nur die 1611 “wichtigsten” Portnummern gescannt. Auf dem Host lxu.io wird ein offener Port entdeckt (HTTP). Der Scan dauert etwa 9 Sekunden. Grundsätzlich sollten auf einem Server nur die Ports offen sein, die auch wirklich benötigt werden.
TCP Portscans
TCP ist das verbindungsorientierte Protokoll der TCP/IP-NetzwerkFamilie auf dem OSI-Layer 4. Vor jeder Datenübertragung baut der Client eine TCP-Session zum Server auf. TCP nutzt dazu den Dreiwege Handshake (three-way handshake). Hierfür tauschen Server & Client 3 TCP-Segmente mit bestimmten Flags aus.
Client Server SYN ———> SYN + ACK <———- ACK ———->
Der Client sendet zuerst ein Segment mit gesetztem SYN-Flag (synchronisieren) an den Server. Dieses Datenpaket wird enthält auch die Portnummer des gewünschten Dienstes auf dem Server. Akzepiert der Server den Verbindungsaufbau, antwortet er mit einen gesetzten SYN- und ACK-Flag (Acknowledgement). Der Client bestätigt mit einem ACK-Segment. Bietet der Server auf dem angesprochenen Port keinen Dienst an, gibt es mehrere Möglichkeiten der Reaktion. Ein RST-Segement (RESET) könnte an den Client gesendet werden, der Server könnte eine ICMP-Meldung versenden oder er tut einfach nichts.
TCP SYN-Scan -sS
Die Option -sS veranlasst Nmap einen SYN-Scan auszuführen. Auch dabei beginnt der Scanner mit einem SYN-Segment. Es wird jedoch keine vollständige TCP-Session aufgebaut. Ist der Port auf dem Zielhost im LISTENING und antwortet mit einem SYN/ACK, sendet Nmap sofort ein RST-Segment (RESET). Dadurch wird die halboffene (half-open) Verbindung wieder abgebaut. Mit der SYN-Scan Technik kann unter Umständen eine Erkennung des Portscans durch das Target vermieden werden.
TCP connect-Scan -sT
Mit der Option -sT für Nmap einen connect-Scan aus. Der Scanner verhält sich dabei wie ein normaler Client und verbindet sich (connect) mit dem Zielsystem. Ist der Port auf dem Zielhost im Status LISTENING, wird ein Three-way Handshake ausgeführt. Eine solche Verbindung kann vom Zielhost leicht protokolliert werden und auch jedes IDS sollte einen connect-Scan erkennen.
Stealth Scans
Mit den Optionen -sF wird ein FIN-Scan ausgeführt. Nmap sendet dazu FIN-Segmente an das Target. Diese werden eigentlich zum Beenden einer TCP-Sitzung genutzt. Das Zielsystem sollte an geschlossenen Ports mit einem RST reagieren und auf listening (abhören) Ports das FIN-Segment einfach verwerfen.
Beim Xmas-Tree-Scan (Option -sX) sind in einem Segment das FIN, URG und PSH-Flag gesetzt. Je nach Implementierung reagieren die Zielsysteme recht verschieden auf ein solches Segment.
Der Null-Scan wird über die Option -sN aktiviert. Nmap sendet Segmente ohne gesetzte Flags an das Target.
Wie bei allen Scan-Techniken können die Resultate durch Firewalls und Filter zwischen Nmap und Target beeinflusst werden. Auf jeden Fall sollte der Admin das Verhalten seiner eigenen Systeme bei diesen Portscans kennen.
UDP Portscans -sU
UDP ist das verbindungslose Protokoll der TCP/IP-Suite. Normalerweise sollte ein System auf ein UDP-Segment an einen geschlossenen Port mit einem “ICMP Port Unreachable” reagieren. Offene UDP-Ports sollten keine Reaktion erzeugen. Heute wird allerdings ICMP oft rigoros gefiltert. Dadurch sind UDP-Scans mitunter nicht sehr zuverlässig. Viele Betriebssysteme begrenzen die Rate von ICMP-Paketen. Dadurch sind UDP-Scans bei vielen Systemen sehr langsam.
Allgemeine Optionen
Die Arbeitsweise von Nmap kann durch viele weitere Optionen beeinflusst werden.
Kein Ping -P0
Mit der Option -P0 wird ein ICMP-Ping vor dem eigentlichen Scan unterdrückt. Das kann notwendig sein, wenn eine Firewall oder das Target ICMP filtert.
Fingerprint -O
Jede Implementierung von TCP/IP hat ihre Eigenheiten. Mit der Option -O versucht Nmap diese Eigenheiten zu erkennen und das Betriebssystem des Targets zu identifizieren.
[root] ~ $ nmap -sT -O lxu.io
Starting nmap 3.20 ( www.insecure.org/nmap/ ) at 2005-03-01 14:49 CEST
Interesting ports on lxu.io (10.0.0.1): (The 1610 ports scanned but not shown below are in state: closed)
Port State Service 80/tcp open http
Remote operating system guess: Debian-3-RELEASE
Uptime 40.088 days (since Mo Jan 1 15:51:18 2005)
Nmap run completed -- 1 IP address (1 host up) scanned in 17.254 seconds
Im gezeigten Beispiel erkennt Nmap auf dem Zielsystem ein Debian 3.
Fragmentierung -f
Nmap kann zum Beispiel beim SYN-Scan mit fragmentierten IP-Paketen arbeiten. Mitunter lassen sich dadurch Firewalls oder Intrusion Detection Syteme (IDS) verwirren.
Verbose -v
Mit -v können Sie Nmap etwas gesprächiger machen. Es werden Meldungen über die aktuellen Aktivitäten angezeigt.
Port-Bereiche -p
Um bestimmte Ports oder Bereiche zu untersuchen, können diese mit der Option -p bestimmt werden. Einzelne Ports werden als -p 22 notiert, Bereiche können mit -p 40-45, 100-120 angegeben werden.
Quell-IP-Adresse -S und Interface -e
Unter bestimmten Umständen ist es notwendig Nmap eine Absender-IP-Adresse und eine Schnittstelle mitzuteilen. Das kann zum Beispiel auf einem virtuellen Server hilfreich sein. Das erste Beispiel zeigt einen Aufruf von Nmap auf einem vServer:
root ~ $ nmap -sT work.example.org Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
Failed to lookup device subnet/netmask: eth0: no IPv4 address assigned QUITTING!
Eigentlich nutzt dieser vServer das Interface eth0:vs4 mit der IP-Adresse 10.0.0.4. Der Aufruf von Nmap könnte so aussehen:
root ~ $ nmap -sT -e eth0:vs4 -S 10.0.0.4 work.example.org
Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
WARNING: If -S is being used to fake your source address, you may also have to use -e and -P0.
WARNING: -S will not affect the source address used in a connect() scan.
(The 1549 ports scanned but not shown below are in state: closed)
Port State Service 22/tcp open
ssh 80/tcp open http
Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds
Timing -T Paranoid|Sneaky|Polite|Normal|Aggressive|Insane
Über die Option -T kann das Timing von Nmap verändert werden. Mit -T Paranoid wartet Nmap bis zu 5 Minuten zwischen den einzelnen Packeten. Dadurch soll die Entdeckung durch ein IDS erschwert werden. Bei “Insane” wird das Target praktisch mit Packeten bombardiert.
Zielsystem angeben
Der Scanner Nmap bietet vielfältige Möglichkeiten zur Angabe des Ziels. Es können einzelne System über Hostname oder IP-Adresse oder ganze IP-Netze gescannt werden. IP-Netze können in CIDR-Notation (z.B. /24) oder mit Sternchen (z.B. 192.168.*.*) angegeben werden.
Beispiele
Im Folgenden sehen Sie einige Beispiele für den Einsatz von Nmap. Sie sollten nur eigene Systeme und Netze mit Nmap scannen. Admins mögen exzessive Portscans auf ihre Systeme nicht besonders gerne.
Hier werden alle Adressen von 10.0.0.0 und 10.0.0.255 mit einem FIN-Scan überprüft
[root] ~ $ nmap -sF -T insane 10.0.0.0/24
Starting nmap 3.20 ( www.insecure.org/nmap/ ) at 2005-05-01 18:49 CEST Host 10.0.0.0
seems to be a subnet broadcast address (returned 1 extra pings). Skipping host.
All 1611 scanned ports on lxu.io (10.0.0.1) are: filtered
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
Interesting ports on wrt54g (10.0.0.55):
(The 1610 ports scanned but not shown below are in state: closed)
Port State Service 80/tcp open http Interesting ports on 10.0.0.101:
(The 1610 ports scanned but not shown below are in state: closed)
Port State Service 6000/tcp open X11
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
All 1611 scanned ports on 10.0.0.120 are: closed
Host 10.0.0.255 seems to be a subnet broadcast address (returned 1 extra pings). Skipping host.
Nmap run completed -- 256 IP addresses (4 hosts up) scanned in 238.816 seconds
SYN Stealth Scan auf eine lxu.iowall (IP 10.0.0.1) mit Erkennung des Betriebssystems
[root] ~ $ nmap -sS -O -v -T insane 10.0.0.1
Starting nmap 3.20 ( www.insecure.org/nmap/ ) at 2005-05-01 18:58 CEST
Host lxu.io (10.0.0.1) appears to be up ... good. Initiating SYN Stealth Scan against lxu.io (10.0.0.1) at 18:58
Adding open port 80/tcp The SYN Stealth Scan took 148 seconds to scan 1611 ports.
For OSScan assuming that port 80 is open and port 1 is closed and neither are firewalled
Insufficient responses for TCP sequencing (2), OS detection may be less accurate
Interesting ports on lxu.io (10.0.0.1): (The 1610 ports scanned but not shown below are in state: closed)
Port State Service 80/tcp open
http Remote operating system guess: FreeBSD 4.7-RELEASE Uptime 30.139 days (since Fri Apr 1 15:41:28 2005)
Nmap run completed -- 1 IP address (1 host up) scanned in 154.481 seconds