Nmap Sommario (ESP)

Tip

Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Supporta HackTricks
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24

Parametri

IP da scansionare

  • <ip>,<net/mask>: Indicare gli IP direttamente
  • -iL <ips_file>: list_IPs
  • -iR <number>: Numero di IP casuali, è possibile escludere IP possibili con --exclude <Ips> o --excludefile <file>.

Rilevamento dispositivi

Per default Nmap avvia una fase di discovery consistente in: -PA80 -PS443 -PE -PP

  • -sL: Non è invasiva, elenca i target effettuando richieste DNS per risolvere i nomi. È utile per sapere se ad esempio www.prueba.es/24 tutti gli IP sono i nostri target.
  • -Pn: No ping. Utile se sai che sono tutti attivi (altrimenti si può perdere molto tempo, ma questa opzione può anche produrre falsi negativi dicendo che non sono attivi), evita la fase di discovery.
  • -sn : No port scan. Dopo la fase di ricognizione non scandisce le porte. È relativamente stealthy e permette una scansione di rete leggera. Con privilegi invia un ACK (-PA) a 80, un SYN (-PS) a 443 e una echo request e una Timestamp request, senza privilegi completa sempre le connessioni. Se il target è la rete, usa solo ARP (-PR). Se usato con un’altra opzione, vengono ignorati solo i pacchetti dell’altra opzione.
  • -PR: Ping ARP. Usato di default quando si analizzano computer nella nostra rete, è più veloce rispetto all’uso di ping. Se non vuoi usare pacchetti ARP usa --send-ip.
  • -PS <ports>: Invia pacchetti SYN che se rispondono con SYN/ACK sono open (a cui si risponde con RST per non chiudere la connessione), se rispondono con RST sono closed e se non rispondono sono unreachable. In assenza di privilegi viene automaticamente usata una connessione completa. Se non si specificano porte, viene usata la 80.
  • -PA <ports>: Come la precedente ma con ACK; combinarle dà risultati migliori.
  • -PU <ports>: L’obiettivo è l’opposto, vengono inviati a porte che ci si aspetta siano chiuse. Alcuni firewall controllano solo connessioni TCP. Se è closed risponde con port unreachable, se risponde con altro ICMP o non risponde rimane destination unreachable.
  • -PE, -PP, -PM : ICMP PINGS: echo reply, timestamp e addresmask. Vengono lanciati per sapere se il target è attivo.
  • -PY<ports>: Invia probe SCTP INIT a 80 per default, può rispondere INIT-ACK (open) o ABORT (closed) o niente o ICMP unreachable (inactive).
  • -PO <protocols>: Si indica un protocollo negli header, per default 1(ICMP), 2(IGMP) e 4(Encap IP). Per ICMP, IGMP, TCP (6) e UDP (17) vengono inviati gli header di protocollo, per gli altri solo l’header IP. Lo scopo è che, a causa della malformazione degli header, possano arrivare Protocol unreachable o risposte dello stesso protocollo per sapere se è up.
  • -n: No DNS
  • -R: DNS sempre
  • --system-dns: Forza il resolver del sistema operativo invece dello stub resolver parallelo di Nmap. Utile quando /etc/hosts, split-DNS, o plugin del resolver restituiscono dati che le query dirette di Nmap non vedono. È più lento, e da Nmap 7.96 le lookup forward sono già parallelizzate, quindi di solito serve solo per compatibilità del resolver.
  • --dns-servers <server[,server],...>: Forza server DNS specifici per reverse lookup. Utile in assessment interni per interrogare resolver autoritativi o interni direttamente, o per deviare il traffico -sL/reverse-DNS dai resolver predefiniti del tester.

