Nmap Zusammenfassung (ESP)
Tip
Lerne & übe AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).
Support HackTricks
- Sieh dir die subscription plans an!
- Tritt der 💬 Discord group, der telegram group bei, folge @hacktricks_live auf X/Twitter, oder schau dir die LinkedIn page und den YouTube channel an.
- Teile hacking tricks, indem du PRs in die HackTricks und HackTricks Cloud github repos einreichst.
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24
Parameter
Zu scannende IPs
<ip>,<net/mask>: IPs direkt angeben-iL <ips_file>: list_IPs-iR <number>: Anzahl zufälliger IPs, du kannst mögliche IPs mit--exclude <Ips>oder--excludefile <file>ausschließen.
Geräteerkennung
Standardmäßig startet Nmap eine Discovery-Phase bestehend aus: -PA80 -PS443 -PE -PP
-sL: Nicht invasiv, listet die Ziele und macht DNS-Anfragen zur Namensauflösung. Nützlich zu wissen, ob z.B. www.prueba.es/24 alle IPs unsere Ziele sind.-Pn: Kein Ping. Nützlich, wenn du weißt, dass alle aktiv sind (ansonsten kannst du viel Zeit verlieren, außerdem kann diese Option false negatives produzieren und sagen, sie seien nicht aktiv). Verhindert die Discovery-Phase.-sn: Kein Portscan. Nach Abschluss der Recon-Phase werden keine Ports gescannt. Relativ stealthy und erlaubt einen kleinen Netzwerkscan. Mit Rechten sendet es ein ACK (-PA) an 80, ein SYN (-PS) an 443 und ein Echo-Request sowie Timestamp-Request; ohne Rechte werden Verbindungen immer komplett durchgeführt. Wenn das Ziel das Netzwerk ist, verwendet es nur ARP (-PR). Falls mit einer anderen Option verwendet, werden nur die Pakete der anderen Option weggelassen.-PR: ARP-Ping. Wird standardmäßig beim Analysieren von Rechnern im eigenen Netzwerk verwendet, ist schneller als ICMP-Pings. Wenn du keine ARP-Pakete verwenden möchtest, nutze--send-ip.-PS <ports>: Sendet SYN-Pakete; antwortet ein Ziel mit SYN/ACK ist der Port offen (geantwortet mit RST, um die Verbindung nicht zu beenden), antwortet es mit RST ist er geschlossen, und bei keiner Antwort ist er unreachable. Ohne Privilegien wird eine vollständige Verbindung verwendet. Werden keine Ports angegeben, zielt es standardmäßig auf 80.-PA <ports>: Wie oben, aber mit ACK; die Kombination beider liefert bessere Ergebnisse.-PU <ports>: Ziel ist das Gegenteil — wird an Ports gesendet, die voraussichtlich geschlossen sind. Manche Firewalls prüfen nur TCP-Verbindungen. Bei geschlossen wird mit “port unreachable” geantwortet; bei anderer ICMP-Antwort oder keiner Antwort wird als destination unreachable markiert.-PE, -PP, -PM: ICMP-PINGS: echo reply, timestamp und addressmask. Werden genutzt, um herauszufinden, ob das Ziel aktiv ist.-PY<ports>: Sendet SCTP INIT-Probes standardmäßig an 80; INIT-ACK (open) oder ABORT (closed) oder nichts bzw. ICMP unreachable (inactive) können antworten.-PO <protocols>: Ein Protokoll wird in den Headern angegeben, standardmäßig 1(ICMP), 2(IGMP) und 4(Encap IP). Für ICMP, IGMP, TCP (6) und UDP (17) werden Protokoll-Header gesendet, für die restlichen nur der IP-Header. Ziel ist, durch absichtlich fehlerhafte Header Protocol unreachable- oder Antworten gleichen Protokolls zu provozieren, um zu wissen, ob es up ist.-n: Kein DNS-R: DNS immer--system-dns: Zwingt den OS-Resolver anstelle von Nmap’s parallel stub resolver. Nützlich wenn/etc/hosts, split-DNS oder Resolver-Plugins Daten liefern, die Nmap’s direkte Abfragen nicht liefern. Langsamer; seit Nmap 7.96 sind Forward-Lookups bereits parallelisiert, daher meist nur für Kompatibilität nötig.--dns-servers <server[,server],...>: Erzwingt spezifische DNS-Server für Reverse-Lookups. Nützlich bei internen Assessments, um authoritative oder interne Resolver direkt zu befragen oder-sL/Reverse-DNS-Traffic vom Standardresolver des Testers wegzulenken.
Port-Scan-Techniken
-sS: Schließt die Verbindung nicht vollständig ab, hinterlässt demnach keine Spur; sehr gut, wenn anwendbar (Privileges). Standardmäßig verwendet.-sT: Schließt die Verbindung komplett, hinterlässt Spuren, läuft aber sicher. Standardmäßig ohne Privilegien.-sU: Langsamer, für UDP. Häufig: DNS(53), SNMP(161,162), DHCP(67,68), (-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered (anderes ICMP), open/filtered (keine Antwort). Bei open/filtered sendet -sV zahlreiche Anfragen, um Versionen zu erkennen; erhöht deutlich die Zeit.-sY: SCTP-Scan, baut Verbindung nicht auf, daher keine Logs; funktioniert ähnlich wie -PY-sN,-sX,-sF: Null, Fin, Xmas — können manche Firewalls umgehen und Informationen extrahieren. Basieren darauf, dass standardkonforme Systeme auf Anfragen ohne gesetzte SYN/ACK/RST-Flags mit RST antworten sollten: open/filtered (keine Antwort), closed (RST), filtered (ICMP unreachable). Unzuverlässig auf Windows, Cisco, BSDI und OS/400; auf Unix funktioniert es.-sM: Maimon-Scan: Sendet FIN und ACK Flags, wurde für BSD benutzt; derzeit wird meist alles als closed zurückgemeldet.-sA, sW: ACK und Window, werden verwendet um Firewalls zu erkennen, also ob Ports gefiltert sind. -sW unterscheidet open/closed weil offene mit anderem Window-Wert antworten: open (RST mit window ≠ 0), closed (RST window = 0), filtered (ICMP unreachable oder keine Antwort). Nicht alle Rechner verhalten sich so; wenn alles closed ist, funktioniert die Methode nicht; bei ein paar open ist sie in Ordnung; bei vielen open und wenigen closed ist es umgekehrt.-sI: Idle scan. Für Fälle mit aktivem Firewall aber einem bekannten IP, zu dem nicht gefiltert wird (oder wenn Anonymität gewünscht) kann der zombie-scanner genutzt werden (funktioniert für alle Ports). Um mögliche Zombies zu finden, kann das script ipidseq oder exploit auxiliary/scanner/ip/ipidseq verwendet werden. Dieser Scan basiert auf der IPID-Nummer der IP-Pakete.--badsum: Sendet einen falschen Checksum; Rechner würden die Pakete verwerfen, aber Firewalls könnten antworten — genutzt zur Firewall-Erkennung.-sZ: “Weird” SCTP-Scanner; beim Senden von Probes mit cookie echo fragments sollten sie bei offenem Port verworfen oder bei geschlossenem Port mit ABORT beantwortet werden. Kann Firewalls passieren, durch die init nicht geht; Nachteil: unterscheidet nicht zwischen filtered und open.-sO: IP-Protokollscan. Sendet fehlerhafte und leere Header, in denen manchmal nicht einmal das Protokoll erkennbar ist. Wenn ICMP protocol unreachable eintrifft -> closed; wenn ICMP port unreachable -> open; bei anderen Fehlern -> filtered; bei keiner Antwort -> open|filtered.-b <server>: FTP-Relay -> Wird verwendet, um einen Host über einen anderen zu scannen, indem man sich am FTP eines anderen Hosts verbindet und ihn auffordert, Dateien an die zu scannenden Ports zu senden; anhand der Antworten kann man öffnen/geschlossen erkennen. Syntax: [<user>:<password>@]<server>[:<port>] Praktisch kaum noch nützlich, da fast alle FTP-Server dies nicht mehr erlauben.
Fokus Analyse
-p: Wird verwendet, um Ports anzugeben. Um alle 65.535 Ports auszuwählen: -p- oder -p all. Nmap hat eine interne Klassifikation basierend auf Popularität. Standardmäßig nutzt es die Top-1000-Ports. Mit -F (fast scan) werden die Top-100 analysiert. Mit –top-ports
-sV Version-Scanning, Intensität von 0 bis 9 regelbar, Standard ist 7.
–version-intensity
–version-light Alias für --version-intensity 2. Sehr nützlich für einen ersten Durchlauf gegen große Bereiche oder langsame UDP-Services.
–version-all Alias für --version-intensity 9. Erzwingt alle Probes und ist nützlich, wenn ein Service nur auf seltene Probes antwortet.
–allports Erzwingt Version-Detection auf Ports, die von nmap-service-probes ausgeschlossen sind (insbesondere TCP/9100). Vorsicht: bei manchen Druckern oder Raw-Socket-Listenern kann das dazu führen, dass sie die Probe-Daten ausdrucken.
-O OS-Detection
–osscan-limit Für zuverlässige Host-Erkennung werden mindestens ein offener und ein geschlossener Port benötigt. Wenn diese Bedingung nicht erfüllt ist und diese Option gesetzt wurde, versucht es keine OS-Prediction (spart Zeit).
–osscan-guess Wenn OS-Detection nicht perfekt ist, versucht diese Option intensiver zu raten.
Scripts
–script
Um Default-Scripts zu nutzen, verwende -sC oder –script=default
Verfügbare Typen: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, und vuln
- Auth: Führt alle verfügbaren authentication-Scripts aus
- Default: Führt grundlegende default tool scripts aus
- Discovery: Ruft Informationen vom Target oder Opfer ab
- External: Script zum Nutzen externer Ressourcen
- Intrusive: Nutzt Scripts, die als intrusive gegenüber Ziel/Opfer gelten
- Malware: Prüft auf durch Malware geöffnete Verbindungen oder backdoors
- Safe: Führt nicht-intrusive Scripts aus
- Vuln: Findet die bekanntesten Vulnerabilities
- All: Führt absolut alle verfügbaren NSE-Extension-Scripts aus
Zum Suchen von Scripts:
nmap –script-help=“http-*” -> Those starting with http-
nmap –script-help=“not intrusive” -> All except those
nmap –script-help=“default or safe” -> Those in either or both
nmap –script-help=“default and safe” –> Those in both
nmap –script-help=“(default or safe or intrusive) and not http-*”
–script-args
–script-args-file
–script-help
–script-trace —> Gibt Informationen darüber, wie das Script voranschreitet
–script-updatedb
Um ein Script zu nutzen, einfach eingeben: nmap –script Script_Name target –> Beim Ausführen des Scripts werden sowohl das Script als auch der Scanner ausgeführt, daher können auch Scanner-Optionen hinzugefügt werden. Wir können “safe=1” hinzufügen, um nur sichere Scripts auszuführen.
Zeitsteuerung
Nmap kann Zeiten in Sekunden, Minuten, ms modifizieren: –host-timeout Argumente 900000ms, 900, 900s und 15m bedeuten dasselbe.
Nmap teilt die Gesamtanzahl der zu scannenden Hosts in Gruppen und analysiert diese Gruppen blockweise; es wechselt nicht zum nächsten Block, bis alle im aktuellen Block analysiert sind (und der Nutzer erhält keine Updates, bis der Block fertig ist). Daher ist es für Nmap optimal, große Gruppen zu verwenden. Standardmäßig in Klasse C werden 256 verwendet.
Das kann mit –min-hostgroup
Du kannst die Anzahl paralleler Scanner kontrollieren, aber besser ist es nicht (Nmap hat bereits automatische Kontrolle basierend auf Netzwerkstatus): –min-parallelism
Wir können das RTT-Timeout anpassen, ist aber in der Regel nicht nötig: –min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout
Wir können die Anzahl der Versuche ändern: –max-retries
Wir können die Scan-Zeit eines Hosts verändern: –host-timeout
Wir können die Zeit zwischen jedem Test erhöhen, um zu verlangsamen: –scan-delay ; –max-scan-delay
Wir können die Anzahl der Pakete pro Sekunde ändern: –min-rate
Viele Ports brauchen lange zur Antwort, wenn sie gefiltert oder geschlossen sind. Wenn wir nur an offenen interessiert sind, können wir schneller gehen mit: –defeat-rst-ratelimit
Um zu definieren, wie aggressiv Nmap sein soll: -T paranoid|sneaky|polite|normal|aggressive|insane
-T (0-1)
-T0 –> Scannt nur 1 Port gleichzeitig und wartet 5min bis zum nächsten
-T1 und T2 –> Sehr ähnlich, aber warten nur 15s bzw. 0.4s zwischen den Tests
-T3 –> Standardbetrieb, beinhaltet paralleles Scannen
-T4 –> –max-rtt-timeout 1250ms –min-rtt-timeout 100ms –initial-rtt-timeout 500ms –max-retries 6 –max-scan-delay 10ms
-T5 –> –max-rtt-timeout 300ms –min-rtt-timeout 50ms –initial-rtt-timeout 250ms –max-retries 2 –host-timeout 15m –max-scan-delay 5ms
Firewall/IDS
Diese erlauben keinen Zugriff auf Ports und analysieren Pakete.
-f Fragmentiert Pakete, standardmäßig in 8-Byte-Chunks nach dem Header; um diese Größe zu spezifizieren nutze ..mtu (bei dem Fall benutze -f nicht). Der Offset muss ein Vielfaches von 8 sein. Version-Scanner und Scripts unterstützen Fragmentation nicht
-D decoy1,decoy2,ME Nmap sendet Scans, aber mit anderen IP-Adressen als Ursprung, so wird deine Adresse verschleiert. Wenn du ME in die Liste setzt, platziert Nmap dich dort; besser 5 oder 6 Einträge vor deiner eigenen zu setzen, um dich komplett zu maskieren. Zufällige IPs können mit RND:
Um zufällige IPs zu nutzen: nmap -D RND:10 Target_IP
-S IP Für den Fall, dass Nmap deine IP nicht erkennt, kannst du sie hier angeben. Dient auch dazu, es so aussehen zu lassen, als würde ein anderer Host scannen.
-e
Viele Administratoren lassen bestimmte Quellports offen, damit Dienste funktionieren (z.B. DNS oder FTP). Um diese Schwachstelle zu finden, hat Nmap: –source-port
–data
–data-string
–data-length
Um das IP-Paket vollständig zu konfigurieren nutze –ip-options
Wenn du die Optionen in gesendeten und empfangenen Paketen sehen willst, gib –packet-trace an. Für mehr Informationen und Beispiele zur Nutzung von IP-Options mit Nmap siehe http://seclists.org/nmap-dev/2006/q3/52.
–ttl
–randomize-hosts Um den Angriff weniger offensichtlich zu machen
–spoof-mac <MAC address, prefix, or vendor name> Um die MAC zu ändern, Beispiele: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, und Cisco
–proxies
-sP Um Hosts im eigenen Netzwerk per ARP zu entdecken
Viele Administratoren erstellen Firewall-Regeln, die alle Pakete von einem bestimmten Port durchlassen (z.B. 20,53,67). Wir können Nmap sagen, unsere Pakete von diesen Ports zu senden: nmap –source-port 53 IP
Ausgaben
-oN file Normal output
-oX file XML output
-oS file script kiddies output
-oG file Greppable output. Funktioniert noch, ist aber deprecated; XML ist das bessere Format für Automation, da neue Nmap-Features dort zuerst hinzugefügt werden. Verwende -oN, wenn du --resume willst, und bevorzuge -oX/-oA für maschinelle Verarbeitung.
-oA file Alle außer -oS
–webxml Ändert die XML-Stylesheet-Referenz zu https://nmap.org/svn/docs/nmap.xsl, wodurch die XML einfacher als HTML auf einer anderen Maschine geöffnet werden kann.
–stylesheet <path|url> Nutze ein custom XSL-Stylesheet. --webxml ist nur eine Abkürzung für das gehostete offizielle Stylesheet.
-v level verbosity
-d level debugging
–reason Grund von Host- und Zustand-Angaben
–stats-every time Gibt alle angegebene Zeit Status-Updates
–packet-trace Um zu sehen, welche Pakete rausgehen; Filter möglich wie: –version-trace oder –script-trace
–open zeigt open, open|filtered und unfiltered
–resume file Setzt einen unterbrochenen Scan anhand einer normal (-oN) oder grepable (-oG) Ausgabedatei fort. Im aktuellen Workflow ist es üblich, -oN für Resume-Fähigkeit und -oX für Parsing beizubehalten.
Beispiel für Parsing/HTML-Konvertierungs-Workflows:
# Send only XML to stdout for tooling
nmap -sV -oX - 10.10.10.0/24
# Portable HTML-friendly XML
nmap -sV --webxml -oX scan.xml 10.10.10.10
Verschiedenes
-6 Ermöglicht IPv6
-A entspricht -O -sV -sC –traceroute
Laufzeit
Während Nmap läuft, können wir Optionen ändern:
v / V Erhöhen / Verringern des Verbosity-Levels
d / D Erhöhen / Verringern des Debugging-Levels
p / P Ein- / Ausschalten der Paketverfolgung
? Zeigt einen Hilfe-Bildschirm für die Laufzeit-Interaktion
Vulscan
Nmap-Skript, das auf Basis von in einer Offline-Datenbank erfassten Service-Versionen (heruntergeladen von anderen wichtigen Quellen) nach möglichen Schwachstellen sucht
Die DBs, die es verwendet, sind:
- Scipvuldb.csv | http://www.scip.ch/en/?vuldb
- Cve.csv | http://cve.mitre.org
- Osvdb.csv | http://www.osvdb.org
- Securityfocus.csv | http://www.securityfocus.com/bid/
- Securitytracker.csv | http://www.securitytracker.com
- Xforce.csv | http://xforce.iss.net
- Exploitdb.csv | http://www.exploit-db.com
- Openvas.csv | http://www.openvas.org
Zum Herunterladen und Installieren im Nmap-Ordner:
wget http://www.computec.ch/projekte/vulscan/download/nmap_nse_vulscan-2.0.tar.gz && tar -czvf nmap_nse_vulscan-2.0.tar.gz vulscan/ && sudo cp -r vulscan/ /usr/share/nmap/scripts/
Man muss außerdem die DB-Pakete herunterladen und in /usr/share/nmap/scripts/vulscan/ ablegen.
Verwendung:
Um alle zu nutzen: sudo nmap -sV –script=vulscan HOST_TO_SCAN
Um eine spezifische DB zu nutzen: sudo nmap -sV –script=vulscan –script-args vulscandb=cve.csv HOST_TO_SCAN
Wenn Sie Internetzugang haben, ist Nmap’s offizielles vulners NSE-Skript in der Regel die am schnellsten gepflegte Alternative zur versionsbasierten Anreicherung:
nmap -sV --script vulners --script-args mincvss=7.0 <IP>
This script belongs to the safe, external, and vuln categories. Because it depends on how accurate -sV was, validate hits manually when the service banner is generic or proxied.
Kürzliche praktische Hinweise (7.94+)
- Seit Nmap 7.94 verwenden UDP-Port-Scans (
-sU) und Versionserkennung (-sV) dieselbe Payload-Quellenmap-service-probes. Eine UDP-Antwort aus der Scan-Phase kann sofort in die Versionsabstimmung einfließen, daher ist-sU -sV --version-lightjetzt ein guter erster Durchlauf gegen große oder verlustbehaftete Ranges. - Seit Nmap 7.94 kann
-sVauch UDP-Services prüfen, die hinter DTLS verborgen sind, was für moderne Management-/ICS-Geräte nützlich ist, die UDP-Protokolle in DTLS kapseln. - Nmap 7.95 fügte eine große Anzahl neuer Service-Fingerprints hinzu, darunter
grpc,mysqlx,remotemouseundtuya, sowie neue, auf ICS fokussierte NSE-Abdeckung wiehartip-infoundiec61850-mms. Wenn Sie OT- oder eingebettete Umgebungen scannen, ist das Aktualisieren von Nmap wichtiger, als zu früh eigene Probes hinzuzufügen. - Seit Nmap 7.96 sind auch Forward-DNS-Lookups parallelisiert. Große Hostnamenlisten sind jetzt deutlich schneller, daher sollte
--system-dnsin der Regel für Kompatibilitätsprobleme und nicht zur Leistungssteigerung verwendet werden.
Nmap Service-Scan x16 beschleunigen
According to this post you can speed up the nmap service analysis by modifying all the totalwaitms values in /usr/share/nmap/nmap-service-probes to 300 and tcpwrappedms to 200.
Moreover, probes which do not have a specifically defined servicewaitms use a default value of 5000. Therefore, we can either add values to each of the probes, or we can compile nmap ourselves and change the default value in service_scan.h.
If you don’t want to change the values of totalwaitms and tcpwrappedms at all in the /usr/share/nmap/nmap-service-probes file, you can edit the parsing code such that these values in the nmap-service-probes file are completely ignored.
Statisches Nmap für eingeschränkte Umgebungen bauen
In gehärteten oder minimalen Linux-Umgebungen (Container, Appliances) schlagen dynamisch gelinkte Nmap-Binaries häufig fehl, weil Runtime-Loader oder Shared Libraries fehlen (z. B. /lib64/ld-linux-x86-64.so.2, libc.so). Ein selbst erstelltes statisch gelinktes Nmap und das Bündeln der NSE-Daten erlaubt die Ausführung ohne Installation von Systempaketen.
Hochrangige Vorgehensweise
- Use a clean amd64 Ubuntu builder via Docker.
- Build OpenSSL and PCRE2 as static libraries.
- Build Nmap linking statically and using the included libpcap/libdnet to avoid dynamic deps.
- Bundle NSE scripts and data directories with the binary.
Zielarchitektur feststellen (Beispiel)
uname -a
# If building from macOS/ARM/etc., pin the builder arch:
docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc 'echo ok'
Schritt 1 — Toolchain vorbereiten
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get install -y --no-install-recommends \
build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \
automake autoconf libtool m4 zlib1g-dev
Schritt 2 — OpenSSL (1.1.1w) statisch kompilieren
OSSL="1.1.1w"
curl -fsSLO "https://www.openssl.org/source/openssl-$OSSL.tar.gz"
tar xzf "openssl-$OSSL.tar.gz" && cd "openssl-$OSSL"
./Configure no-shared no-zlib linux-x86_64 -static --prefix=/opt/ossl
make -j"$(nproc)" && make install_sw
cd /tmp
Schritt 3 — PCRE2 (10.43) statisch bauen
PCRE2=10.43
curl -fsSLO "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2"
tar xjf "pcre2-$PCRE2.tar.bz2" && cd "pcre2-$PCRE2"
./configure --disable-shared --enable-static --prefix=/opt/pcre2
make -j"$(nproc)" && make install
cd /tmp
Schritt 4 — Statisches Nmap kompilieren (7.98)
NMAP=7.98
curl -fsSLO "https://nmap.org/dist/nmap-$NMAP.tar.bz2"
tar xjf "nmap-$NMAP.tar.bz2" && cd "nmap-$NMAP"
export CPPFLAGS="-I/opt/ossl/include -I/opt/pcre2/include"
export LDFLAGS="-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc"
export LIBS="-lpcre2-8 -ldl -lpthread -lz"
./configure \
--with-openssl=/opt/ossl \
--with-libpcre=/opt/pcre2 \
--with-libpcap=included \
--with-libdnet=included \
--without-zenmap --without-ndiff --without-nmap-update
# Avoid building shared libpcap by accident
sed -i -e "s/^shared: /shared: #/" libpcap/Makefile || true
make -j1 V=1 nmap
strip nmap
Wichtige Punkte
- -static, -static-libstdc++, -static-libgcc erzwingen statische Verlinkung.
- Die Verwendung von –with-libpcap=included/–with-libdnet=included vermeidet system-shared libs.
- sed tweak neutralisiert ein shared libpcap target, falls vorhanden.
Schritt 5 — Binary und NSE-Daten bündeln
mkdir -p /out/nmap-bundle/nmap-data
cp nmap /out/nmap-bundle/nmap-linux-amd64-static
cp -r scripts nselib /out/nmap-bundle/nmap-data/
cp nse_main.lua nmap-services nmap-protocols nmap-service-probes \
nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc \
/out/nmap-bundle/nmap-data/ 2>/dev/null || true
tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle
Verification and ops notes -> Überprüfungs- und Betriebsnotizen
- Use file on the artifact to confirm it is statically linked.
- Keep NSE data with the binary to ensure script parity on hosts without Nmap installed.
- Even with a static binary, execution may be blocked by AppArmor/seccomp/SELinux; DNS/egress must still work.
- Deterministic builds reduce supply-chain risk vs downloading opaque “static” binaries.
One-liner (Dockerized)
Bauen, bündeln und Artefakt-Informationen ausgeben
```bash docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc ' set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \ automake autoconf libtool m4 zlib1g-devOSSL=“1.1.1w”; curl -fsSLO “https://www.openssl.org/source/openssl-$OSSL.tar.gz”
&& tar xzf “openssl-$OSSL.tar.gz” && cd “openssl-$OSSL”
&& ./Configure no-shared no-zlib linux-x86_64 -static –prefix=/opt/ossl
&& make -j“$(nproc)“ && make install_sw && cd /tmp
PCRE2=10.43; curl -fsSLO “https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2”
&& tar xjf “pcre2-$PCRE2.tar.bz2” && cd “pcre2-$PCRE2”
&& ./configure –disable-shared –enable-static –prefix=/opt/pcre2
&& make -j“$(nproc)“ && make install && cd /tmp
NMAP=7.98; curl -fsSLO “https://nmap.org/dist/nmap-$NMAP.tar.bz2”
&& tar xjf “nmap-$NMAP.tar.bz2” && cd “nmap-$NMAP”
&& export CPPFLAGS=“-I/opt/ossl/include -I/opt/pcre2/include”
&& export LDFLAGS=“-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc”
&& export LIBS=“-lpcre2-8 -ldl -lpthread -lz”
&& ./configure –with-openssl=/opt/ossl –with-libpcre=/opt/pcre2 –with-libpcap=included –with-libdnet=included –without-zenmap –without-ndiff –without-nmap-update
&& sed -i -e “s/^shared: /shared: #/” libpcap/Makefile || true
&& make -j1 V=1 nmap && strip nmap
mkdir -p /out/nmap-bundle/nmap-data
&& cp nmap /out/nmap-bundle/nmap-linux-amd64-static
&& cp -r scripts nselib /out/nmap-bundle/nmap-data/
&& cp nse_main.lua nmap-services nmap-protocols nmap-service-probes nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc /out/nmap-bundle/nmap-data/ 2>/dev/null || true
&& tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle
&& echo “===== OUTPUT =====”; ls -lah /out; echo “===== FILE TYPE =====”; file /out/nmap-bundle/nmap-linux-amd64-static || true
’
</details>
## Referenzen
- [Kompilieren eines statischen Nmap-Binaries für Einsätze in eingeschränkten Umgebungen](https://www.pentestpartners.com/security-blog/compiling-static-nmap-binary-for-jobs-in-restricted-environments/)
- [Static Nmap Binary Generator (Hilfsprogramm)](https://github.com/0x5ubt13/static_nmap_binary_generator)
- [OpenSSL-Quellen](https://www.openssl.org/source/)
- [PCRE2-Veröffentlichungen](https://github.com/PCRE2Project/pcre2/releases)
- [Nmap Quell-Tarballs](https://nmap.org/dist/)
- [Nmap Änderungsprotokoll](https://nmap.org/changelog.html)
- [Nmap Ausgabeformate](https://nmap.org/book/man-output.html)
> [!TIP]
> Lerne & übe AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Lerne & übe GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Lerne & übe Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Durchsuche den [**vollständigen HackTricks Training-Katalog**](https://hacktricks-training.com/courses/) nach den Assessment-Tracks (**ARTA/GRTA/AzRTA**) und [**Linux Hacking Expert (LHE)**](https://hacktricks-training.com/courses/lhe/).
>
> <details>
>
> <summary>Support HackTricks</summary>
>
> - Sieh dir die [**subscription plans**](https://github.com/sponsors/carlospolop) an!
> - **Tritt** der 💬 [**Discord group**](https://discord.gg/hRep4RUj7f), der [**telegram group**](https://t.me/peass) **bei**, **folge** [**@hacktricks_live**](https://twitter.com/hacktricks_live) auf **X/Twitter**, oder schau dir die [**LinkedIn page**](https://www.linkedin.com/company/hacktricks/) und den [**YouTube channel**](https://www.youtube.com/@hacktricks_LIVE) an.
> - **Teile hacking tricks, indem du PRs in die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos einreichst.
>
> </details>


