[[Vorlage(Getestet, focal, jammy)]]

{{{#!vorlage Wissen
[:Pakete_installieren: Installation von Programmen] 
[:Programme_kompilieren:] 
[:Terminal: Ein Terminal öffnen]
[:mit_Root-Rechten_arbeiten:]
}}}
[[Inhaltsverzeichnis(2)]]  

[[Bild(./nmap_logo.png, 85, left)]]
[https://nmap.org/ Nmap] {en} oder auch "Network Mapper" ist ein [:Portscan:Portscanner], der seit 1997 vom "Nmap-Developer-Team" entwickelt wird. Mit Nmap lassen sich Netzwerke und / oder Computer im Internet (d.h. mit eigener IP-Adresse) auf offene Ports und den darauf lauschenden Diensten prüfen. Nmap kann z.B. zum Testen der eigenen Firewall-Konfiguration eingesetzt werden oder auch zum Testen des eigenen Computers auf offene Ports und (eventuell unerwünschte) im Hintergrund laufende Dienste.

{{{#!vorlage Warnung
Das Scannen von Ports auf fremden Rechnern ist zwar nicht generell verboten, aber dennoch [wikipedia:Portscanner#Rechtliche_Aspekte:rechtlich umstritten]. Nmap als Portscanner sollte daher nur für eigene Rechner verwendet werden.
}}}

= Installation =
[[Bild(./nmap.png, 200, right)]] 
Folgendes Paket muss installiert [1] werden: 
{{{#!vorlage Paketinstallation
nmap
}}}  

[[Anker(Manuell)]]

== Aus dem Quelltext ==
Alternativ kann auch die neueste Version von nmap kompiliert [2] werden, da die Version aus den offiziellen Paketquellen meist etwas älter ist. Damit die für die Kompilation notwendigen Werkzeuge beisammen sind, muss zuerst das Paket [packages:build-essential:] installiert werden. 

{{{#!vorlage Paketinstallation
build-essential, main
}}}   
Nun lädt man den aktuellen Quelltext als Archivdatei [https://nmap.org/dist/ nmap-VERSION.tar.bz2] {dl} herunter. Um Nmap zu kompilieren, öffnet man ein Terminal [3] und führt die folgenden Befehle im Downloadverzeichnis aus:

{{{#!vorlage Befehl
bzip2 -cd nmap-VERSION.tar.bz2 | tar xvf -
cd nmap-VERSION
./configure
make
sudo checkinstall              ## oder sudo make install
}}}
Der letzte Befehl [:checkinstall:] erstellt und installiert ein DEB-Paket.

== Snap-Paket == 

Außerdem lässt sich `nmap` mittels eines [:Snap:]-Paketes installieren: 

{{{#!vorlage Befehl
sudo snap install nmap
}}}

Da das Snap-Paket allerdings in einer Sandbox läuft, muss ihm manuell mithilfe eines [:snap/#Schnittstellen-Interfaces-Slots-und-Plugs:Plugs], [https://snapcraft.io/docs/network-control-interface network-control] {en}, Zugang zum Netzwerk gewährt werden. 
Andernfalls scheitert `nmap`, wenn es mit [:Root-Rechte:Root-Rechten] gestartet wird. Dazu dient der Befehl `snap connect`: 

{{{#!vorlage Befehl 
sudo snap connect nmap:network-control
}}}  

= Bedienung =
Um Nmap zu starten, öffnet man ein Terminal [3] und führt den folgenden Befehl aus:  

{{{#!vorlage Befehl
sudo nmap [Art(en) des Scans] <Optionen> [Zielbezeichnung]
}}}

Als ''Zielbezeichnung'' sollte eine IP-Adresse (oder ein Adressbereich) angegeben werden. Wird Nmap ohne Angabe eines Ziels aufgerufen, so erhält man als Ausgabe eine kurze Übersicht über die verschiedenen Scan-Techniken und Optionen.  

{{{#!vorlage Hinweis
Nmap kann auch ohne Root-Rechte gestartet werden, allerdings ist der Funktionsumfang (also die Art der möglichen Scans) dann stark eingeschränkt. Alternativ können entsprechende [#Root-Privilegien Rechte] `nmap` dauerhaft erteilt werden. 
}}}

== Scan-Techniken ==
Nmap kennt verschiedene Scan-Techniken, die wie folgt aufgerufen werden können:  

||<-2 tableclass="zebra_start3" rowclass="titel" :> nmap - Scan-Techniken ||
||<rowclass="kopf" :>Scan Technik||Beschreibung||
||`-sT` ||Einfacher Connect Scan. Hierbei wird pro zu scannendem Port eine volle TCP-Verbindung auf- und wieder abgebaut. Dieser Scan steht auch zur Verfügung, wenn '''nmap''' ohne Root-Recht aufgerufen wird.||
||`-sS` ||"SYN-Stealth-Scan": Ähnlich `-sT`, allerdings wird keine komplette TCP-Verbindung aufgebaut, daher unauffälliger. (Standard bei Root-Rechten) ||
||`-sU`||Scannt UDP-Ports statt TCP.||
||`-sn`||Ping-Scan: Prüft nur auf Erreichbarkeit über ICMP-Echo-Request, TCP-SYN-Paket auf Port 443, TCP-ACK-Paket auf Port 80 und ICMP-Timestamp-Request. Sinnvoll, um ganze Netzbereiche auf aktive Hosts zu testen.||
|| `-sO` || Internet-Protokoll (''IP'') Scan||
|| `--scanflags <flags>` || Flags für TCP-Scan festlegen||
|| `-sI <Zombie Host[:Port]>` || [wikipedia_en:Idle_scan:Idle]-Scan (TCP) ||
|| `-6` || Scannt auch [wikipedia:IPv6:]-Adressen||


{{{#!vorlage Experten
Folgende etwas exotischere Techniken (und noch weitere) können in Einzelfällen sinnvoll sein. Es empfiehlt sich aber das vorherige Studium der [:man:Manpage] oder der [https://nmap.org/ Homepage] {en} von nmap, um die Besonderheiten und möglichen Erkenntnisse zu verstehen. 

||<-2 tableclass="zebra_start3" rowclass="titel" :> Besondere Scantechniken ||
||<rowclass="kopf" :>Scan Technik||Beschreibung||
||`-sF` , `-sN` , `-sX`||nmap sendet an die zu scannenden Ports bewusst manipulierte bzw. falsche TCP-Pakete. Anhand der Reaktion des Ports (bzw. des Servers) lassen sich ggf. Rückschlüsse ziehen, ob der Port offen oder von einer Firewall geschützt ist. Im Vergleich zu `-sT` oder `-sR` ebenfalls unauffälliger.||
||`-sA`, `-sW`||[wikipedia_en:Transmission_Control_Protocol#CONNECTION-ESTABLISHMENT:ACK] und [https://nmap.org/book/scan-methods-window-scan.html Window] {en} Scan. Für die Einrichtung einer Verbindung zu einem Port. Besonders gut zum Erkennen von Firewalls.||
}}}

== Optionen ==
Nmap kennt diverse Optionen, die mit den oben genannten Scan-Techniken kombiniert werden können:  


=== Versions- und OS-Erkennung ===
||<-2 tableclass="zebra_start3" rowclass="titel" :> nmap - Optionen (Version und OS) ||
||<rowclass="kopf" :>Option||Beschreibung||
||`-sV`||Versucht durch zusätzliche Tests, den Dienst auf jedem offenen Port zu identifizieren.||
||`-O`||OS-Detection: Versucht über besondere Eigenarten der Netzwerkimplementierungen das Betriebssystem des Zieles zu identifizieren.||
||`-A`||Kurzform für `-sV -O -sC --traceroute`||


=== Ports ===
Standardmäßig scannt Nmap alle Ports von 1 bis 1024, sowie die höheren, die in der Datei '''/usr/share/nmap/nmap-services''' aufgeführt sind. Folgende Optionen erzeugen ein abweichendes Verhalten:  

||<-2 tableclass="zebra_start3" rowclass="titel" :> nmap - Optionen (Ports) ||
||<rowclass="kopf" :>Option||Beschreibung||
||`-p X | X-Y | X,Y,Z`||Scannt Port X, die Ports X-Y oder die Ports X,Y,Z||
|| `--exclude-ports X | X-Y | X,Y,Z` || Schließt die angegebenen Ports von der mit `-p` angegebenen Reichweite aus || 
||`-p-`||Alle Ports scannen||
||`-F`||Schneller Scan, scannt nur die bekannten Ports, welche in der Datei '''nmap-services''' aufgeführt sind.||
||`-r`||Scannt alle Ports in numerischer Reihenfolge, was zu besserer Übersichtlichkeit mit der Option `-v` führen kann. Standardmäßig wählt nmap eine zufällige Reihenfolge.||

=== sonstige Optionen (Ausgabe/Firewalls/Spoofing) ===
||<-2 tableclass="zebra_start3" rowclass="titel" :> nmap - Optionen (Sonstige) ||
||<rowclass="kopf" :>Option||Beschreibung||
||`-Pn`||Normalerweise überprüft nmap vor einem vollen Portscan, ob der Rechner überhaupt existiert und online ist (s. Scan-Technik `-sn`). Diese Option schaltet das ab und wird benötigt um Hosts zu scannen, auf denen kein Webserver läuft und die Ping blockieren.||
||`-e eth0`||Weist nmap explizit an, die Netzwerkschnittstelle `eth0` zu nutzen. Normalerweise wählt nmap die Schnittstelle selber aus.||
||`-oN/oX/oS/oG DATEI`||Protokolliert den Scan in '''DATEI''' im Format ''XML'' / ''s|<rIpt'' / ''kIddi3'' / ''[:Grep:]able''||
||`-v(v), -d(d) `||Gibt zusätzliche Informationen während des Scans aus. Kann nie schaden.||
||`-S ADRESSE`||Nutzt [wikipedia_en:IP_address_spoofing:IP-Spoofing] für die angegebene ''ADRESSE''||
||`-D HOST1,HOST2[,CLIENT],...`||Nutzt den sog. ''decoy scan'': Die angegeben ''HOSTS'' sorgen dafür, dass das Scanziel den CLIENT nicht eindeutig als Scanstarter identifizieren kann|| 
|| `-T 0-5`|| Schnelligkeit einstellen||   

Eine aktuelle Übersicht aller Optionen findet sich auch auf der [https://nmap.org/man/de/man-briefoptions.html Projektseite] {de} oder kann über das Terminal mittels `nmap -h` abgerufen werden.

== Skripte ==
Neben dem einfachen Scannen von Ports unterstützt Nmap auch das Ausführen von komplexen Skripten über die [https://nmap.org/book/man-nse.html NSE-Engine] {en}. Dieses sind Textdateien in der Programmiersprache [:Lua:]. Viele vordefinierte Skripte sind im Verzeichnis '''/usr/share/nmap/scripts''' gespeichert. Ein Ordner für lokale Skripte kann auch über die Option `--datadir` mitgegeben werden, außerdem wird das Verzeichnis '''~/.nmap''' durchsucht. Jede Datei enthält am Anfang eine kurze Funktionsbeschreibung und die Aufrufparameter. Nmap-Skripte können für folgende Aufgaben eingesetzt werden:

 * Erweiterte Informationen zu einem Port
 * Schwachstellenanalyse - Für viele bekannte Schwachstellen existieren Nmap-Skripte die anzeigen, ob der jeweilige Server davon betroffen ist (z.B. ''ssl-heartbleed'').
 * [wikipedia:Brute-Force-Methode:Brute-Force]-Angriffe - Viele der Skripte versuchen sich über eine Liste mit Benutzernamen und Passwörtern auf einem bestimmten Server-Dienst anzumelden (z.B. ''ssh-brute'').

{{{#!vorlage Warnung
Das Ausnutzen von Schwachstellen oder das Überwinden von Passwortsperren (egal ob Brute-Force oder das einmalige Eintippen) sind rechtswidrig und können strafrechtlich verfolgt werden, wenn dies auf fremde Systeme erfolgt und ohne Absprache mit dem Systemverantwortlichen durchgeführt wird. Die jeweiligen Nmap-Skripte sollten daher nur für eigene Rechner verwendet werden.
}}}

Beispiel für das Auflisten aller unterstützten Verschlüsselungsfunktionen eines Webservers:
{{{#!vorlage Befehl
sudo nmap --script ssl-enum-ciphers -p 443 ubuntuusers.de
}}}
{{{
Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-25 10:01 CEST
Nmap scan report for ubuntuusers.de (213.95.41.4)
Host is up (0.044s latency).
Other addresses for ubuntuusers.de (not scanned): 2001:780:0:25:dead:beef:cafe:1
rDNS record for 213.95.41.4: ha.ubuntu-eu.org

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|     warnings: 
|       Key exchange (dh 2048) of lower strength than certificate key
|       Key exchange (secp256r1) of lower strength than certificate key
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|     warnings: 
|       Key exchange (dh 2048) of lower strength than certificate key
|       Key exchange (secp256r1) of lower strength than certificate key
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|     warnings: 
|       Key exchange (dh 2048) of lower strength than certificate key
|       Key exchange (secp256r1) of lower strength than certificate key
|_  least strength: A

Nmap done: 1 IP address (1 host up) scanned in 15.99 seconds
}}}

Weitere Optionen lassen sich auch auf der [https://nmap.org/book/man-nse.html Manpage] {en} der Scripting Engine einsehen.

== Root-Privilegien == 

Für bestimmte Arten von Scans, wie diesen [wikipedia:User_Datagram_Protocol:UDP]-Scan, oder das Starten von bestimmten [https://www.infosecmatter.com/why-does-nmap-need-root-privileges/#running-certain-nse-scripts Skripten] {en} benötigt `nmap` [:Root-Rechte:Root-Privilegien]: 

{{{#!vorlage Befehl
nmap -n -sU 192.168.0.1
}}}
{{{
You requested a scan type which requires root privileges.
QUITTING!
}}}

Ander Sacntypen, wie `-sn` sind in ihrere Funktionalität eingeschränkt. Dieser kann dann nur mit SYN-Paketen auf Port 80 und 443 operieren.

Eine Möglichkeit ist es, `nmap` mit [:sudo:] zu starten. Wenn man dies aber umgehen möchte, bietet es sich an, mehrere [https://man7.org/linux/man-pages/man7/capabilities.7.html Prozess-Privilegien] {en} unter Linux `nmap` zu erteilen, wodurch auch erweiterte Scan-Methoden laufen: 

{{{#!vorlage Befehl
sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap
}}}

Diese Technik funktioniert allerdings nicht für das [#Snap-Paket Snap-Paket]. 
Nach der Erteilung der Rechte muss `nmap` mit dem Schalter `--privileged` gestartet werden: 

{{{#!vorlage Befehl
nmap --privileged -n -sU 192.168.0.1
}}}
{{{
Starting Nmap 7.80 ( https://nmap.org ) at 2023-01-15 16:00 CET
...
}}}

Eine Übersicht aller `nmap`-Operationen, die Root-Rechte benötigen, findet sich auf [https://www.infosecmatter.com/why-does-nmap-need-root-privileges/#scan-methods-requiring-root-privileges dieser Seite] {en}.

= Zenmap =
[[Bild(./Zenmap_625.png, 250, right)]]  

[https://nmap.org/zenmap/ Zenmap] {en} ist ein grafische Benutzeroberfläche für Nmap.

{{{#!vorlage Hinweis
Zemmap ist als Python-2-Programm ab Ubuntu 20.04 nicht mehr sinnvoll verwendbar und deshalb auch nicht mehr in den offiziellen Paketquellen enthalten. Ein Verwendung unter bionic (Ubuntu 18.04) ist möglich.
}}}
Zenmap wird über folgendes Paket installiert [1]:  
{{{#!vorlage Paketinstallation
zenmap, universe
}}}


Gestartet wird Zenmap aus dem GNOME Menü unter  

 * ''"Anwendungen -> Internet -> Zenmap"''  

Auch mit Zenmap sind alle Scantechniken nur verfügbar, wenn das Programm mit Root-Rechten gestartet wird.
 
Mit Hilfe von Zenmap kann man die verschiedenen oben beschriebenen Scan-Techniken und Optionen bequem aus diversen Auswahlmenüs zusammenstellen. Zenmap stellt dann den entsprechenden Aufruf von Nmap in einer Zeile am unteren Rand des Fensters dar. 

= Deinstallation der manuell kompilierten Version =
Hat man nmap manuell über [:Makefile:make] installiert und das Verzeichnis, in das der Quelltext entpackt wurde, nicht gelöscht, kann man die selbstkompilierte Version über

{{{#!vorlage Befehl
cd nmap-VERSION
sudo make uninstall
}}}

wieder vollständig deinstallieren.

= Links =
 * [https://nmap.org/ Projektseite] {en}
  * [https://nmap.org/man/de/ Nmap-Referenz-Handbuch] {de}
 * [wikipedia:nmap:Nmap] - Wikipedia

# tag: Internet, Netzwerk, Server, Sicherheit, Shell