Tecniche di port scanning

  • -sS: Non completa la connessione quindi non lascia tracce, molto buona se può essere usata.(privilegi) È quella usata di default.
  • -sT: Completa la connessione, quindi lascia traccia, ma può essere usata certamente. Di default senza privilegi.
  • -sU: Più lenta, per UDP. Principalmente: DNS(53), SNMP(161,162), DHCP(67 e 68), (-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered (altro ICMP), open/filtered (niente). In caso di open/filtered, -sV invia molte richieste per rilevare le versioni che nmap supporta e può rilevare il vero stato. Aumenta molto i tempi.
  • -sY: SCTP protocol fallisce a stabilire la connessione, quindi non ci sono log, funziona come -PY
  • -sN,-sX,-sF: Null, Fin, Xmas, possono aggirare alcuni firewall ed estrarre informazioni. Si basano sul fatto che macchine conformi allo standard dovrebbero rispondere con RST a tutte le richieste che non hanno SYN, RST o ACK impostati: open/filtered(niente), closed(RST), filtered (ICMP unreachable). Inaffidabili su WIndows, CIsco, BSDI e OS/400. Su unix sì.
  • -sM: Maimon scan: Invia flag FIN e ACK, usato per BSD, attualmente restituirà tutti come closed.
  • -sA, sW: ACK e Window, usata per rilevare firewall, per sapere se le porte sono filtered o no. -sW distingue tra open/closed poiché le open rispondono con un window diverso: open (RST con window diverso da 0), closed (RST window = 0), filtered (ICMP unreachable o niente). Non tutti i computer si comportano così, quindi se risultano tutte closed non sta funzionando, se sono poche open funziona bene, e se sono molte open e poche closed funziona al contrario.
  • -sI: Idle scan. Per i casi in cui c’è un firewall attivo ma sappiamo che non filtra verso un certo IP (o quando vogliamo anonimato) si può usare lo zombie scanner (funziona per tutte le porte); per cercare possibili zombie si può usare lo script ipidseq o l’exploit auxiliary/scanner/ip/ipidseq. Questo scanner si basa sul numero IPID dei pacchetti IP.
  • --badsum: Invia checksum errato, i computer scarterebbero i pacchetti, ma i firewall potrebbero rispondere qualcosa; è usato per rilevare firewall.
  • -sZ: “Weird” SCTP scanner, inviando probe con cookie echo fragments dovrebbero essere scartati se open o rispondere con ABORT se closed. Può passare firewall che init non attraversa, il problema è che non distingue tra filtered e open.
  • -sO: Protocol IP scan. Invia header malformati e vuoti in cui a volte neanche il protocollo è distinguibile. Se arriva ICMP unreachable protocol è closed, se arriva unreachable port è open, se arriva altro errore è filtered, se non arriva nulla open|filtered.
  • -b <server>: FTPhost –> Usato per scansionare un host da un altro, si connette all’ftp di un’altra macchina e le chiede di inviare file alle porte che si vogliono scansionare da un’altra macchina; in base alle risposte sapremo se sono open o no. [<user>:<password>@]<server>[:<port>] Quasi tutti gli ftp server non permettono più questo e quindi è di scarso uso pratico.

Analisi focalizzata

-p: Usato per specificare le porte da scansionare. Per selezionare tutte le 65.535 porte: -p- o -p all. Nmap ha una classificazione interna basata sulla popolarità. Di default usa le top 1000 porte. Con -F (fast scan) analizza le top 100. Con –top-ports analizza quel numero di porte più popolari (da 1 a 65.535). Controlla le porte in ordine casuale; per evitare ciò usare -r. Si possono anche selezionare porte specifiche: 20-30,80,443,1024- (quest’ultima indica da 1024 in poi). Si possono raggruppare porte per protocollo: U:53,T:21-25,80,139,S:9. Si può anche scegliere un intervallo all’interno delle porte popolari di Nmap: -p [-1024] analizza fino alla porta 1024 tra quelle incluse in nmap-services. –port-ratio Analizza le porte più comuni entro un rapporto tra 0 e 1.

-sV Version scanning, l’intensità può essere regolata da 0 a 9, default 7.

–version-intensity Regoliamo l’intensità; più è basso e più lancerà solo le probe più probabili, ma non tutte. Con questo si può ridurre notevolmente il tempo di scansione UDP.

–version-light Alias di --version-intensity 2. Molto utile per un primo passaggio su grandi range o servizi UDP lenti.

–version-all Alias di --version-intensity 9. Forza tutte le probe ed è utile quando un servizio risponde solo a probe rare.

–allports Forza la rilevazione versione su porte escluse da nmap-service-probes (notoriamente TCP/9100). Attenzione: su alcune stampanti o listener raw socket questo può far stampare i dati della probe.

-O OS detection

–osscan-limit Per una corretta scansione OS, è necessario almeno un porto open e uno closed. Se questa condizione non è soddisfatta e abbiamo impostato questa opzione, non tenterà la predizione OS (risparmia tempo).

–osscan-guess Quando la rilevazione OS non è perfetta, forza tentativi più aggressivi.

Scripts

–script |||[,…]

Per usare gli script di default, usare -sC o –script=default

Available types are: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, and vuln

  • Auth: esegue tutti gli script di autenticazione disponibili
  • Default: esegue gli script base di default
  • Discovery: recupera informazioni dal target o vittima
  • External: script per usare risorse esterne
  • Intrusive: usa script considerati intrusive verso la vittima o target
  • Malware: controlla connessioni aperte da codice malevolo o backdoor
  • Safe: esegue script non intrusivi
  • Vuln: scopre le vulnerabilità più conosciute
  • All: esegue assolutamente tutti gli NSE extension scripts disponibili

Per cercare script:

nmap –script-help=“http-*” -> Quelli che iniziano con http-

nmap –script-help=“not intrusive” -> Tutti tranne quelli intrusive

nmap –script-help=“default or safe” -> Quelli in uno dei due o in entrambi

nmap –script-help=“default and safe” –> Quelli in entrambi

nmap –script-help=“(default or safe or intrusive) and not http-*”

–script-args =,={=},={,}

–script-args-file

–script-help ||||all[,…]

–script-trace —> Fornisce info su come lo script sta procedendo

–script-updatedb

Per usare uno script, basta digitare: nmap –script Script_Name target –> Quando si usa lo script, sia lo script che lo scanner verranno eseguiti, quindi si possono aggiungere anche opzioni dello scanner. Possiamo aggiungere “safe=1” per eseguire solo quelli safe.

Controllo del tempo

Nmap può modificare il tempo in seconds, minutes, ms: –host-timeout argomenti 900000ms, 900, 900s, e 15m fanno tutti la stessa cosa.

Nmap divide il numero totale di host da scansionare in gruppi e analizza questi gruppi a blocchi, quindi non passa al blocco successivo finché tutti non sono stati analizzati (e l’utente non riceve aggiornamenti fino al completamento del blocco). In questo modo è più ottimale per Nmap usare gruppi grandi. Di default in class C usa 256.

Questo può essere cambiato con –min-hostgroup ; –max-hostgroup (Regola le dimensioni dei gruppi di scansione parallela)

È possibile controllare il numero di scanner paralleli ma è meglio non farlo (Nmap incorpora già un controllo automatico basato sullo stato della rete): –min-parallelism ; –max-parallelism

Possiamo modificare il timeout RTT, ma di solito non è necessario: –min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout

Possiamo modificare il numero di tentativi: –max-retries

Possiamo modificare il tempo di scansione di un host: –host-timeout

Possiamo modificare il tempo tra ogni test per rallentarlo: –scan-delay ; –max-scan-delay

Possiamo modificare il numero di pacchetti per secondo: –min-rate ; –max-rate

Molte porte impiegano molto tempo a rispondere quando sono filtered o closed. Se ci interessano solo le open, possiamo andare più veloci con: –defeat-rst-ratelimit

Per definire quanto aggressivo vogliamo che sia Nmap: -T paranoid|sneaky|polite|normal|aggressive|insane

-T (0-1)

-T0 –> Scansiona solo 1 porta alla volta e aspetta 5min prima della successiva

-T1 and T2 –> Molto simili ma aspettano rispettivamente 15 e 0.4sec tra ogni test

-T3 –> Operazione di default, include scanning parallelo

-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

Non permettono accesso alle porte e analizzano i pacchetti.

-f Per frammentare i pacchetti, di default li frammenta in 8bytes dopo l’header; per specificare quella dimensione si usa ..mtu (con questo non usare -f), l’offset deve essere multiplo di 8. Version scanners and scripts non supportano la frammentazione

-D decoy1,decoy2,ME Nmap invia gli scanner ma con altri indirizzi IP come origine, così si nasconde. Se metti ME nella lista, Nmap ti posizionerà lì; è meglio metterne 5 o 6 prima di te per mascherarti completamente. IP casuali possono essere generati con RND: per generare di IP casuali. Non funzionano con TCP version detectors senza connessione. Se sei dentro una rete, ti conviene usare IP attivi, altrimenti sarà facile capire che sei l’unico attivo.

Per usare IP casuali: nmap -D RND:10 Target_IP

-S IP Per quando Nmap non rileva il tuo IP devi fornirlo tu. Serve anche per far credere che un altro target stia scansionando.

-e Per scegliere l’interfaccia

Molti amministratori lasciano porte di ingresso aperte per far funzionare tutto correttamente e per loro è più semplice che trovare un’altra soluzione. Queste possono essere porte DNS o FTP… per trovare questa vulnerabilità Nmap incorpora: –source-port ;-g Sono equivalenti

–data Per inviare testo esadecimale: –data 0xdeadbeef e –data \xCA\xFE\x09

–data-string Per inviare testo normale: –data-string “Scan conducted by Security Ops, extension 7192”

–data-length Nmap invia solo header; con questo aggiungiamo un numero di byte extra (che verranno generati casualmente)

Per configurare completamente il pacchetto IP usare –ip-options

Se vuoi vedere le opzioni nei pacchetti inviati e ricevuti, specifica –packet-trace. Per maggiori informazioni ed esempi sull’uso delle IP options con Nmap, vedi http://seclists.org/nmap-dev/2006/q3/52.

–ttl

–randomize-hosts Per rendere l’attacco meno evidente

–spoof-mac <MAC address, prefix, or vendor name> Per cambiare il MAC esempi: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, and Cisco

–proxies Per usare proxy; a volte un proxy non mantiene tante connessioni aperte quante ne vuole Nmap, quindi il parallelism potrebbe dover essere modificato: –max-parallelism

-sP Per scoprire host nella nostra rete via ARP

Molti amministratori creano regole firewall che permettono il passaggio di tutti i pacchetti provenienti da una porta particolare (come 20,53 e 67); possiamo dire a Nmap di inviare i nostri pacchetti da queste porte: nmap –source-port 53 IP

Output

-oN file Output normale

-oX file Output XML

-oS file Script kiddies output

-oG file Greppable output. Funziona ancora, ma è deprecato; XML è il formato migliore per l’automazione perché le nuove feature di Nmap vengono aggiunte lì per prime. Continua a usare -oN se vuoi --resume, e preferisci -oX/-oA per il parsing automatico.

-oA file Tutti tranne -oS

–webxml Cambia il riferimento dello stylesheet XML in https://nmap.org/svn/docs/nmap.xsl, rendendo l’XML più facile da aprire come HTML su un’altra macchina.

–stylesheet <path|url> Usa uno stylesheet XSL personalizzato. --webxml è solo una scorciatoia per lo stylesheet ufficiale ospitato.

-v level verbosità

-d level debugging

–reason Motivo di host e stato

–stats-every time Ogni quel tempo ci dice come procede

–packet-trace Per vedere quali pacchetti escono; si possono specificare filtri come: –version-trace o –script-trace

–open mostra open, open|filtered e unfiltered

–resume file Riprende una scansione interrotta da un output normale (-oN) o grepable (-oG). Nei workflow attuali è comune tenere -oN per la resumeability e -oX per il parsing.

Esempio per workflow di parsing/conversione HTML:

# 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

Varie

-6 Abilita IPv6

-A equivale a -O -sV -sC –traceroute

Durante l’esecuzione

Mentre Nmap è in esecuzione possiamo cambiare opzioni:

v / V Aumenta / diminuisce il livello di verbosità

d / D Aumenta / diminuisce il livello di debugging

p / P Attiva / disattiva il tracciamento dei pacchetti

? Stampa una schermata di aiuto per l’interazione a runtime

Vulscan

Script di Nmap che confronta le versioni dei servizi ottenute con un database offline (scaricato da altri database più importanti) e restituisce possibili vulnerabilità

I DB che utilizza sono:

  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

Per scaricare e installare nella cartella di Nmap:

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/

È inoltre necessario scaricare i pacchetti DB e aggiungerli in /usr/share/nmap/scripts/vulscan/

Uso:

Per usare tutti i DB: sudo nmap -sV –script=vulscan HOST_TO_SCAN

Per usare un DB specifico: sudo nmap -sV –script=vulscan –script-args vulscandb=cve.csv HOST_TO_SCAN

Se hai accesso a Internet, lo script NSE ufficiale di Nmap vulners è solitamente l’alternativa mantenuta più veloce per l’arricchimento basato sulle versioni:

nmap -sV --script vulners --script-args mincvss=7.0 <IP>

This script appartiene alle categorie safe, external e vuln. Poiché dipende da quanto -sV sia stato accurato, verifica manualmente i riscontri quando il banner del servizio è generico o passa attraverso un proxy.

Note pratiche recenti (7.94+)

  • A partire da Nmap 7.94, lo scan di porte UDP (-sU) e la version detection (-sV) usano la stessa sorgente di payload nmap-service-probes. Una risposta UDP dalla fase di scan può alimentare immediatamente il matching delle versioni, quindi -sU -sV --version-light è ora un buon primo approccio contro range grandi o soggetti a perdita di pacchetti.
  • Da Nmap 7.94, -sV può anche interrogare servizi UDP nascosti dietro DTLS, utile per dispositivi di gestione/ICS moderni che incapsulano protocolli UDP in DTLS.
  • Nmap 7.95 ha aggiunto un ampio lotto di nuovi fingerprint di servizio, inclusi grpc, mysqlx, remotemouse e tuya, oltre a nuova coverage NSE focalizzata su ICS come hartip-info e iec61850-mms. Se stai scansionando ambienti OT o embedded, aggiornare Nmap conta più che aggiungere probe personalizzati troppo presto.
  • Da Nmap 7.96 anche le risoluzioni DNS forward sono parallelizzate. Liste di hostname grandi sono molto più veloci ora, quindi --system-dns dovrebbe di solito essere riservato a problemi di compatibilità piuttosto che per le prestazioni.

Accelerare la service scan di Nmap x16

Secondo questo post puoi velocizzare l’analisi dei servizi di nmap modificando tutti i valori totalwaitms in /usr/share/nmap/nmap-service-probes a 300 e tcpwrappedms a 200.

Inoltre, le probe che non hanno un servicewaitms specificamente definito usano un valore di default di 5000. Pertanto, possiamo o aggiungere valori a ciascuna delle probe, oppure possiamo compilare nmap da soli e cambiare il valore di default in service_scan.h.

Se non vuoi cambiare affatto i valori di totalwaitms e tcpwrappedms nel file /usr/share/nmap/nmap-service-probes, puoi modificare il parsing code in modo che questi valori nel file nmap-service-probes vengano completamente ignorati.

Costruire un Nmap statico per ambienti ristretti

In ambienti Linux hardenati o minimali (container, appliance), i binari Nmap dinamicamente linkati spesso falliscono a causa di runtime loader o librerie condivise mancanti (es., /lib64/ld-linux-x86-64.so.2, libc.so). Costruire un Nmap con linking statico e includere i dati NSE permette l’esecuzione senza installare pacchetti di sistema.

Approccio ad alto livello

  • Usare un builder Ubuntu amd64 pulito tramite Docker.
  • Compilare OpenSSL e PCRE2 come librerie statiche.
  • Compilare Nmap con linking statico e usando le librerie incluse libpcap/libdnet per evitare dipendenze dinamiche.
  • Includere gli script NSE e le directory di dati insieme al binario.

Individua l’architettura target (esempio)

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'

Passo 1 — Preparare la toolchain

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

Passo 2 — Compilare staticamente OpenSSL (1.1.1w)

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

Passaggio 3 — Compilare PCRE2 statico (10.43)

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

Passo 4 — Compilare Nmap statico (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

Punti chiave

  • -static, -static-libstdc++, -static-libgcc forzano il collegamento statico.
  • L’uso di –with-libpcap=included/–with-libdnet=included evita le librerie condivise di sistema.
  • Una modifica con sed neutralizza un target libpcap condiviso se presente.

Passo 5 — Raggruppare il binario e i dati NSE

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

Note di verifica e operative

  • Usare il file sull’artifact per confermare che è linkato staticamente.
  • Conservare i dati NSE con il binario per garantire la parità degli script su host senza Nmap installato.
  • Anche con un binario statico, l’esecuzione può essere bloccata da AppArmor/seccomp/SELinux; DNS/egress devono comunque funzionare.
  • I build deterministici riducono il rischio nella supply-chain rispetto al download di binari “statici” opachi.

Comando in una riga (Dockerized)

Compila, raggruppa e stampa le informazioni sull'artifact ```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>

## Riferimenti

- [Compiling static Nmap binary for jobs in restricted environments](https://www.pentestpartners.com/security-blog/compiling-static-nmap-binary-for-jobs-in-restricted-environments/)
- [Static Nmap Binary Generator (helper tool)](https://github.com/0x5ubt13/static_nmap_binary_generator)
- [OpenSSL sources](https://www.openssl.org/source/)
- [PCRE2 releases](https://github.com/PCRE2Project/pcre2/releases)
- [Nmap source tarballs](https://nmap.org/dist/)
- [Nmap Change Log](https://nmap.org/changelog.html)
- [Nmap Output Formats](https://nmap.org/book/man-output.html)


> [!TIP]
> Impara e pratica 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;">\
> Impara e pratica 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;">\
> Impara e pratica 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;">
> Sfoglia il [**catalogo completo di HackTricks Training**](https://hacktricks-training.com/courses/) per i percorsi di assessment (**ARTA/GRTA/AzRTA**) e [**Linux Hacking Expert (LHE)**](https://hacktricks-training.com/courses/lhe/).
>
> <details>
>
> <summary>Supporta HackTricks</summary>
>
> - Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
> - **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f), al [**gruppo telegram**](https://t.me/peass), **segui** [**@hacktricks_live**](https://twitter.com/hacktricks_live) su **X/Twitter**, oppure controlla la [**pagina LinkedIn**](https://www.linkedin.com/company/hacktricks/) e il [**canale YouTube**](https://www.youtube.com/@hacktricks_LIVE).
> - **Condividi hacking tricks inviando PR ai repository github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
>
> </details>