Nmap
Der Shell-Befehl nmap (network mapper) ist ein Portscanner und prüft, welche Dienste auf einem Rechner in einem Rechnernetz von aussen zugänglich sind. Um alle Möglichkeiten nutzen zu können, muss nmap als Benutzer "root" aufgerufen werden. Zu den Funktionen gehören:
- Erkennung des Betriebssystems des gescannten Systems anhand von Nmaps TCP-Fingerprinting
- Feststellung der Uptime des untersuchten Rechners
- Zuverlässige Identifizierung der offenen Dienste und deren Versionen
Trotz seines Rufs als Cracker-Instrument erweist sich Nmap auch als nützliches Werkzeug für Systemverwalter. Nmaps teilweise heftige Protokolltricks sind aber nicht immer frei von Risiken: wenn ein Mission-Critical-System unerwartet empfindlich reagiert und wegen eines Scans ausfällt, zeit dies dem Systemverwalter zwar eine wichtige Schwachstelle, allerdings ist dies auch nicht weiter hilfreich, wenn der Schaden den Informationsgewinn überwiegt.
Ein Scan des eigenen Rechners verwendet (auch bei Angabe der von aussen erreichbaren IP-Adresse) das Loopback Device und listet damit auch Ports, die sich von aussen nicht erreichen lassen.
Ab Version 4 sind auch ARP-Scans in die Scan-Engine integriert.
Für den Shell-Befehl nmap gibt es auch grafische Oberflächen: Nmap-gtk, Nmapfe (unter Unix) und Nmapwin (unter Windows). Dank PHP-Nmap lässt sich Nmap sogar per Webbrowser nutzen. Aufsetzend auf Nmap taugt Cancerbero zur Serverüberwachung.
Konzept
Nmap-Scans laufen standardmässig in drei Schritten ab:
- Ping: Das Zielsystem wird angepingt. Zur Wahl stehen dabei herkömmliche ICMP-Echo-Requests und Nmap-eigene Techniken, um aktive Hosts aufzuspüren.
- Lookup: Mit einem Reverse-Lookup wird die IP-Adresse des Systems in einen Namen aufgelöst.
- Scan: Mit der ausgewählten Technik werden die Ports der Ziele gescannt. Bei Bedarf bricht CTRL+C den Vorgang ab. Schreibt Nmap eine Protokolldatei, so kann es später an derselben Stelle fortfahren.
Nmap kennt vier Zustände, in denen sich ein Port befinden kann:
- Offen (open): Die Kommunikation auf diesem Port ist ungehindert möglich.
- Gefiltert (filtered): Der Port ist vermutlich durch eine Firewall geblockt. Finden SYN- oder Connect-Scan offene und gefilterte Ports, dann hat sich der Systemverwalter mit seiner vermeintlich sicheren DROP-Konfiguration selber ausgetrickst.
- Nicht gefiltert (unfiltered): ACK- oder Window-Scans spüren ungefilterte Ports auf. Grundsätzlich ist die Kommunikation auf dem Port möglich, für weitergehende Information sind andere Scantechniken nötig.
- Geschlossen (closed): Der Port ist entweder korrekt durch eine Firewall geschützt oder es lauscht kein Dienst auf ihm. In beiden Fällen gelingt keine Kommunikation.
Um sie festzustellen, wird einen Fülle von Scantechniken angeboten. Statt stur eine gewöhnliche TCP-Verbindung zu öffnen, sendet Nmap gezielt Pakete, die gegen etliche RFCs verstossen, und zieht aus der Raktion der gescannten Systeme seine Schlüsse. Nmap braucht dafür allerdings die Rechte von Benutzer "root", um mit Raw-Sockets arbeiten und die Pakete selbst zusammensetzen zu dürfen.
Installation
SUSE Linux
Über YaST.
Ubuntu 8.04 Hardy Heron
$ sudo apt-get install nmap
Optionen
Zur Auswahl stehen 15 Methoden, um Hosts zu scannen. Jede Methode kennt 20 Einstellungen, die teils zu sehr ausgefallenen Paketen führen.
Scantechnik | Syntax | Nutzen | Erklärung |
---|---|---|---|
TCP connect() | -sT | Ohne root-Rechte scannen | Der "connect()"-Scan verwendet die gleichnamige Betriebssystemfunktion, der Verbindungsaufbau verläuft RFC-konform mit einem Three-Way-Handshake: der Scanner sendet ein TCP-Paket mit gesetztem SYN-Flag und passenden Quell- bzw. Zielports. Horcht kein Dienst auf dem Zielport, so antwortet das System mit einem RST-Paket, das die Verbindung abbaut; andernfalls antwortet es mit einem Paket mit gesetzten SYN- und ACK-Flags. Ein ACK-Flag schliesst den Handshake ab, die Verbinung steht. Nmap beendet sie sofort mit einem Reset.
Port geschlossen: 192.168.5.22 -> 192.168.5.10 TCP 60319 > 80 [SYN] 192.168.5.10 -> 192.168.5.22 TCP 80 > 60319 [RST, ACK] Port offen: 192.168.5.22 -> 192.168.5.10 TCP 60320 > 80 [SYN] 192.168.5.10 -> 192.168.5.22 TCP 80 > 60320 [SYN, ACK] 192.168.5.22 -> 192.168.5.10 TCP 60320 > 80 [ACK] 192.168.5.22 -> 192.168.5.10 TCP 60320 > 80 [RST, ACK] |
TCP SYN | -sS | Unauffälliger Scan | Diese Technik schont die Netz- und Systemressourcen, funktioniert unabhängig vom Betriebssystem und bleibt unauffällig, benötigt aber die Rechte von Benutzer "root". Statt eine vollständige TCP-Verbindung aufzubauen, sendet Nmap nur das erste SYN-Paket aus dem Three-Way-Handshake. Ein geschlossener Port reagiert mit einem RST-Flag, um die halb geöffnete Verbindung sauber abzubauen. Ein offener Port antwortet mit einem SYN/ACK, das Nmap mit einem Reset quittiert. Der gescannte Dienst bemerkt nichts und hinterlässt keine verräterischen Einträge in Protokolldateien.
Port geschlossen: 192.168.5.22 -> 192.168.5.10 TCP 60319 > 80 [SYN] 192.168.5.10 -> 192.168.5.22 TCP 80 > 60319 [RST, ACK] Port offen: 192.168.5.22 -> 192.168.5.10 TCP 60320 > 80 [SYN] 192.168.5.10 -> 192.168.5.22 TCP 80 > 60320 [SYN, ACK] 192.168.5.22 -> 192.168.5.10 TCP 60320 > 80 [RST] Ein IDS lässt sich dadurch aber nicht täuschen. Die ungewöhnlich hohe Anzahl gleichzeitiger Verbindungswünsche zu wechselnden Ports entlarvt den Portscan. Snort protokolliert: [**] [100:1.1] spp_portscan: PORTSCAN DETECTED from 192.168.5.22 (THRESHOLD 4 connections exceeded in 0 seconds) [**] 10/05-19:40:49.540435 Solche Spuren vermeidet Nmap auf Wunsch mit einem geänderten Timing, bei dem sich der Scanner langsam vortastet. Die Pakete verlieren sich dann im übrigen Netzwerkehr, dem IDS gelingt es nicht mehr, die Einzelstücke des Scan einander zuzuordnen. |
FIN | -sF | Nahezu unbemerkt scannen | Verzicht auf jeglichen Verbindungsaufbau, egal ob halb oder vollständig. Es wird nur ein einziger Frame zum Zielsystem gesendet, die Varianten FIN, Xmas und Null unterscheiden sich nur durch die im TCP-Header gesetzten Flags, die in dieser Kombination unter normalen Umständen nicht vorkommen. Keiner setzt dabei das SYN-Flag. Ob der Port verfügbar ist zeigt sich anhand des Antwortpakets oder durch dessen Ausbleiben. Bei einem geschlossenen Port reagieren standardkonforme TCP-Stacks mit einem RST-Paket, das die Verbindung zurücksetzt. Lauscht ein Dienst auf dem Zielport, wird das gescannte System mit hoher Wahrscheinlichkeit keine Verbindung finden, zu der das Auftragspaket passt. Leider definieren die zutreffenden RFCs nur ungeanu, wie mit solchen Paketen zu verfahren ist. Daher reagieren die TCP-Stacks unterschiedlich, die Beispiele zeigen das Verhalten eines Linux-Rechners: er ignoriert die unerwarteten Pakete. Windows-Systeme nehmen hier eine Sonderrolle ein: sie antworten immer mit einem Reset der Verbindung - offene und geschlossene Ports sind nicht zu unterscheiden. Auch dieses Verhalten lässt auf das Betriebssystem schliessen, da sonst nur exotische TCP-Stacks so reagieren. Bleibt jede Antwort aus, so klassifiziert Nmap den Port als offen oder gefiltert, da Firewalls solche Pakete ebenfalls meist kommentarlos verwerfen. Wer es genau wissen will, arbeitet zusätzlich mit Version Detection (auch: Version Probe): sie verzichtet auf jede Tarnung und ermittelt offensiv den Zustand des Ports.
FIN-Scan, Port geschlossen: 192.168.5.22 -> 192.168.5.10 TCP 56485 > 80 [FIN] 192.168.5.10 -> 192.168.5.22 TCP 80 > 56485 [RST, ACK] FIN-Scan, Port offen: 192.168.5.22 -> 192.168.5.10 TCP 43406 > 80 [FIN] 192.168.5.22 -> 192.168.5.10 TCP 43407 > 80 [FIN] Xmas-Scan, Port geschlossen: 192.168.5.22 -> 192.168.5.10 TCP 49499 > 80 [FIN, PSH, URG] 192.168.5.10 -> 192.168.5.22 TCP 80 > 49499 [RST, ACK] Xmas-Scan, Port offen: 192.168.5.22 -> 192.168.5.10 TCP 47109 > 80 [FIN, PSH, URG] 192.168.5.22 -> 192.168.5.10 TCP 47110 > 80 [FIN, PSH, URG] Null-Scan, Port geschlossen: 192.168.5.22 -> 192.168.5.10 TCP 50508 > 80 [] 192.168.5.10 -> 192.168.5.22 TCP 80 > 50508 [RST, ACK] Null-Scan, Port offen: 192.168.5.22 -> 192.168.5.10 TCP 55971 > 80 [] 192.168.5.22 -> 192.168.5.10 TCP 55972 > 80 [] |
Xmas | -sX | Nahezu unbemerkt scannen | |
Null | -sN | Nahezu unbemerkt scannen | |
Ping | -sP | Aktive Hosts finden | |
Version Detection | -sV | Dienste genauer identifizieren | Es wird untersucht, welche Software auf einem Port lauscht. Vorher findet ein Portscan (Connect- oder SYN-Scan) mögliche Kandidaten. Version Detection startet eine gewöhnliche Verbindung und kommuniziert mit dem Dienst. Das hinterlässt fast immer Einträge in den Protokolldateien. Die gewonnenen Erkenntnisse vergleicht Nmap mit seiner Datenbasis in "nmap-service-probes". In Version 3.93 enthielt sie 2'895 Dienste-Signaturen.
Was bei einzelnen Diensten klappt, macht Nmap auch mit dem kompletten System: OS Detection, also die Erkennung des Betriebssystems aus der Ferne, gehört zu den fortgeschrittenen Techniken. Mit der gebotenen Qualität hält kein anderes Programm mit. OS Detection profitiert von subtilen Unterschieden im Verhalten der TCP-Stacks. Eine Datenbank verzeichnet die spezifischen Merkmale also sogenannte Fingerprints; Nmap 3.93 lieferte in "nmap-os-fingerprints" 1707 davon mit. Ein Abgleich mit dieser Liste entlarvt den Protokollstack und sein Betriebssystem. Der Scan arbeitet erstunlich unauffällig - er verzichtet auf Verbindungen zu speziellen Anwendungen und begnügt sich mit etwa 30 einfachen Frames. OS Detection beginnt mit einem gewöhnlichen Portscan und startet anschliessend acht kleine Tests, die eigens erzeugte Pakte zum Zielhost senden. Manche davon würden in einem normalen Netz nie vorkommen, ein IDS entdeckt sie recht leicht. Das Zielsystem bemerkt von dem Abtasten aber nichts. Nebenbei ermittelt die TCP-Timestamp-Option noch die Uptime des Systems. Erkennt Nmap das Zielsystem nicht, legt es dem Anwender alle gewonnenen Daten vor. Weiss der, um welches Betriebssystem es sich handelt, kann er auf der Submit-Seite die Signatur veröffentlichen. Auf diese Weise helfen Nmap-Benutzer die Erkennungsrate weiter zu verbessern. |
ACK | -sA | Firewalls erkennen | Ein ACK-Scan hilft weiter, wenn Nmap einen gefilterten Port nicht von einem offenen unterscheiden kann. Die einfache und unauffällige Technik schafft es zwar nicht, einen Port als offen zu klassifizieren, erkennt aber Firewalls. Nmap schickt ein einzelnes ACK-Paket zum Zielhost, der eigentlich mit einem Reset-Paket antworten müsste. Bleibt es aus oder trifft dafür ein ICMP-Destination-Unreachable-Paket ein, dann blockierte sehr wahrscheinlich eine Firewall die Übertragung - der Port ist also gefiltert. |
Window | -sW | Weiterentwickelter ACK-Scan | Der Windows-Scan ist eine abgewandelte Form des ACK-Scans, um offene Ports zu identifizieren. Der Scan beginnt mit einem ACK-Paket, wertet aber zusätzlich die Window-Size aus, die das Zielsystem in seiner Antwort einträgt. Aus RST-Paketen mit einer Fenstergrösse grösser null schliesst Nmap, dass der Port geöffnet ist. |
UDP | -sU | UDP-Dienste finden | Für den UDP-Scan existieren kaum Optionen, da das Protokoll ohne SYN oder sonstige Flags auskommt. UDP-Scanning ist also denkbar einfach: Anfragen an geschlossene Ports beantwortet das Zielsystem mit einem ICMP-Port-Unreachable-Paket, ein geöffneter Port liefert dagegen meist Daten zurück. Kommen keine Antwortpakete, klassifiziert Nmap den Port als offen oder gefiltert - im Zweifelsfall hilft Version Detecting weiter. Viele Systeme begrenzen ihre ICMP-Fehlermeldungen auf niedrige Raten von wenigen Paketen pro Sekunde. Nmap erkennt dieses Verhalten und arbeitet entsprechend langsamer. UDP-Scans können dann aber sehr lange dauern. |
IP Protocol | -sO | Unterstützte Protokolle feststellen | Der IP-Protocol-Scan verrät, welche Schickt-4-Protokolle ein Zielhost unterstützt. Bei einem Linux-Client findet Nmap z. B. ICMP, IGMP, TCP, UDP und IPV6 (für IPV6-über-IPV4-Tunnel). Der Scan probiert alle Protokollnummern (1 bis 255) durch und wartet auf Antworten. Diese Informationen lassen auch Rückschlüsse auf den Typ des gescannten Systems zu. Mit etwas Hintergrundwissen gelingt eine grobe Klassifizierung, da nur Router und spezielle Server z. B. VRRP oder CARP unterstützen. |
RPC | -sR | Informationen über RPC-Dienste | Identifizierung von auf RPC beruhenden Diensten wie NFS oder NIS und deren zugehörige Ports. RPC-Scans sind nur zusammen mit anderen Varianten sinnvoll, die vorher Informationen über geöffnete Ports liefern. Version detection aktiviert den RPC-Scan automatisch. Um auch versteckte RPC-Dienste aufzuspüren, nutzt diese Technik die spezielle RPC-Anweisung "PROC=0". Sie hat keine Auswirkung auf einen eventuell vorhandenen Dienst, entlockt ihm aber ein Lebenszeichen. Nicht-RPC-Dienste können mit der Anweisung nichts anfangen und bleiben stumm. Da RPC-Scans direkt mit einer Anwendung interagieren, gehören sie zu den auffälligsten Techniken, sie verraten im günstigsten Fall aber viel über das untersuchte System. |
Decoy | Manchmal hinterlassen selbst die besten Nmap-Scantechniken zuviel Spuren. Oder ein Penetration-Tester braucht detaillierte Informationen über einzelne Dienste, die ihm nur ein auffälliger Scan liefert. Muss er dennoch unerkannt bleiben, kanner versuchen die IDS und Systemverwalter der Gegenseite mit falschen Ködern abzulenken. Nmap nennt diese Technik "Decoy", sie emuliert zusätzlich zum echten Scanvorgang viele weitere Scans, die von einer definierten Anzahl gefälschter IP-Adressen ausgehen. Das erhöht zwar die Wahrscheinlichkeit, dass die Scans auffallen, macht es aber schwerer, den Verursacher in der Vielazhl von Kandidaten zu erkennen. Aus Sicht des Systemverwalters is Decoy Scanning ausserdem eine gute Möglichkeit zum Testen der Leistungsfähigkeit von Hots, Firewalls und IDS. Nmap emuliert prblemlos bis zu 128 gleichzeitige Hosts. Auf sehr leistungsfähigen, gut angebundenen Rechnern bietet es sich an, diese Grenze in der "MAX_DECOYS"-Konstante in "nmap.h" zu erhöhen und Nmap neu zu übersetzen. | ||
List | -sL | Dummy zur Kontrolle | |
Idle | -sI | Scannen über Dritte | Ein Idle Scan (auch: Blind Scanning) bedient sich eines unbeteiligten Dritten und tauscht mit dem gescannten System zu keinem Zeitpunkt Pakete aus. Das nötige IP Spoofing übernimmt Nmap selbst. Die Technik funktioniert aber nur unter folgenden Voraussetzungen:
Ob sich der Zombie eignet, erkennt Nmap recht schnell: Das Programm sendet sechs SYN/ACK-Pakete zum Zombie-Host und erwartet, dass die IPIDs der zurückgesandten RST-Pakete linear ansteigen. Andernfalls bricht der Scan mit folgender Meldung ab: "Idlescan is unable to obtain meaningful results from proxy". Steigen die IPIDs vorhersehbar, wiederholt Nmap den Prozess viermal und verwendet dazu Pakete mit der Absenderadresse des zu scannenden Systems. Der Zombie wird seine RST-Pakete jedoch zum Zielhost statt zum Scanner senden. Um dennoch ein Ergebnis zu erhalten, schickt Nmap ein weiteres SYN/ACK-Paket zum Zombie, diesmal wieder mit der eigenen Absenderadresse. Nur wenn die IPID im folgenden RST-Paket um fünf gestiegen ist, betrachtet Nmap den Idle Scan als durchführbar. Beim Untersuchen des Zielsystems geht Nmap ähnlich vor: Es sendet SYN-Pakete an das Zielsystem, verwendet als Absender aber die Zombie-Adresse. Anfragen an geschlossene Ports beantwortet das Scan-Ziel mit einem RST an den Zombie, der das unerwartete Paket ignoriert. Ein offener Port dagegen versucht die Verbindung durch ein SYN/ACK-Paket weiter aufzubauen. Von der Verbindung weiss der Zombie nichts und reagiert seinerseits mit einem RST. Dabei erhöht er seine IPID - den neuen Zählerstand kann der Scan-Host anschliessend vom Zombie abfragen. Um den Vorgang zu beschleunigen, geht Nmap von der sinnvollen Annahme aus, dass die meisten Ports ohnehin geschlossen sind. Nmap beginnt also mit 30 zufällig gewählten TCP-Ports, an die er je ein SYN-Paket sendet. Hat sich anschliessend die IPID erhöht, weiss Nmap wieviele Ports im gescannten Bereich offen waren. Im zweiten Anlauf halbiert ee die Zahl der Ports und grenzt den Bereich so lange ein, bis es die genauen Portnummern kennt. |
FTP Bounce | -b | Eher historisch |
Für routinemässige Checks bietet sich an, die IP-Adressen der riskanten Rechner in einer Textdatei zu sammeln. In Verbindung mit der Option "--excludefile" kann der Systemverwalter so ganze Netze scannen, ohne diese Rechner zu beeinträchtigen.
Dokumentation
Zur Dokumentation und für Vergleiche zwischen Scan-Durchgängen bringt Nmap vielfältige Varianten der Protokollierung mit. Die Option "-oA" schaltet drei sinnvolle Formate ein und bereitet einer manuellen Überprüfung sowie der maschinellen Verarbeitung den Weg. Für Vergleiche zwischen Scan-Durchläufen steht NDiff zur Verfügung.
Verwendung
Der aktuelle Rechner wird nach geöffneten (die TCP- und UDP-Ports von 0 bis 65535) gescannt.
# nmap -p 1-65535 localhost Starting Nmap 7.40 ( https://nmap.org ) at 2020-01-02 15:43 CET Nmap scan report for localhost (127.0.0.1) Host is up (0.000014s latency). Other addresses for localhost (not scanned): ::1 Not shown: 65529 closed ports PORT STATE SERVICE 25/tcp open smtp 333/tcp open texar 443/tcp open https 3306/tcp open mysql 8080/tcp open http-proxy 11211/tcp open memcache Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds
Der Rechner mit der angegebenen IP-Adresse wird nach geöffneten "well-known Ports" (die TCP- und UDP-Ports von 0 bis 1023) gescannt.
# nmap 192.168.10.25 Starting Nmap 4.53 ( http://insecure.org ) at 2008-11-26 17:13 CET Interesting ports on xxx.xxx.xx (192.168.10.25): Not shown: 1705 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh ... Nmap done: 1 IP address (1 host up) scanned in 15.631 seconds
Prüfung nach offenen TCP-Ports des Bereichs 1-1024 auf dem Rechner mit der IP-Adresse 10.0.5.2.
# nmap -sT -p 1-1024 10.0.5.2
Prüfung nach offenen Ports des Bereichs 1-65535 auf dem Rechner mit der IP-Adresse 10.0.5.2.
# nmap -p 1-65535 10.0.5.2
OS fingerprinting: Versuch, das Betriebssystem des Rechners mit der IP-Adresse 193.31.11.194 anhand des Antwortverhaltens offener ports zu bestimmen.
# nmap -O 192.168.10.25 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2006-03-24 16:51 CET Interesting ports on xxx.xxx.xx (192.168.10.25): (The 1635 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh ... 10083/tcp open amidxtape Device type: general purpose Running: FreeBSD 2.X|3.X|4.X OS details: FreeBSD 2.2.1 - 4.1 Uptime 8.006 days (since Thu Mar 16 16:43:10 2006)
MAC-Adressen herausfinden und in die Datei "file" schreiben.
$ nmap -sP 192.168.10.0/21 && arp -a > file
Erkennung der auf Port 22 von Rechner 192.168.10.25 laufenden SSH-Version.
$ nmap -sV 192.168.10.25 -p22 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2006-03-24 16:56 CET Interesting ports on xxx.xxx.xx (192.168.10.25): PORT STATE SERVICE VERSION 22/tcp open ssh SSH 1.2.17 (protocol 1.5)
Durchsuchen des Class-C-Subnetzes 192.168.6.0 per SYN-Scan (Option "-sS") und zusätzliches Sammeln von Informationen über Betriebssysteme (OS-Detection "-O"). Die IP-Adressen in Hostnamen aufzulösen ist hier sinnlos, "-n" deaktiviert deshalb den Reverse Lookup. Zur Entlastung der WAN-Verbindungen schaltet "-T Polite" auf eine weniger aggressive Timing-Variante um. Die Option "-oA remote" sorgt für eine ausführliche Protokollierung. Nmap schreibt drei Standardformate: einfach lesbares "remote.nmap", per grep leichter durchsuchbares "remote.gnmap" sowie die XM-Datei "remote.xml".
$ nmap -vv -sS -O -T Polite -n -oA remote 192.168.6.0/24
Aufruf der grafischen Oberfläche NmapFE unter KDE.
$ kdesu nmapfe