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
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 werden die angegebenen Top-Ports analysiert (von 1 bis 65.335). Ports werden in zufälliger Reihenfolge geprüft; um dies zu verhindern, benutze -r. Man kann auch spezifische Ports wählen: 20-30,80,443,1024- (letzteres bedeutet ab 1024 aufwärts). Ports können nach Protokoll gruppiert werden: U:53,T:21-25,80,139,S:9. Man kann auch einen Bereich innerhalb von Nmap’s popular ports wählen: -p [-1024] analysiert bis Port 1024 aus denen, die in nmap-services enthalten sind. –port-ratio Analysiert die häufigsten Ports innerhalb eines Verhältnisses zwischen 0 und 1

-sV Version-Scanning, Intensität von 0 bis 9 regelbar, Standard ist 7.

–version-intensity Regelt die Intensität; je niedriger, desto weniger und nur wahrscheinlichere Probes werden gesendet. Damit lässt sich die UDP-Scan-Zeit deutlich verkürzen.

–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 ||||all[,…]

–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 ; –max-hostgroup geändert werden (stellt parallele Scan-Gruppengrößen ein)

Du kannst die Anzahl paralleler Scanner kontrollieren, aber besser ist es nicht (Nmap hat bereits automatische Kontrolle basierend auf Netzwerkstatus): –min-parallelism ; –max-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 ; –max-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: erzeugt werden, um zufällige IPs zu erzeugen. Funktioniert nicht mit TCP-Version-Detektoren ohne Verbindung. Im internen Netzwerk sind aktive IPs interessant, sonst ist es leicht zu erkennen, dass nur du aktiv bist.

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 Um die Schnittstelle zu wählen

Viele Administratoren lassen bestimmte Quellports offen, damit Dienste funktionieren (z.B. DNS oder FTP). Um diese Schwachstelle zu finden, hat Nmap: –source-port ;-g Sie sind äquivalent

–data Um hexadezimale Daten zu senden: –data 0xdeadbeef und –data \xCA\xFE\x09

–data-string Um normalen Text zu senden: –data-string “Scan conducted by Security Ops, extension 7192”

–data-length Nmap sendet standardmäßig nur Header; mit dieser Option fügt es eine Anzahl zufälliger Bytes hinzu

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 Um Proxies zu verwenden; manchmal hält ein Proxy nicht so viele offene Verbindungen wie Nmap möchte, daher müsste die Parallelität angepasst werden: –max-parallelism

-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:

  1. Scipvuldb.csv | http://www.scip.ch/en/?vuldb
  2. Cve.csv | http://cve.mitre.org
  3. Osvdb.csv | http://www.osvdb.org
  4. Securityfocus.csv | http://www.securityfocus.com/bid/
  5. Securitytracker.csv | http://www.securitytracker.com
  6. Xforce.csv | http://xforce.iss.net
  7. Exploitdb.csv | http://www.exploit-db.com
  8. 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-Quelle nmap-service-probes. Eine UDP-Antwort aus der Scan-Phase kann sofort in die Versionsabstimmung einfließen, daher ist -sU -sV --version-light jetzt ein guter erster Durchlauf gegen große oder verlustbehaftete Ranges.
  • Seit Nmap 7.94 kann -sV auch 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, remotemouse und tuya, sowie neue, auf ICS fokussierte NSE-Abdeckung wie hartip-info und iec61850-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-dns in 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-dev

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

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>