Nmap – Portscanner, Hacking-Tool, Alleskönner [Teil I]
Nmap bietet als Portscanner eine ausgereifte Lösung, mit der der Admin feststellen kann, welche Systeme aktuell in seinem Netzwerk aktiv sind, unter welchen Betriebssystemen sie laufen und welche Dienste angeboten werden. Die Analyse-Möglichkeiten sind zahlreich und gehen – je nach Szenario – teilweise weit ins Detail.
Auf der anderen Seite bietet Nmap auch Hackern und Penetration-Testern eine optimale Möglichkeit, das Zielnetzwerk kennenzulernen, um Angriffsvektoren zu identifizieren. Somit fällt Nmap in die Kategorie "Hacking-Werkzeuge" und sollte nicht unbedarft zum Einsatz kommen.
In dieser Artikel-Serie sehen wir, wie Nmap funktioniert und wie wir mit wenig Aufwand eine gute Übersicht über unser eigenes oder ein Zielnetzwerk erhalten können. Dabei werfen wir auch einen Blick auf die zusätzlichen Funktionen, die Nmap über das reine Portscanning hinaus anbietet. Im ersten Teil schauen wir uns die wichtigsten Grundfunktionen an.
Nmap steht für Network Mapper und wurde von Gordon Lyon, den meisten besser bekannt als Fyodor, 1997 entwickelt [1]. Mittlerweile existiert Nmap in der Version 7.x. Nmap unterliegt der GPL, ist also als freie Software erhältlich [2].
Das Tool wurde ursprünglich für Linux entwickelt, ist aber mittlerweile auch für Windows verfügbar und hat dort einen fast identischen Funktionsumfang. Während Nmap ursprünglich und grundsätzlich ein Kommandozeilen-Tool ist, steht mit Zenmap mittlerweile eine ausgereifte GUI zur Verfügung.
Nmap ist auf der Security-Distribution Kali Linux bereits vorinstalliert, unter anderen Linux-Distributionen ist Nmap ebenfalls in allen namhaften "Distros" (anderes Wort für Distribution) vertreten und kann über das Distro-eigene Installationstool installiert und bereitgestellt werden. Die Installation unter Windows ist denkbar einfach und umfasst neben der Nmap-Engine weitere Tools, die auch unter Linux bereitstehen.
Nmap und die Hacking-Filme
Nmap ist inzwischen ein Filmstar: Mit Auftritten in The Matrix, Snowden, Who Am I und anderen namhaften Filmen stand es schon mit den ganz großen auf der Bühne. Wie es aussieht hat Hollywood wohl entschieden, dass Nmap das gesetzte Tool ist, wenn es um Hacking-Szenen geht. Vermutlich nicht zuletzt deswegen, weil die Kommandozeilen-Optionen für nicht Eingeweihte genauso kryptisch anmuten wie die Ausgabe nach dem Scan – eben echtes "Hacker-Ambiente".
Was kann Nmap?
Nmap ist dazu konzipiert, sowohl horizontal als auch vertikal effizient zu scannen. Was bedeutet das? Ein horizontaler Scan ist ein Scan über eine Reihe von Systemen. Die stehen – bildlich gesprochen – nebeneinander. Dabei geht es darum, festzustellen, welche der Systeme im Zielnetz gerade aktiv sind. Ein vertikaler Scan ist dagegen der Scan eines einzelnen Systems. Hier werden die TCP- und/oder UDP-Ports hoch und runter geprüft – daher vertikal.
Auch wenn das Scannen des Netzwerks zunächst einmal vielleicht nicht so schrecklich dramatisch klingt, sollten Sie sich schon mal warm anziehen: Nmap hat es in sich und verfügt über mehr als 100 Schalter und Optionen. Dabei können die Scan-Typen definiert, Performance-Parameter optimiert und nicht zuletzt über die Nmap Scripting Engine (NSE) beliebige weitere Funktionen in Form von Skripten eingebunden werden. Außerdem verfügt Nmap über Optionen, die die Effektivität von Schutzmechanismen wie Firewalls und Intrusion Detection-/Prevention-Systeme, testen können.
Host Discovery
Zunächst muss Nmap feststellen, welche Ziele aktiv sind und gescannt werden können. Dieser erste Schritt wird als Host Discovery bezeichnet. Dabei versucht Nmap in einem Horizontal-Scan die Zielsysteme zu erreichen. Nur wenn diese antworten wird der Vertikal-Scan gestartet und die einzelnen Systeme im Detail geprüft. Da sich Hosts nicht immer ganz offen und freiwillig zu erkennen geben, gibt es verschiedene Ansätze, um deren aktiven Status zu ermitteln.
Die grundsätzliche Syntax von Nmap lautet folgendermaßen:
nmap <Scantyp> [<Optionen>] <Ziele>
Optionen sind nicht unbedingt erforderlich und werden nur bei Bedarf eingesetzt. Scantypen werden mit –s<Scantyp> angegeben. Der Scantyp wird normalerweise als Großbuchstabe angegeben (z. B. S, A oder U). Im nachfolgenden Beispiel legen wir jedoch fest, dass lediglich ein horizontaler Scan – sprich: Host Discovery – durchgeführt werden soll und der eigentliche Portscan ausgelassen wird. Als Ziel geben wir ein spezielles System im Internet an (s. Tipp weiter unten):
root@kali:~# nmap -sn scanme.nmap.org Starting Nmap 7.40 ( nmap.org ) at 2017-05-18 23:26 CEST Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.24s latency). Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f Nmap done: 1 IP address (1 host up) scanned in 0.51 seconds
Nmap löst zunächst den Hostnamen auf und testet anschließend die aufgelöste Adresse. Durch den Scantyp –sn stellen wir lediglich fest, dass der Host "up" – also erreichbar – ist.
Sind Host- und Portscans im Internet verboten?
Grundsätzlich nicht, aber da das Scannen häufig als Reconnaissance Attack (also Erkundungsangriff) gewertet wird, dem ein echter Angriff folgt, sind sowohl Administratoren als auch Security-Tools wie Firewalls und Intrusion Detection-Systeme (IDS) nicht besonders gut auf derartige Scans zu sprechen. Gute Tools erzeugen hier entsprechende Logfile-Einträge und gute Administratoren werten diese auch aus und reagieren darauf.
Während ein einzelner Erreichbarkeitsscan sicherlich nicht allzu viel Aufmerksamkeit erregt, ist das kontinuierliche, aggressive Scannen mit allen möglichen Optionen derart "laut", dass eine Rückverfolgung nicht ausgeschlossen ist. Zumindest ist der Angreifer in diesem Fall unter Beobachtung, wenn ihm auch noch kein echter Angriff zur Last gelegt werden kann. Gehen Sie also im Internet besser defensiv mit Nmap um und sparen Sie sich die aggressiven Scans für Ihre Laborumgebung auf. Wer ein Zielsystem im Internet sucht, kann sich gefahrlos an scanme.nmap.org austoben – aber auch hier gilt: Besser nicht übertreiben und keine allzu aggressiven Scans fahren.
In einigen Fällen gibt es übrigens mehrere Wege, die zum Ziel führen. So ist neben der Angabe –sn auch –sP möglich. Dabei steht P für Pingscan. Ein solcher Ping meint jedoch nicht unbedingt und ausschließlich den Ping via ICMP-Typ 8 und 0 (Echo Request/Echo Reply). Nmap fasst den Begriff weiter und bezeichnet alle Kommunikationsanfragen, die eine Antwort des Zielsystems provozieren, also Ping. Dabei ist Nmap grundsätzlich egal, wie diese Antwort ausfällt, auch ein TCP-RST-Paket – eigentlich eine Ablehnung einer TCP-Verbindung – dient diesem Zweck, da der angefragte Host damit grundsätzlich seinen Status als aktives System offenbart hat. Somit kann Nmap im Rahmen des horizontalen Scans auf einige Tricks zurückgreifen, um aktive Hosts auch dann zu erkennen, wenn eine Firewall z. B. normale Ping-Anfragen blockiert.
Standardmäßig versendet Nmap die folgenden Probes:
- Echo Request (ICMP-Typ 8, reguläre Ping-Anfrage)
- TCP-SYN auf Port 443 (HTTPS, also SSH/TLS)
- TCP-ACK auf Port 80 (HTTP, also Webserver)
- Timestamp Request (ICMP-Typ 13)
Während Echo Request und TCP-SYN-Paket auf Port 443 reguläre Kommunikationsanfragen darstellen, provoziert Nmap mit dem TCP-ACK-Paket auf Port 80 eine TCP-RST-Antwort, da es sich hier um keine reguläre Anfrage handelt. Dies ist manchmal erfolgreich, wenn Firewalls reguläre Anfragen blockieren, vermeintliche Antworten jedoch passieren lassen. Auch der Timestamp Request dient dazu, schlecht konfigurierte Firewalls, die z. B. nur ICMP-Typ 0 und 8 blockieren, auszumanövrieren.
Den Ping-Scan können wir beeinflussen. So können wir die gewünschten Probes separat festlegen, wie das folgende Beispiel zeigt:
nmap –PE –PP –PS80,443 –PA3389 –PU40125 scanme.nmap.org
Hier sendet Nmap Ping-Requests (-PE), Timestamp Requests (-PP), ein SYN-Request auf die Ports 80 und 443 (-PS80,443) sowie ein TCP-ACK-Paket auf Port 3389 (PA3389) und ein UDP-Paket auf Port 40125 (-PU40125) um das Ziel scanme.nmap.org zu testen. Diese Konfiguration entspricht einer Art Best Practice, mit dem die Nmap-Entwickler bei vielen tausend Scans durchschnittlich die besten Ergebnisse erzielt haben.
Angabe der Zielsysteme
Bisher haben wir als Ziel unserer Scans nur ein einzelnes System angegeben. In der Realität werden Sie allerdings häufig größere Adressbereiche scannen wollen. Nachfolgend die Möglichkeiten, wie wir Zieladressen angeben können. Den Scan-Typ und die Optionen lassen wir der Übersicht halber weg. Zunächst ist es möglich, eine einzelne IP-Adresse anzugeben:
nmap 192.168.8.1
Dies scannt genau die angegebene IP-Adresse – nicht mehr und nicht weniger. Dementsprechend ist auch die Angabe eines DNS-Namens möglich, wie wir bereits kennengelernt haben:
nmap scanme.nmap.org
Außerdem können wir ein komplettes Subnetz angeben:
nmap 45.33.32.0/24
Hierbei werden alle Adressen im angegebenen Subnetz geprüft. Sie können allerdings auch ganz gezielt Adressbereiche angeben:
nmap 192.168.78.100-200
Weiterhin ist es möglich, nicht zusammenhängende Zielsysteme durch Komma getrennt anzugeben:
nmap 10.1.1.20,30,35
Diese Angabe ist äquivalent zu folgender Zeile:
nmap 10.1.1.20 10.1.1.30 10.1.1.35
Wie Sie sehen, ist Nmap sehr flexibel bei der Angabe der Zielhost-Adressen bzw. Adressbereiche. Denken Sie aber bitte auch immer daran, dass ein Scan auf zahlreiche Systeme auch richtig viel Zeit kosten kann – je nach Scantypen und -optionen teilweise mehrere Tage! In vielen Fällen ist eine Aufteilung der Scans des Netzwerks daher sinnvoll.
Die Port-Zustände
Die Hauptaufgabe von Nmap ist das Portscanning. Darunter verstehen wir das Prüfen des Zustandes von TCP- oder UDP-Ports. Egal ob Active Directory, SQL-, Web- oder Mailserver: Die allermeisten Dienste, die ein Netzwerk-Knoten anbietet, binden sich an einen oder mehrere Ports und lauschen auf Verbindungsanforderungen über das Netzwerk. Dementsprechend kann Nmap über diesen Zugang die meisten Informationen über ein System sammeln.
Wenn Nmap einen Port prüft, kann dieser folgende Zustände haben:
- open: Der Port ist erreichbar und antwortet mit SYN/ACK (TCP) bzw. mit einer Antwort entsprechend des UDP-Dienstes.
- closed: Der Port ist nicht erreichbar und antwortet mit einem RST/ACK-Paket (TCP) bzw. ICMP-Typ 3 Code 3 Port Unreachable (UDP).
- filtered: Es kommt entweder keine Antwort (TCP) oder eine Antwort, die darauf schließen lässt, dass der betreffende Port durch eine Firewall oder ähnliche Mechanismen geblockt wird und daher nicht erreichbar ist. Dies können bei UDP diverse ICMP-Typ 3-Meldungscodes sein (konkret: 0, 1, 2, 9, 10 und 13)
- unfiltered: Dieser Zustand ist etwas merkwürdig. Er besagt, dass Nmap den Port zwar grundsätzlich erreichen kann, aber nicht feststellen kann, ob der Port offen oder geschlossen ist. Der einzige Scan, der dieses Ergebnis liefert, ist der TCP-ACK-Scan. Es sind also ggf. weitere Scan-Typen (SYN-Scan o.ä.) notwendig, um hier Klarheit zu erlangen.
- open|filtered: Nmap klassifiziert einen Port als open|filtered, bei dem es nicht feststellen kann, ob der Port offen ist oder gefiltert wird. Scan-Typen, bei denen dies vorkommen kann, sind UDP-, IP-Protokoll-, FIN-, NULL- und XMAS-Scan.
- closed|filtered: Kann Nmap nicht feststellen, ob ein Port geschlossen ist oder gefiltert wird, erfolgt die Klassifizierung in dieser Art. Dies wird allerdings nur beim IP-ID-Idle-Scan verwendet.
In der Regel stoßen wir auf die Zustände open, closed, filtered und open|filtered. unfiltered und closed|filtered sind, wie beschrieben, nur in Ausnahmefällen relevant.
Basis-Portscans
Portscans werden grundsätzlich ausgeführt, wenn sie nicht explizit (wie mit –sn) ausgeschlossen werden. Sie folgen dem Prozess der Host Discovery und scannen alle als aktiv gekennzeichneten Systeme. Möchten wir die Host Discovery abschalten, um jede einzelne IP-Adresse des Zielbereichs zu scannen, können wir –PN, –Pn oder –P0 angeben, alle drei Optionen bewirken dasselbe.
Standardmäßig werden die 1000 gängigsten Ports gescannt. Das folgende Beispiel zeigt die einfachste Variante eines Portscans:
nmap <Zielsystem>
Dies ist gleichbedeutend mit dem Scan-Typ –sS. Das beschreibt den Nmap-Standard, einen TCP-SYN-Scan, mit dem ein TCP-Port über ein TCP-SYN-Paket angesprochen wird und die Antwort ausgewertet wird:
- Antwort ist ein SYN/ACK-Paket: Der Port ist aktiv und von einem Dienst gebunden. Portstatus ist open.
- Antwort ist RST/ACK-Paket: Der Port ist nicht aktiv und nicht gebunden. Portstatus ist closed.
- Antwort bleibt aus: Der Port wird geblockt. Portstatus ist filtered.
Dabei wird auch bei einer Antwort des Zielsystems der TCP-Handshake nicht zu Ende gebracht, Nmap schickt also kein ACK-Paket. Daher wird dieser Scan auch als halboffener bzw. Half-Open-Scan bezeichnet. Dies hat zwei Vorteile: Zum einen ist der Scan schneller und benötigt weniger Pakete und zum anderen ist es weniger wahrscheinlich, dass die halboffene Verbindung auf dem Zielsystem protokolliert wird. Damit ist der Scan weniger sichtbar. Daher wird dieser Scan-Typ auch als Stealth-SYN-Scan bezeichnet. Nachfolgend der Output für scanme.nmap.org:
root@kali:~# nmap scanme.nmap.org Starting Nmap 7.50 ( nmap.org ) at 2017-10-09 19:08 CEST Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.18s latency). Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f Not shown: 994 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 135/tcp filtered msrpc 139/tcp filtered netbios-ssn 445/tcp filtered microsoft-ds 31337/tcp open Elite Nmap done: 1 IP address (1 host up) scanned in 15.81 seconds
Standardmäßig zeigt Nmap nur die offenen und gefilterten Ports an, nicht jedoch die geschlossenen. Weitere Scantypen sind TCP-Connect-Scan (–sT), wobei der 3-Way-Handshake von TCP komplett durchgeführt wird, sowie der UDP-Scan (–sU). Da UDP keine Sitzungen aufbaut, ist es schwieriger, an verwertbare Informationen zu einem UDP-Port zu gelangen. Daher baut der UDP-Scan auf ICMP-Typ-3-Rückmeldungen (DestinationUnreachable), um Rückschlüsse auf den Portzustand zu ziehen. UDP-Scans sind schwieriger, fehleranfälliger und dauern oftmals länger als ein TCP-Scan, da Nmap Timeouts "aussitzt" und wiederholte Verbindungsversuche unternimmt, bevor der Portstatus abschließend festgelegt wird. Offene und gefilterte Ports antworten seltener als bei TCP bzw. gar nicht, so dass Nmap hier viel Zeit investiert, um sicherzugehen, dass der Portstatus korrekt festgestellt wird.
Zu scannende Ports festlegen
Oftmals ist es gar nicht nötig, alle Ports eines Systems oder auch nur die 1000 wichtigsten Ports zu scannen. Vielleicht reicht es Ihnen ja, wenn Sie in einem bekannten Netzwerk nur diejenigen Ports festlegen, an denen sich Dienste gebunden haben, die im Zielnetzwerk eingesetzt werden.
Vorsicht: Hier geraten wir ganz schnell auf sehr dünnes Eis! Kaum ein Administrator hat einen vollständigen Überblick über alle Ports und Kommunikationsformen, die in seinem eigenen Netzwerk tatsächlich aktiv sind – dies gilt natürlich erst recht für externe Personen. Eine Einschränkung der Ports kann einerseits eine deutliche Performance-Steigerung mit sich bringen, andererseits aber auch große schwarze Flecken auf der Karte unserer Netzwerk-Landschaft hinterlassen, hinter denen sich viele interessante und faszinierende "Schätze" verbergen können – vielleicht auch angreifbare Dienste, die der Pentester vielleicht aus Zeit- oder anderen Gründen außer Acht lässt, aber der Black-Hat-Hacker nicht. Reduzieren sie die Liste der zu scannenden Ports also besser nur dann, wenn Sie eine entsprechende Zielstellung haben und wissen, wo Sie hin wollen.
Wie können wir also nun die zu scannenden Ports festlegen? Die Option hierzu ist –p. Ihr folgen die einzuschließenden Ports. Betrachten wir hierzu ein paar Beispiele. Im Folgenden legen wir für den Standard-Portscan (TCP-SYN-Scan), den wir nur der Lesbarkeit halber angeben, die angegebenen Ports fest:
nmap –sS –p 21-23,25,80,443 scanme.nmap.org
Es werden folglich die Standard-Ports für FTP (21), SSH (22) und Telnet (23), der SMTP-Port (25) sowie HTTP (80) und HTTPS (443) gescannt. Analog dazu folgender UDP-Scan:
nmap –sU –p 53,67,111,123,161,162 scanme.nmap.org
Hier werden sechs der wichtigsten UDP-Ports gescannt: DNS (53), DHCP-Server (67), Portmapper (111), Timeserver (123), SNMP (161) und SNMP-Traps (162). Es ist auch möglich, TCP- und UDP-Scans zu kombinieren und die entsprechenden Ports anzugeben. Hierzu nutzen wir T: bzw. U: zur Angabe des Protokolls, auf das sich die Portnummern beziehen. Mit dem folgenden Beispiel scannen wir also mittels TCP-SYN-Scan die TCP-Ports 21, 22 und 80 sowie die UDP-Ports 53, 67 und 161:
nmap –sS –sU –p T:21,22,80,U:53,67,161 scanme.nmap.org
Wir können das Szenario auch umdrehen. Sie können auch bestimmte Ports aus dem Scan ausschließen. Dies kann nützlich sein, weil Sie z. B. die Ports 25 und 80 nicht scannen möchten, da Sie bei einem Server wissen, dass diese Ports aktiv sind und nur darüber hinausgehende Dienste finden wollen.
Die Option hierzu lautet --exclude-ports. Bei der Portangabe gelten dieselben Regeln wie bei –p. Im Folgenden schließen wir die Ports 25 und 80 aus:
nmap –sS --exclude-ports 25,80 scanme.nmap.org
Im Umkehrschluss bedeutet dies, dass Nmap alle restlichen 998 wichtigsten Ports scannt. Jetzt haben wir das schon so oft angesprochen, dass wir an diesem Punkt endlich mal Klarheit schaffen sollten: Was sind denn nun die wichtigsten 1000 Ports und wie können wir diese manipulieren?
Top Ports festlegen
Nmap nutzt eine Datei namens /usr/share/nmap/nmap-services. Sie hat eine sehr ähnliche Syntax zu /etc/services, hat zusätzlich allerdings eine dritte Spalte Open-Frequency, die die Häufigkeit angibt, mit der der jeweilige Port bei Testscans im Internet und in Organisationen geöffnet ist. Hier ein Auszug:
ftp-data 20/sctp 0.000000 # File Transfer [Default Data] | FTP ftp-data 20/tcp 0.001079 # File Transfer [Default Data] ftp-data 20/udp 0.001878 # File Transfer [Default Data] ftp 21/sctp 0.000000 # File Transfer [Control] | File Transfer Protocol [Control] ftp 21/tcp 0.197667 # File Transfer [Control] ftp 21/udp 0.004844 # File Transfer [Control] ssh 22/sctp 0.000000 # Secure Shell Login | The Secure Shell (SSH) Protocol ssh 22/tcp 0.182286 # Secure Shell Login ssh 22/udp 0.003905 # Secure Shell Login telnet 23/tcp 0.221265 telnet 23/udp 0.006211 priv-mail 24/tcp 0.001154 # any private mail system priv-mail 24/udp 0.000329 # any private mail system smtp 25/tcp 0.131314 # Simple Mail Transfer smtp 25/udp 0.001285 # Simple Mail Transfer
Diese dritte Spalte legt fest, welche Ports in den Top 1000 des jeweiligen Protokolls (TCP oder UDP) sind. Je höher der Wert, desto häufiger ist der jeweilige Port offen und in Benutzung gewesen.
Grundsätzlich können wir mit der Option –F den Portscan auf die Top 100-Ports beschränken. Damit reduzieren wir die Scanzeit deutlich, haben aber immer noch eine gute Übersicht über die wichtigsten offenen Ports. Doch es geht noch flexibler.
Mit der Option --top-ports <Anzahl> können wir die jeweils obersten X Ports auswählen. Prüfen wir das mit den Top Ten:
root@kali:~# nmap --top-ports 10 scanme.nmap.org Starting Nmap 7.40 ( nmap.org ) at 2017-05-21 19:39 CEST Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.22s latency). Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f PORT STATE SERVICE 21/tcp closed ftp 22/tcp open ssh 23/tcp closed telnet 25/tcp closed smtp 80/tcp open http 110/tcp closed pop3 139/tcp closed netbios-ssn 443/tcp closed https 445/tcp closed microsoft-ds 3389/tcp closed ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 0.80 seconds
Und tatsächlich werden explizit alle zehn Ports mit ihrem jeweiligen Status angezeigt. Hier finden wir die üblichen Verdächtigen eines Portscans.
Es geht allerdings auch umgekehrt: Da Nmap auf die oben genannte Datei zugreift, um die Ports für den Scan auszuwählen, können Sie diese Datei entsprechend manipulieren und z. B. nur die in Ihrem Unternehmen eingesetzten Ports eintragen bzw. belassen und alle anderen löschen. Im Ergebnis wird Nmap nur die in der Datei stehenden Ports scannen. Das erspart lange Listen hinter der Option –p.
Zusammenfassung und Ausblick
Nmap ist der de facto Standard für Portscanner. In diesem ersten Teil der Nmap-Artikelserie haben wir gesehen, wie Nmap grundsätzlich arbeitet und die Grundfunktionen Host Discovery und Portscanning kennengelernt. Im nächsten Teil lernen wir speziellere Portscans und die Dienst- und Versionserkennung kennen. Außerdem werfen wir einen Blick auf das Tuning von Nmap, um die Performance zu optimieren.