Architettura di Nmap e Fondamenti della Scansione
Meccaniche TCP/IP alla Base della Scoperta Host e della Scansione Porte
L'efficacia di Nmap si basa sulla manipolazione precisa dei comportamenti di protocollo definiti in RFC 793 (TCP), RFC 792 (ICMP) e RFC 768 (UDP). La scoperta host e la scansione porte sfruttano il fatto che uno stack TCP/IP deve rispondere a determinati stimoli: anche un rifiuto di comunicare costituisce informazione.
Three-Way Handshake TCP e Implicazioni per la Scansione
Client Server
| |
| -------- SYN --------> | [Sonda di scansione: porta aperta?]
| |
| <---- SYN/ACK -------- | [Porta aperta: disponibile a stabilire]
| |
| -------- ACK --------> | [Scansione full connect si completa qui]
| |
| <---- RST (o dati) ---- | [Nmap può inviare RST per evitare half-open]
| |
| -------- SYN --------> |
| <---- RST/ACK -------- | [Porta chiusa: rifiuto attivo]
| |
| -------- SYN --------> |
| (timeout / ICMP unreach) | [Porta filtrata: nessuna risposta o bloccata]
L'handshake rivela tre stati critici da una singola sonda: open (SYN-ACK ricevuto), closed (RST-ACK ricevuto) e filtered (nessuna risposta, o ICMP admin prohibited). La SYN scan di Nmap (-sS) invia SYN e interrompe prima dell'ACK finale: questa tecnica "half-open" evita la registrazione in alcuni daemon applicativi e richiede privilegi di raw socket.
Per UDP, l'assenza di stato di connessione significa che una porta aperta tipicamente non restituisce risposta, mentre una porta chiusa restituisce ICMP Port Unreachable. La scansione UDP è intrinsecamente più lenta e meno affidabile; molti amministratori assumono erroneamente che l'esposizione UDP sia benigna.
⚠️ Solo uso autorizzato e difensivo. Le idle/zombie scan e alcune tecniche di frammentazione descritte di seguito sono utilizzate principalmente per testare le capacità di rilevamento della propria infrastruttura di monitoraggio. Distribuirle solo in ambienti di laboratorio o esercitazioni autorizzate di validazione del rilevamento.
Architettura Core di Nmap
Nmap opera come motore di pacchetti con quattro sottosistemi integrati:
| Sottosistema | Funzione | Caratteristica Chiave |
|---|---|---|
| Motore di Sonda | Costruisce pacchetti IP raw con specifici flag TCP/UDP/ICMP, opzioni e payload | Bypassa lo stack di rete del SO; controllo completo dei campi header |
| Analizzatore di Risposte | Analizza i pacchetti restituiti confrontandoli con i comportamenti attesi conformi agli RFC | Distingue lo stato per timing, flag, dimensione finestra e sequenze IP ID |
| Sistema di Timing | Manipola il rate di sonda, la parallelizzazione e i calcoli di timeout | Si adatta alle condizioni di rete; critico per l'evasione e l'accuratezza |
| Motore di Fingerprinting | Confronta le risposte alle sonde con un database di firme note di OS/servizi | Le sonde attive rivelano particolarità di implementazione invisibili all'osservazione passiva |
Il sistema di timing merita particolare attenzione. I preset -T0 fino a -T5 di Nmap regolano il ritardo inter-pacchetto, le soglie di timeout e il conteggio delle sonde parallele. -T4 (aggressive) assume condizioni LAN affidabili; -T2 (polite) riduce l'impatto collaterale su reti fragili. La regolazione manuale tramite --min-rate, --max-retries e --host-timeout permette un controllo preciso che i preset non possono eguagliare.
Tassonomia dei Tipi di Scansione
Nmap implementa tecniche di scansione distinte variando la composizione dei flag TCP della sonda:
| Tecnica | Flag Impostati | Interpretazione della Risposta | Caso d'Uso Tipico |
|---|---|---|---|
| TCP Connect (-sT) | Full three-way handshake | Risultato standard di connect(); non servono raw socket | Quando la SYN scan non è disponibile (non privilegiato) o attraversamento proxy |
| SYN (-sS) | Solo SYN | Half-open; SYN-ACK = open, RST = closed, silenzio = filtered | Default, più veloce, scansione privilegiata più stealth |
| UDP (-sU) | Payload UDP alla porta | ICMP unreachable = closed; timeout = open o filtered | Scoperta servizi su infrastruttura DNS, SNMP, VoIP |
| ACK (-sA) | Solo ACK | RST = unfiltered (firewall stateful assente); timeout = filtered | Mappatura regole firewall, non stato porta |
| Window (-sW) | Solo ACK (come -sA) | Il campo Window nell'RST differenzia open/closed su determinati sistemi | Raro; utile contro specifici stack legacy |
| Maimon (-sM) | FIN/ACK | Le porte aperte ignorano per RFC 793; le chiuse restituiscono RST | Oscuro; bypassa alcuni filtri di pacchetti stateless |
| Idle/Zombie (-sI) | Spoofato da host zombie | L'analisi della sequenza IP ID sullo zombie rivela i risultati della scansione | Scansione anonimizzata; richiede host con IP ID prevedibile |
Le scansioni ACK e Window illustrano un principio cruciale: non tutte le scansioni determinano se una porta accetta connessioni. Queste "scansioni firewall" mappano le regole di filtraggio. Una porta marcata unfiltered significa semplicemente che una sonda ha raggiunto l'host; non dice nulla sulla disponibilità del servizio. Confondere unfiltered con open è un errore analitico comune.
Macchina a Stati: Oltre Open e Closed
Nmap riporta sei stati di porta, e la loro semantica è importante per un'interpretazione accurata:
| Stato | Definizione | Valore Diagnostico |
|---|---|---|
| open | Servizio che accetta connessioni | Obiettivo per rilevamento versione e correlazione vulnerabilità |
| closed | Nessun servizio in ascolto; RST ricevuto | Conferma host raggiungibile; firewall permette il traffico |
| filtered | Nessuna risposta; sonda scartata | Firewall o ACL in azione; richiede evasione o percorso alternativo |
| unfiltered | Solo risposta a scansione ACK; stato porta indeterminato | Firewall assente; procedere con SYN o Connect scan |
| open|filtered | Ambiguità di scan UDP, IP proto, FIN/Null/Xmas | Non è stato possibile distinguere open da filtered; necessita sondaggi aggiuntivi |
| closed|filtered | Ambiguità Maimon, ACK/Window su determinati sistemi | Raro; tipicamente richiede riscansione con tecnica diversa |
Una porta marcata filtered non è un risultato pulito: è una domanda senza risposta. L'assenza di risposta può indicare una regola di drop, rate limiting o routing asimmetrico. Gli analisti di sicurezza devono correlare con i codici ICMP (tipo 3, codice 1 = host unreachable; codice 3 = port unreachable; codice 13 = admin prohibited) e considerare la varianza temporale attraverso multiple sonde.
Fingerprinting OS e Rilevamento Versione
Il rilevamento versione (-sV) opera inviando sonde specifiche per servizio e confrontando le risposte banner o le particolarità comportamentali con nmap-service-probes. Le sonde sono categorizzate per rarità; le sonde comuni vengono eseguite per prime, quelle esotiche solo con --version-all. Le versioni rilevate sono probabilistiche: i banner possono essere banalmente contraffatti, e le implementazioni possono emulare altri servizi.
Il fingerprinting OS (-O) costruisce una firma da:
- Prevedibilità del TCP initial sequence number (ISN)
- Algoritmo di generazione IP ID (incrementale, random, costante, derivato da timestamp)
- Comportamento dell'opzione TCP timestamp
- Dimensione finestra TCP e ordinamento opzioni
- Risposte esplicite a pacchetti malformati di ICMP/TCP
La firma viene confrontata con nmap-os-db. I livelli di confidenza riflettono la prossimità statistica; una corrispondenza al 95% non è certezza. La virtualizzazione, la containerizzazione e lo spoofing deliberato dell'OS degradano l'accuratezza. L'infrastruttura cloud moderna spesso restituisce firme Linux generiche che offuscano il livello di patch del kernel sottostante.
Formati di Output e Granularità di Logging
Nmap fornisce multipli formati di output, ciascuno servente esigenze operative distinte:
# Laboratorio: Scansione SYN completa con tutti i formati di output per documentazione
nmap -sS -O -sV -p- -T4 \
-oN scan-report-normal.txt \
-oX scan-report.xml \
-oG scan-report.gnmap \
-oS scan-report-skiddie.txt \
192.0.2.0/24
Cosa fa: Esegue scansione completa su tutte le 65535 porte, con rilevamento OS e versione, scrivendo quattro formati di output paralleli. Quando usarlo: Documentazione di baseline, importazione in strumenti SIEM/reporting (XML), automazione basata su grep (gnmap), o revisione umana (normal). Rischi: L'intero range porte (
-p-) con rilevamento versione genera traffico significativo; invasivo in produzione. Output atteso: File multipli; XML adatto per confronto conndiffe ingestione da parser.
| Formato | Estensione | Scopo | Compromesso |
|---|---|---|---|
| Normal (-oN) | .txt |
Leggibile umano con metadati di runtime | Non analizzabile automaticamente; verbose |
| XML (-oX) | .xml |
Dati strutturati; importazione in strumenti, database, trasformate XSLT | Verbose; richiede parser; più completo |
| Grepable (-oG) | .gnmap |
Un host per riga; friendly per awk/grep/script shell |
Perde dettagli output script; struttura flat |
| Script Kiddie (-oS) | .txt |
Trasformazione in leetspeak | Inutile eccetto per presentazione ironica |
Il formato grepable persiste nonostante la superiorità dell'XML perché l'integrazione pipeline rimane più veloce del parsing DOM per estrazione ad hoc:
# Estrae host con qualsiasi porta web aperta dall'output grepable
awk '/Host: / && /80\/open|443\/open|8080\/open/' scan-report.gnmap
Cosa fa: Filtra l'output grepable per host con porte HTTP/HTTPS o porte web alternate aperte. Quando usarlo: Triage rapido senza strumenti XML. Rischi: Il formato grepable omette l'output degli script NSE e i dettagli del fingerprinting OS. Output atteso: Righe corrispondenti al pattern, ciascuna contenente stato completo host e elenco porte.
Variante produzione (minore intensità, formato output singolo per monitoraggio):
# Produzione: Verifica uptime servizio con rate limiting
nmap -sS -p 22,80,443,3389 --min-rate 50 --max-retries 2 \
-oG - 198.51.100.0/26 | tee daily-uptime.gnmap
Cosa fa: Controllo porte limitato a 50 pacchetti/secondo massimo, con tolleranza retry ridotta, streaming output grepable. Quando usarlo: Monitoraggio routine servizi senza impattare la produzione. Rischi: Anche scansioni contenute possono attivare IDS; coordinarsi con i team di monitoraggio. Output atteso: Riga singola per host; adatto per cron-driven diff rispetto alle esecuzioni precedenti.
Confronto Ricognizione Attiva vs Passiva
| Dimensione | Attiva (Nmap) | Passiva |
|---|---|---|
| Generazione pacchetti | Sonde inviate al target | Nessuna interazione diretta; osserva traffico esistente |
| Rilevabilità | Registrata da firewall, IDS, OS host | Invisibile al target |
| Completezza | Enumera tutti gli host/porte responsivi | Limitata agli endpoint comunicanti |
| Accuratezza | Determinazione precisa dello stato; bassi falsi negativi | Dipendente dal volume di traffico; perde host silenziosi |
| Velocità | Controllata dall'operatore; può essere rapida | Limitata dai pattern di traffico naturali |
| Posizione legale/contrattuale | Richiede autorizzazione esplicita | Ambigua; monitorare solo reti proprie |
Nmap è fondamentalmente attiva. Ogni sonda è un evento rilevabile. Gli operatori difensivi dovrebbero riconoscere che gli avversari usano tecniche identiche; la firma di Nmap è ben catalogata nelle regole Snort/Suricata. Il valore della scansione attiva nella pratica difensiva risiede nella validazione della baseline: confermare che la realtà osservata della rete corrisponda al suo stato documentato, e che la propria infrastruttura di rilevamento registri l'attività che dovrebbe.
Errori Comuni
| Errore | Perché ti danneggia |
|---|---|
Scansionare senza scoperta host (default -Pn) |
Spreca ore sondando route blackhole o sottoreti dismesse; verificare sempre prima che i target siano vivi |
Trattare filtered come closed |
Perde servizi esposti dietro ispezione stateful; le porte filtrate possono essere accessibili da punti di osservazione alternativi |
Eseguire -A (aggressive: OS + versione + traceroute + script) su tutto |
Costo temporale proibitivo su reti grandi; le sonde di versione possono crashare servizi embedded fragili |
Ignorare --max-retries e --host-timeout |
Scansioni in sospeso su singoli host non responsivi ritardano l'intero job; i timeout prevengono il fallimento a cascata |
| Affidarsi ciecamente ai banner di versione | Honeypot e framework di inganno servono banner contraffatti; validare attraverso test comportamentali |
Checklist: Preparazione Pre-Scansione
- [ ] Verificare il campo di autorizzazione: range IP, limiti porte, vincoli di timing
- [ ] Notificare i team operativi se scansione in produzione; confermare eccezioni di monitoraggio
- [ ] Selezionare la tecnica di scansione corrispondente al livello di privilegio e alla postura firewall
- [ ] Scegliere il/i formato/i di output in base ai requisiti di elaborazione a valle
- [ ] Impostare il template di timing o limiti di rate manuali appropriati alla resilienza del target
- [ ] Documentare la topologia attesa per l'analisi delle deviazioni post-scansione
Guida rapida: Comandi Nmap essenziali
Comandi Essenziali di Nmap — Cheat Sheet
I seguenti dodici comandi coprono il 90% delle operazioni quotidiane con Nmap. Ogni voce elenca la sintassi esatta, lo scopo e una valutazione pratica su quando usarli o evitarli. I flag che richiedono privilegi root o generano rumore di rete significativo sono contrassegnati.
| Simbolo | Significato |
|---|---|
| 🔒 | Richiede privilegi root / elevati |
| 🔊 | Genera rumore significativo; probabile attivazione di allarmi IDS/IPS |
Rilevamento Host e Mappatura Rete
nmap -sn 192.0.2.0/24
Cosa fa: Invia echo ICMP, TCP SYN sulla porta 443, TCP ACK sulla porta 80 e richieste di timestamp ICMP per identificare host attivi. Quando usarlo: Inventario iniziale della rete, scoperta asset o prima di una finestra di manutenzione per identificare sistemi che rispondono. Rischi: ICMP è spesso bloccato dai firewall perimetrali; perderai host che scartano il ping ma espongono servizi. Output atteso: Elenco di indirizzi IP con dati di latenza
Host is up; nessun dato sulle porte.
| Quando evitarlo | Alternativa |
|---|---|
| Hai bisogno dei dati sullo stato delle porte per confermare l'esposizione del servizio | Rimuovi -sn ed esegui direttamente -sS; accetta che scannerai alcuni IP inattivi |
Scansione TCP Stealth con Rilevamento OS
sudo nmap -sS -O 198.51.100.42
🔒
Cosa fa: Invia pacchetti SYN senza completare il three-way handshake TCP (scansione half-open); sonda le peculiarità dello stack TCP/IP per l'impronta digitale del sistema operativo. Quando usarlo: Ricognizione in cui vuoi minimizzare le voci di log sul target; i dati OS aiutano a priorizzare i controlli di vulnerabilità. Rischi:
-Orichiede root e invia traffico di sonda aggiuntivo; l'accuratezza si degrada con firewall/NAT. Output atteso: Tabella delle porte più la rigaRunning:con ipotesi OS e percentuale di confidenza.
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
MAC Address: 00:50:56:C0:00:08 (VMware)
Device type: general purpose
Running: Linux 5.X
OS CPE: cpe:/o:linux:linux_kernel:5.15
OS details: Linux 5.15
Una porta marcata filtered non è un risultato pulito — è una domanda senza risposta. Significa che un firewall, un filtro host-based o un rate-limiting ha scartato la sonda senza RST. Registrale separatamente; spesso indicano confini di segmentazione degni di essere mappati.
Rilevamento Versione Servizio con Script Default
sudo nmap -sV -sC 198.51.100.42
🔒
Cosa fa:
-sVsonda le porte aperte per determinare nomi servizio e banner di versione;-sCesegue il set di default di script NSE (categoria safe, non intrusiva). Quando usarlo: Documentazione di baseline, correlazione vulnerabilità o prima dei cicli di patch. Rischi: Il banner grabbing può far crashare servizi embedded fragili; gli script-sCsono "safe" ma non a rischio zero. Output atteso: Tabella porte migliorata con colonnaVERSIONe blocchi di output script.
Scansione Intera Gamma Porte
sudo nmap -p- 198.51.100.42
🔒
Cosa fa: Scansiona tutte le 65.535 porte TCP (
-p-espande a 1-65535). Quando usarlo: Valutazione approfondita di compromissione, ambienti CTF o quando sospetti servizi non standard oltre la porta 1024. Rischi: La durata scala linearmente; un singolo host può richiedere 15-60+ minuti a seconda di latenza e limiti di rate. Output atteso: Inventario porte completo; la maggior parte mostreràclosedofiltered.
Lab: nmap -p- -T4 198.51.100.42 (più veloce, più rumoroso) Produzione: nmap -p- -T2 --max-retries 1 198.51.100.42 (più lento, più delicato su link WAN)
Scansione Aggressiva
sudo nmap -A 198.51.100.42
🔒 🔊
Cosa fa: Equivalente a
-sV -sC -O --traceroute; abilita rilevamento versione, script default, fingerprinting OS e tracciamento percorso in una sola invocazione. Quando usarlo: Ispezione approfondita singolo host quando serve il massimo dei dati e il rumore è accettabile. Rischi: Molto verboso; le sonde traceroute possono trapelare informazioni sul percorso sorgente. Output atteso: Rapporto consolidato adatto per documentazione o allegato ticket.
Output in Tutti i Formati
nmap -oA scan_20250715_198.51.100.42 -sV 198.51.100.42
Cosa fa: Scrive simultaneamente
.nmap(human-readable),.xml(parser-friendly) e.gnmap(grep-friendly). Quando usarlo: Qualsiasi flusso di lavoro scriptato o quando strumenti downstream consumano XML. Rischi: Nessuno operativo; assicurati che la directory di scrittura esista. Output atteso: Tre file con basename coerente.
Velocità Bilanciata per Porte Comuni
nmap -T4 --top-ports 1000 192.0.2.0/24
🔊
Cosa fa: Usa il template di timing 4 (aggressive) sulle 1.000 porte più frequentemente aperte secondo la ricerca di Fyodor. Quando usarlo: Controlli rapidi di integrità su reti interne con buona larghezza di banda e senza preoccupazioni IDS. Rischi:
-T4può sopraffare target lenti o link congestionati; perde pacchetti in condizioni di perdita. Output atteso: Risultati rapidi per host reattivi; falsi negativi su servizi non comuni.
Salta Rilevamento Host
nmap -Pn 198.51.100.42
Cosa fa: Tratta il target come online indipendentemente dalla risposta ping; procede direttamente alla scansione porte. Quando usarlo: I target bloccano ICMP, o stai scansionando attraverso proxy/forwarder dove le sonde di rilevamento host falliscono diversamente dalle sonde di porta. Rischi: Aspetterai cicli di timeout completi contro IP veramente morti. Output atteso: Risultati porte per host che altrimenti sarebbero saltati.
Scansione UDP Veloce
sudo nmap -sU -F 198.51.100.42
🔒
Cosa fa:
-sUinvia datagrammi UDP;-Flimita alle top 100 porte invece delle 1.000 default. Quando usarlo: Controlli infrastruttura DNS, SNMP, NTP o VoIP dove sono previsti servizi UDP. Rischi: La scansione UDP è intrinsecamente lenta (nessun handshake per confermare lo stato); molte porte restituisconoopen|filteredper silenzio. Output atteso: Risultati radi ma critici; pianifica runtime lunghi se espandi oltre-F.
Rilevamento Vulnerabilità con NSE
nmap --script vuln 198.51.100.42
🔊
Cosa fa: Esegue tutti gli script NSE nella categoria
vuln(controlla CVE noti, misconfigurazioni, credenziali default). Quando usarlo: Valutazioni sicurezza programmate, validazione pre-patch o triage risposta agli incidenti. Rischi: Alcuni script sono intrusivi; i falsi positivi richiedono verifica manuale. Output atteso: Risultati vulnerabilità strutturati con riferimenti e punteggi CVSS dove disponibili.
Scansione Decoy
sudo nmap -D RND:10 198.51.100.42
🔒 🔊
Cosa fa: Genera 10 IP sorgente decoy casuali intercalati con sonde reali; i log del target mostrano origini miste. Quando usarlo: Solo uso autorizzato e difensivo. Usalo in ambienti lab o in esercizi di validazione rilevamento esplicitamente autorizzati per testare regole di correlazione SIEM e allarmi basati su sorgente.
Evasione per Frammentazione
sudo nmap -f --mtu 16 198.51.100.42
🔒 🔊
Cosa fa:
-fdivide la sonda in frammenti da 8 byte;--mtu 16forza frammenti payload da 16 byte. Aggira filtri pacchetto semplici che non riassemblano i flussi. Quando usarlo: Solo uso autorizzato e difensivo. Testing IDS/IPS in ambienti controllati, o per validare che i propri dispositivi edge riassemblino correttamente prima della valutazione ACL.
Riferimento Rapido Categorie Flag
| Categoria | Flag Comuni | Scopo |
|---|---|---|
| Tipo scansione | -sS, -sT, -sU, -sV, -A, -sn |
TCP SYN, connect, UDP, versione, aggressive, ping sweep |
| Timing | -T0 a -T5, --min-rate, --max-retries |
Compromesso velocità vs. stealth; -T0/T1 per evasione IDS, -T3 default, -T4/-T5 per reti interne |
| Output | -oN, -oX, -oG, -oA |
Formati normal, XML, grepable, tutti |
| Evasione | -f, --mtu, -D, --source-port, --data-length |
Frammentazione, decoy, origini spoofate, padding payload |
Errori Comuni
| Errore | Perché ti penalizza |
|---|---|
Eseguire -A di default su ogni target |
Raddoppia tempo e rumore della scansione; -sV da solo basta per la maggior parte degli inventari |
Dimenticare -Pn contro host cloud |
AWS, GCP, Azure spesso bloccano ICMP; Nmap salta completamente l'host |
Usare -T5 attraverso link WAN |
La perdita di pacchetti causa stati filtered o closed falsi; -T4 è di solito il limite massimo |
Ignorare completamente UDP (-sU) |
SNMP, DNS, IPMI e vari protocolli IoT espongono superficie di attacco solo su UDP |
| Fidarsi ciecamente dei banner di versione | I servizi possono essere honeypot, segnalati erroneamente o patchati con backport senza aggiornamento banner |
Checklist Pre-Scansione
- [ ] Confermare il campo di autorizzazione (range IP, porte, vincoli di timing)
- [ ] Verificare che la versione di
nmapcorrisponda alle funzionalità attese (nmap --version) - [ ] Testare connettività:
pingoncsu un target per confermare il percorso - [ ] Selezionare il formato output per il consumo downstream
- [ ] Per produzione: iniziare con
-T3o-T2, escalation solo se le prestazioni lo consentono - [ ] Registrare i parametri di scansione per riproducibilità e correlazione incidenti
Ulteriori letture
Installazione, Modelli di Autorizzazione e Specifica del Target
Installazione della Piattaforma e Trappole Pratiche
Nmap funziona su tutte le piattaforme principali, ma i percorsi di installazione presentano frizioni significativamente diverse. Su Linux, preferire i pacchetti della distribuzione per la risoluzione delle dipendenze, anche se gli ambienti container e sandbox introducono fallimenti prevedibili.
| Piattaforma | Metodo tipico | Trappola nota |
|---|---|---|
| Linux (Debian/Ubuntu) | apt install nmap |
I pacchetti Snap limitano CAP_NET_RAW; usare .deb o compilare dai sorgenti |
| Linux (RHEL/Fedora) | dnf install nmap |
I contesti SELinux possono bloccare le operazioni su socket raw; vedi sotto |
| macOS | brew install nmap |
Il firewall PF di macOS può scartare silenziosamente pacchetti craftati; verificare con tcpdump |
| Windows | Installer ufficiale | Npcap vs. WinPcap: Npcap è mantenuto attivamente; WinPcap è deprecato e fallisce su Windows moderni |
| Container/sistemi minimi | Compilazione dai sorgenti | Richiesto il linking statico di libpcap; header mancanti nelle immagini -slim |
Per la compilazione dai sorgenti, la Nmap Install Guide fornisce la procedura canonica. Verificare l'integrità utilizzando le firme distaccate GPG fornite—gli hash SHA-1 sono disponibili, anche se potreste preferire validare direttamente la firma GPG.
Lab: Compilare con libpcap condivisa (standard, funziona su Debian/Ubuntu complete):
./configure && make && sudo make install
Produzione (container): Link statico per evitare dipendenze runtime mancanti in immagini minimali:
./configure --with-libpcap=included && make && make install
Cosa fa: Incorpora
libpcapper eliminare la risoluzione delle dipendenze esterne in ambienti ridotti all'osso. Quando usarlo: Alpine,debian:slim, o immagini di build personalizzate doveldconfignon trova oggetti condivisi. Rischi: Binario più grande, aggiornamenti di sicurezza più lenti per i componentilibpcap. Output atteso: Singolo binarionmapportatile senza dipendenzelddsulibpcap.soesterna.
Privilegi, Capabilities e Modelli di Permesso
Il comportamento predefinito di Nmap dipende fortemente dal livello di privilegio. Molti tipi di scansione richiedono l'accesso a socket raw per creare pacchetti o leggere risposte raw.
| Livello di privilegio | Tipi di scansione disponibili | Limitazione |
|---|---|---|
| root / sudo | Tutti (SYN stealth, UDP, rilevamento OS, frammentazione) | Accesso completo a socket raw |
| Utente non privilegiato | TCP Connect scan (-sT), alcuni script NSE |
SYN stealth (-sS) non disponibile; il kernel gestisce il completo handshake TCP |
Capability CAP_NET_RAW |
SYN stealth, operazioni su pacchetti raw | Non richiede root completo; funziona con file capabilities o ambient capabilities nei container |
Su Linux, concedere file capabilities per evitare l'esecuzione come root:
sudo setcap cap_net_raw,cap_net_admin=eip $(which nmap)
Cosa fa: Allega le Linux capabilities al binario Nmap, permettendo operazioni su socket raw senza setuid o sudo. Quando usarlo: Pipeline CI/CD, shell restrittive, o scansioni containerizzate dove le direttive
USERimpediscono l'esecuzione come root. Rischi: Qualsiasi utente con permesso di esecuzione sul binario ottiene accesso a socket raw; verificare congetcap. Output atteso:-sSha successo senzasudo; verificare connmap -sS -p 80 192.0.2.1.
I contesti SELinux su RHEL/CentOS/Fedora possono bloccare i socket raw anche con privilegi root. Controllare i messaggi avc: denied in audit.log e applicare un boolean mirato o un modulo policy personalizzato se le operazioni su pacchetti raw sono necessarie per flussi di lavoro di scansione autorizzati.
Sintassi di Specificazione dei Target
Nmap accetta target in più formati. Il parser è flessibile ma implacabile con la notazione ambigua.
# Singolo host
nmap 192.0.2.1
# Range CIDR
nmap 192.0.2.0/24
# Target discreti multipli
nmap 192.0.2.1 192.0.2.10 198.51.100.5
# Lista host da file
nmap -iL targets.txt
# Escludere host (critico per la conformità dello scope)
nmap 192.0.2.0/24 --exclude 192.0.2.1,192.0.2.2
# Escludere da file
nmap 192.0.2.0/24 --excludefile protected_hosts.txt
Cosa fa:
-iLlegge target delimitati da newline;--excludee--excludefileimpediscono la scansione di sistemi fuori scope o fragili. Quando usarlo: Definizione dello scope di penetration test, subnet di produzione con host sensibili noti (SCADA legacy, dispositivi medici), o ambienti segmentati con esclusioni change-control. Rischi:--excludeè solo lato client; un errore di battitura nella sintassi di esclusione scansiona proprio l'host che intendevate saltare. Output atteso: Nmap elenca i target esclusi all'avvio; verificare nelle prime righe di output.
IPv6 richiede abilitazione esplicita e sintassi adattata:
nmap -6 2001:db8::1
nmap -6 2001:db8::/64
Gli ambienti dual-stack richiedono attenzione: -6 forza solo IPv6; senza di esso, Nmap risolve i nomi host in IPv4 per impostazione predefinita. Per audit dual-stack, scansionare separatamente ciascun protocollo o utilizzare i controlli di risoluzione dei nomi. La notazione CIDR IPv6 funziona identicamente a IPv4, ma assicurarsi che la shell esci le parentesi quadre se si incorporano indirizzi letterali negli script.
Errori comuni:
| Errore | Perché fa male |
|---|---|
nmap 192.0.2.1-100 |
Parsa come 192.0.2.1 fino a 192.0.2.100; se intendevate porte, usare -p 1-100 |
nmap 192.0.2.1/24 -p- senza --exclude |
Scansiona tutte le 65535 porte su ogni host, inclusa l'infrastruttura di rete di cui non siete proprietari |
Dimenticare -6 su host solo-IPv6 |
Appare come "host down" quando il target semplicemente non ha record A |
Spazi bianchi nei file -iL |
Spazi finali causano tentativi di risoluzione DNS su nomi non validi, con perdita di dati e rallentamento delle scansioni |
File di Configurazione e Ottimizzazione Ambientale
Il file .nmaprc nella home directory applica impostazioni predefinite persistenti. È qui che si impone la disciplina di scansione: limiti di rate, liste di esclusione e comportamento preferito di risoluzione DNS.
# Esempio ~/.nmaprc
max-retries 2
max-rtt-timeout 500ms
max-scan-delay 20ms
dns-servers 192.0.2.53
exclude 127.0.0.1,10.0.0.0/8
Le variabili d'ambiente integrano questo: NMAP_PRIVILEGED=1 forza Nmap ad assumere di avere le capability per socket raw (utile quando il rilevamento delle capability fallisce nei container); NMAP_UNPRIVILEGED=1 fa l'opposto.
Cosa fa:
.nmaprcelimina flag ripetitivi e previene la sovra-scansione accidentale codificando impostazioni conservative predefinite. Quando usarlo: Host jump multi-utente, workstation di contractor, o qualsiasi ambiente dove una semplice invocazionenmapdovrebbe defaultare a parametri sicuri. Rischi: Le impostazioni predefinite nascoste creano lacune di audit—documentare i contenuti di.nmaprcnella metodologia di scansione. Output atteso:nmap --helpnon rivela le impostazioni.nmaprcattive; usare--datadiro-vverbose per ispezionare le impostazioni applicate.
Quadri di Autorizzazione Legale
La scansione non autorizzata viola lo U.S. Computer Fraud and Abuse Act (CFAA), lo UK Computer Misuse Act, e legislazioni analoghe nella maggior parte delle giurisdizioni. Le policy di acceptable use degli ISP espongono inoltre alla terminazione del servizio. La documentazione ufficiale su legal issues di Nmap documenta casi risultanti in cause legali, licenziamento, espulsione e carcerazione.
L'autorizzazione scritta è non negoziabile. Una lettera di autorizzazione valida contiene:
| Elemento | Scopo |
|---|---|
| Parti nominate | Chi è autorizzato a scansionare (individuo o organizzazione) |
| Range IP, nomi host o blocchi CIDR | Scope tecnico esatto; l'ambiguità non giova a nessuno |
| Intervallo date e restrizioni orarie | Previene difese "era un'autorizzazione vecchia"; rispetta le finestre di manutenzione |
| Tecniche consentite | Port scanning, rilevamento versione, script NSE, o controlli vulnerabilità |
| Contatto emergenza | Chi notificare in caso di comportamento inatteso o interruzione |
| Firmatario con autorità | Capacità legale di concedere accesso alla rete target |
Confini bug bounty: Gli scope delle piattaforme (HackerOne, Bugcrowd, ecc.) definiscono dinamicamente i target consentiti. Un wildcard *.example.com non autorizza scansioni di infrastruttura contro le reti corporate di example.com se non esplicitamente elencate. Verificare sempre la lista degli asset in-scope al momento della scansione; i programmi mutano.
⚠️ Solo uso autorizzato, difensivo. Le opzioni di rate-limiting e timing trattate più avanti in questa guida esistono per la validazione dei rilevamenti e il troubleshooting di rete, non per aggirare i confini di autorizzazione.
Una porta marcata filtered non è un risultato pulito—è una domanda senza risposta. Avete inviato una sonda, ricevuto nessuna risposta o un errore ICMP ambiguo, e ora detenete spazio negativo dove dovrebbe esserci uno stato. Quell'ambiguità è dove i rischi legali e tecnici si compongono: il probing aggressivo ripetuto contro porte filtered per forzare una risposta scala da ricognizione a potenziale denial-of-service, e la clausola di scope della vostra lettera di autorizzazione è ciò che separa il testing autorizzato dal manomissione criminale di rete.
Approfondimenti
Esempi pratici svolti: dalla scoperta della rete alla verifica delle vulnerabilità
Inventario Rete Enterprise: Ottimizzazione per la Scalabilità
La scansione di una /16 (65.536 indirizzi) senza bloccare segmenti di rete o il proprio host richiede un'ottimizzazione deliberata delle prestazioni. I template di timing predefiniti sono troppo conservativi per questa scala e troppo aggressivi per collegamenti WAN congestionati.
sudo nmap -sn -PE -PP -PM -n --min-parallelism 512 --max-rtt-timeout 300ms --initial-rtt-timeout 150ms --max-retries 2 --max-scan-delay 10ms -oA corp-discovery 192.0.2.0/16
Cosa fa: Scoperta host (
-sn, nessuna scansione porte) con probe ICMP echo (-PE), timestamp (-PP) e richiesta netmask (-PM); disabilita la risoluzione DNS (-n) per eliminare i colli di bottiglia del resolver. Quando usarlo: Scansioni baseline di inventario, riconciliazione CMDB o validazione dello scope pre-patching. Rischi: I filtri ICMP eliminano silenziosamente i probe; il parallelismo sopra 1.024 può sopraffare i socket locali sull'host di scansione. Output atteso: Lista ricercabile di host attivi con metriche di latenza.
Variante lab (aggressiva): --min-rate 10000 per saturare uno switch lab locale e testare il proprio monitoraggio. Variante produzione (conservativa): Aggiungere --scan-delay 5ms e limitare a --max-rate 500 per evitare di attivare soglie IDS basate sulla frequenza.
Una scansione /16 tipicamente rivela l'8-15% di host attivi in allocazioni enterprise sparse. Una porta marcata filtered non è un risultato pulito — è una domanda senza risposta. Distinguere sempre tra filtered (probe inviato, nessuna risposta) e admin-prohibited (ricevuto ICMP type 3, code 13), che conferma una regola firewall che ti blocca esplicitamente.
Valutazione Server Web: Proxy, WAF e Inganno dei Servizi
I servizi web si espongono raramente direttamente. Rilevare gli intermediari impedisce di effettuare fingerprinting sul bersaglio sbagliato e di attaccare erroneamente un nodo edge CDN.
sudo nmap -sS -sV -p80,443,8080,8443 --script=http-title,http-server-header,http-waf-detect,http-security-headers -d --reason 198.51.100.25
Estratto di output sanificato:
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.24.0 (reverse proxy)
| http-server-header: cloudflare
|_http-title: 301 Moved Permanently
443/tcp open ssl/http nginx 1.24.0
| http-waf-detect: IDS/WAF detected: Cloudflare
| ssl-cert: Subject: commonName=origin.internal.example
|_Not valid before: 2024-01-15T00:00:00
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
|_http-title: Apache Tomcat/9.0.82
Interpretazione: La porta 80 termina su Cloudflare (WAF confermato). Il ssl-cert sulla 443 espone il nome interno del server origin (origin.internal.example) — una configurazione errata comune quando i certificati vengono copiati dall'origin all'edge senza pulizia dei SAN. La porta 8080 espone direttamente un'interfaccia di gestione, bypassando completamente il WAF.
| Servizio Scoperto | Configurazione Errata Comune | Comando di Verifica |
|---|---|---|
| Front-end Cloudflare | Il certificato origin espone nomi interni | openssl s_client -connect 198.51.100.25:443 |
| Reverse proxy nginx | Divulgazione versione nell'header Server: |
--script http-server-header |
| Gestione Tomcat | /manager/html accessibile senza restrizione IP |
--script http-auth,http-brute (solo autorizzato) |
| Apache con mod_proxy | Errata configurazione trust X-Forwarded-For |
Test manuale injection header |
Guida alla remediation: Limitare la gestione Tomcat a loopback e richiedere mTLS; rimuovere i banner versione tramite server_tokens off; in nginx; distribuire certificati pubblici separati senza SAN interni.
Audit Esposizione Database: Porte Predefinite e Affidabilità dei Banner
Le porte predefinite non sono garanzie, ma sono forti priori per configurazioni errate. Verificare con rilevamento servizio, mai assumere.
sudo nmap -sS -sV -sC -p3306,5432,27017,6379,1433,1521 --version-intensity 7 192.168.50.0/24
Cosa fa: Scansione SYN con rilevamento versione (
-sV) e script NSE predefiniti (-sC) contro porte database comuni; intensità 7 bilancia velocità e profondità probe. Quando usarlo: Validazione segmentazione, revisione sicurezza migrazione cloud o valutazione esposizione post-incidente. Rischi: I probe MongoDB e Redis possono attivare fallimenti di autenticazione che bloccano account se fail2ban o simili è attivo; i probe versione MySQL possono essere loggati come tentativi di connessione. Output atteso: Nomi servizio, versioni e configurazioni rilevate dagli script.
Avvertenza critica: Le versioni rilevate e i banner non sono affidabili al 100%. Gli honeypot imitano deliberatamente servizi vulnerabili; alcuni container riportano la versione del kernel host piuttosto che il proprio livello di patch. Correlare sempre con inventario patch autenticato quando disponibile.
Fingerprinting Dispositivi IoT e Embedded
I dispositivi embedded spesso eseguono servizi non convenzionali o implementazioni di protocolli antichi che le scansioni standard non rilevano.
sudo nmap -sV --version-all -p- --script=banner -T4 --max-retries 1 --host-timeout 15m 10.0.3.0/24
Flag chiave spiegati: -p- = tutte le 65.535 porte; --version-all = invia ogni probe nel database Nmap (lento ma approfondito); --max-retries 1 = accetta più falsi negativi per velocità su reti IoT inaffidabili.
Estratto di output sanificato:
PORT STATE SERVICE VERSION
23/tcp open telnet BusyBox telnetd (D-Link router)
| banner: \xFF\xFD\x03\xFF\xFB\x01\xFF\xFD\x1F\xFF\xFB\x01\r\nD-Link DSL-2740B
80/tcp open http micro_httpd
| http-title: Router Login - DSL-2740B
|_http-server-header: micro_httpd
1900/tcp open upnp Portable SDK for UPnP devices 1.6.6
| upnp-info:
| Server: LINUX/2.4 UPnP/1.0 BRCM400/1.0
| Location: http://10.0.3.15:49152/gatedesc.xml
|_ Last boot: 2023-08-14
2323/tcp open telnet Boa embedded web server config console
Interpretazione: Telnet sulla 23 e una console di gestione telnet alternativa sulla 2323 — entrambe non crittografate. Il servizio UPnP (1900/tcp) espone XML di descrizione dispositivo che spesso contiene versioni firmware ed endpoint servizio. Last boot agosto 2023 senza patch successive suggerisce trascuratezza cronica.
Analisi Configurazione SSL/TLS con NSE
I siti corporate interni non possono raggiungere tool esterni come Qualys SSL Test. ssl-enum-ciphers di Nmap fornisce valutazione equivalente per scope di audit interno.
nmap --script ssl-cert,ssl-enum-ciphers,ssl-heartbleed -p443 198.51.100.100
Output sanificato con annotazione forza cipher:
PORT STATE SERVICE
443/tcp open https
| ssl-cert: Subject: commonName=legacy-app.internal
| Issuer: commonName=Corporate-ICA-2019
| Public Key type: rsa
| Public Key bits: 2048
| Not valid before: 2023-06-01T00:00:00
| Not valid after: 2025-06-01T23:59:59
|_ssl-date: TLS randomness does not represent time
| ssl-enum-ciphers:
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - C
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| compressors:
| NULL
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - F
| least strength: F
|_ Grade: F (due to TLSv1.0 with RC4 and 1024-bit RSA)
| Voto | Significato | Trigger Tipici |
|---|---|---|
| A | Forward secrecy forte, cipher AEAD, nessuna debolezza nota | ECDHE + AES-GCM, TLS 1.2+ |
| B | Problemi minori (no FS per alcuni client, SHA-1 nella catena) | Scambio chiave RSA statico, hash catena vecchio |
| C | Algoritmi deboli o obsoleti permessi | Modalità CBC senza EtM, 3DES, RSA statico |
| D | Debolezze significative | Crittografia export-grade, firme MD5 |
| F | Vulnerabilità critica o effettivamente rotto | RC4, SSLv2/v3, RSA 512/1024-bit, nessuna crittografia |
Cosa fa: Enumera tutti i ciphersuite per versione protocollo, valuta ciascuno e riporta il collegamento più debole. Quando usarlo: Baseline pre-migrazione, analisi gap compliance o validazione restrizioni cipher-suite distribuite via GPO/registry. Rischi: La metodologia di valutazione pesa lo scambio chiave e la forza del cipher stream; l'integrità messaggio (algoritmo MAC) non è considerata — un voto "C" con SHA-1 HMAC è ancora permesso senza downgrade. Output atteso: Liste cipher per versione con voti lettera e riepilogo aggregato
least strength.
Interpretazione del campione: Il voto F è determinato interamente dal TLS 1.0 che supporta RC4 con RSA 1024-bit — banalmente violabile con risorse modeste. Tuttavia il TLS 1.2 offre cipher di voto A, il che significa che la remediation è solo configurazione (disabilitare TLS 1.0/1.1 e cipher deboli), non sostituzione certificato.
Conferma Remediation Vulnerabilità: Flusso di Lavoro Prima/Dopo
Il diffing dell'output di scansione è essenziale quando le finestre di change-control sono ristrette e le decisioni di rollback devono basarsi su evidenze.
# Baseline (pre-remediation)
nmap --script ssl-enum-ciphers -p443 -oX baseline-198.51.100.100.xml 198.51.100.100
# Post-remediation
nmap --script ssl-enum-ciphers -p443 -oX postfix-198.51.100.100.xml 198.51.100.100
# Diff strutturato
ndiff baseline-198.51.100.100.xml postfix-198.51.100.100.xml > ssl-cipher-diff.txt
Estratto di diff sanificato:
- TLSv1.0:
- ciphers:
- TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - F
- least strength: F
- Grade: F
+ TLSv1.2:
+ ciphers:
+ TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
+ least strength: A
+ Grade: A
Nota automazione: Integrare i codici di uscita di ndiff nei gate CI/CD — uscita non-zero su qualsiasi degrado dalla baseline. Per deployment rolling, baseline rispetto al target di produzione, non all'immagine golden; il configuration drift in produzione invalida spesso le assunzioni testate in lab.
Rate-Limiting ed Evasione IDS: Incontri Reali
Durante la scansione /16 sopra, diversi comportamenti hanno indicato contromisure difensive:
| Sintomo | Causa Probabile | Diagnostica | Risposta |
|---|---|---|---|
Tutte le porte filtered dopo risultati iniziali open |
Regola firewall rate-limiting | nping --tcp -p80 --rate 100 vs --rate 1000 |
Ridurre --max-rate a 200, estendere --scan-delay |
| Ritardi consistenti di 10 secondi su risposte SYN | IPS shunning o tarpit | tcptraceroute per identificare l'hop dove appare il ritardo |
Passare a -sS -T1 con decoy: -D RND:10,ME |
| ICMP admin-prohibited solo sulla porta 80 | Negazione ACL esplicita, non drop generico | Confrontare con comportamento porta nota aperta | Documentare come controllo confermato, non fallimento scansione |
| SYN-ACK seguito da RST prima del completo handshake | Proxy SYN o TCP intercept | tcpdump mostra nessun payload dal target |
Ridurre complessità probe; intensità versione a 2 |
⚠️ Solo uso autorizzato e difensivo. Le scansioni con decoy (
-D) e la frammentazione (-f) sono descritte qui per esercizi di validazione IDS e taratura dei propri threshold di rilevamento. Usare solo in ambienti lab o esercizi di validazione rilevamento esplicitamente autorizzati dove si possiede o si ha permesso scritto di testare tutta l'infrastruttura coinvolta.
Errori Comuni nelle Scansioni di Produzione
| Errore | Perché ti danneggia |
|---|---|
Eseguire -A (aggressive) su scope /8 |
Il rilevamento OS e il traceroute moltiplicano il conteggio probe 10×; le scansioni falliscono per esaurimento memoria o ban di rete |
Omettere -n su range grandi |
I timeout del resolver DNS bloccano l'intera scansione; i record PTR rivelano l'intento di ricognizione agli amministratori DNS |
Fidarsi di Service Info: OS: Linux da -sV |
Nmap indovina l'OS dai banner servizio; le app containerizzate riportano il kernel host, non il loro runtime |
Eseguire script NSE brute-force senza --script-args defaults |
Le liste username predefinite (es. oracle-brute) bloccano account dopo 3 tentativi; rivedere sempre gli argomenti brute.* |
Ignorare filtered come "probabilmente niente" |
Le porte filtered spesso indicano i segmenti più sensibili — gli asset che vale la pena nascondere |
Motore di Scripting Nmap: Automazione Personalizzata e Sviluppo NSE
Architettura ed Execution Model di NSE
Il Nmap Scripting Engine (NSE) incorpora un runtime Lua 5.3 che esegue script in parallelo con il motore di pacchetto nativo di Nmap. Non è un'aggiunta successiva applicata allo scanner: gli script vengono eseguiti durante la fase di scansione stessa, non in un passaggio di post-elaborazione. Il motore si lega a Nsock per I/O di rete asincrono, permettendo a centinaia di script di eseguire simultaneamente senza bloccare il thread principale della scansione.
Gli script rientrano in categorie (vuln, exploit, auth, brute, discovery, safe, intrusive, malware, version, default) e si attivano tramite quattro tipi di regola:
| Tipo di regola | Quando si attiva | Utilizzo tipico |
|---|---|---|
prerule |
Prima del discovery dell'host | Configurazione a livello di script, lettura di file |
hostrule |
Dopo il discovery dell'host, per ogni target attivo | Controlli a livello di host (es. analisi traceroute) |
portrule |
Dopo la scansione delle porte, corrispondenza con porte/servizi specifici | Enumerazione dei servizi, controlli di vulnerabilità |
postrule |
Dopo il completamento di tutte le scansioni | Report aggregati, correlazione cross-host |
Le regole restituiscono booleani Lua; il motore di Nmap decide se mettere in coda la funzione action dello script. Una portrule che corrisponde a shortport.http si attiverà contro qualsiasi porta identificata come HTTP da Nmap—sia la 80, la 8080, o una porta non standard con un banner riconoscibile.
Libreria di Script Built-in e Selezione
NSE include centinaia di script. Considera il set predefinito (-sC, equivalente a --script=default) come una linea di base sicura; esegue solo script nelle categorie default, safe, o version che si completano rapidamente e comportano un rischio minimo di crash.
Pattern di esecuzione selettiva:
# Script predefiniti sicuri contro un singolo host
nmap -sC 192.0.2.10
# Categoria specifica — controlli vuln contro un web server
nmap --script vuln -p 80,443 198.51.100.5
# Categorie multiple, separate da virgola
nmap --script "discovery,auth" 192.168.50.0/24
# Escludi script distruttivi anche con globbing
nmap --script "not intrusive" 10.0.3.0/24
Cosa fa:
--script vulncarica tutti gli script nella categoriavuln, verificando CVE noti, debolezze di configurazione e divulgazioni di informazioni. Quando usarlo: Durante le fasi autorizzate di valutazione delle vulnerabilità dopo il discovery iniziale degli host. Rischi: Alcuni scriptvulnsonointrusive—possono attivare allarmi IDS o, in casi rari, causare crash di servizi fragili. Output atteso: Risultati strutturati di vulnerabilità con riferimenti CVE e indicatori di gravità.
Distinzione Lab vs. Produzione:
| Ambiente | Approccio | Motivazione |
|---|---|---|
| Lab | nmap --script "vuln,exploit" --script-args=unsafe=1 |
Copertura completa, accettare crash in reti isolate |
| Produzione | nmap --script "safe,vuln" --max-parallelism 10 --max-retries 2 |
Escludere exploit, limitare il parallelismo, ridurre tempeste di retry |
La categoria exploit merita particolare cautela. Questi script tentano attivamente l'esecuzione di codice o il bypass dell'autenticazione. Sono preziosi per validare lo stato delle patch in un lab, ma un'esecuzione exploit in produzione contro un server shadow IT mancato è un report di incidente in attesa di accadere.
Argomenti degli Script e Interazione Dinamica
Gli script espongono parametri configurabili tramite --script-args e --script-args-file. Questo trasforma gli script statici in strumenti flessibili.
# Passa un User-Agent personalizzato a http-title
nmap --script http-title --script-args http.useragent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)' -p 80,443 192.0.2.15
# Argomenti multipli, delimitati da punto e virgola
nmap --script ssh-brute --script-args "userdb=./users.txt,passdb=./passwords.txt,ssh-brute.timeout=8s" -p 22 198.51.100.20
# Argomenti da file per ripetibilità
nmap --script smb-enum-shares --script-args-file ./smb-args.txt 10.0.4.50
Cosa fa:
http.useragentsovrascrive la stringa User-Agent predefinita di NSE, riducendo il rilevamento basato su firme e corrispondendo alle aspettative di logging del target. Quando usarlo: Quando si testano regole WAF, si riproduce un ambiente client specifico, o si evitano stringhe "Nmap Scripting Engine" nei log. Rischi: Gli User-Agent personalizzati sono banali da impostare; non costituiscono un'evasione significativa contro un monitoraggio maturo. Output atteso: Estrazione http-title identica, ma i log del server riflettono la stringa fornita.
Scopri gli argomenti disponibili per qualsiasi script:
nmap --script-help http-title
nmap --script-help ssh-brute
L'output di --script-help elenca argomenti obbligatori vs. opzionali, valori predefiniti e appartenenza alle categorie. Leggilo prima di eseguire script non familiari—gli script brute in particolare possono bloccare account se non si impostano ritardi adeguati.
Scrivere Script NSE Personalizzati
Gli script personalizzati colmano il divario dove nessuno script esistente corrisponde al tuo protocollo, alla tua logica di rilevamento o al tuo formato di report. Lo script minimamente funzionante richiede quattro campi: description, categories, rule, e action.
Esempio minimale completo — uno script hostrule che verifica se il record PTR di un target risolve a un pattern sospetto:
description = [[
Checks if a reverse-DNS PTR record contains indicators of
dynamic/residential IP space, useful for flagging VPN exit nodes
or residential proxies during incident response.
]]
categories = {"discovery", "safe"}
author = "Analyst Name"
license = "Same as Nmap"
-- Pull in the NSE DNS library
local dns = require "dns"
local stdnse = require "stdnse"
-- Hostrule: run once per host after host discovery
hostrule = function(host)
-- Only run if we have an IP; IPv6 PTR logic differs
return host.ip ~= nil
end
-- Main action
action = function(host)
local status, name = dns.query(host.ip, {dtype="PTR"})
if not status then
return "No PTR record found"
end
local suspicious = {
"dhcp", "dynamic", "pool", "res", "ppp", "dsl", "cable"
}
local lower_name = string.lower(name)
for _, pattern in ipairs(suspicious) do
if string.find(lower_name, pattern, 1, true) then
return string.format("SUSPICIOUS PTR: %s (matched '%s')", name, pattern)
end
end
return string.format("PTR: %s", name)
end
Salva come ptr-suspicious.nse nella directory degli script di Nmap (<nmapdatadir>/scripts/ su Linux, o usa --datadir per puntare altrove). Esegui con:
nmap --script ptr-suspicious 192.0.2.100
Cosa fa: La
hostrulesi attiva dopo il discovery dell'host;actionesegue una lookup DNS inverso e pattern-matching contro parole chiave note di IP dinamici. Quando usarlo: Durante il threat-hunting per segnalare proxy residenziali o fonti di scansione erratamente attribuite. Rischi: I record PTR sono controllabili dall'attaccante; non considerare mai un risultato "pulito" come prova di infrastruttura legittima. Output atteso: Una stringa di pattern corrispondente, un record PTR semplice, o "No PTR record found."
Librerie NSE chiave per lo sviluppo:
| Libreria | Scopo | Funzione di esempio |
|---|---|---|
nmap |
API core: info host/port, creazione socket | nmap.new_socket() |
stdnse |
Utility: formattazione, debug, timing | stdnse.debug(1, "message") |
shortport |
Predicati comuni per portrule | shortport.http |
table |
Helper per manipolazione tabelle | table.contains(t, val) |
string |
Pattern matching, parsing | string.match(response, "Server: (.+)\r\n") |
nsock |
I/O asincrono (tramite metodi socket di nmap) |
socket:connect(host, port) |
Gli script vengono eseguiti in un ambiente Lua sandboxato. Non è possibile importare librerie C arbitrarie o eseguire comandi shell direttamente—questo è voluto. Per logica complessa che richiede dati esterni, usa stdnse.get_script_args() per leggere percorsi di file passati tramite --script-args, poi analizza quei file in puro Lua.
Debug degli Script e Profiling delle Prestazioni
Gli script NSE falliscono silenziosamente per impostazione predefinita—un timeout, una porta chiusa, o una mancata corrispondenza di protocollo non producono output. Forza la visibilità:
# Livello di debug 2: flusso di esecuzione dello script
nmap --script http-title -d2 --script-trace 192.0.2.10
# Traccia completa a livello di pacchetto dell'attività di rete dello script
nmap --script http-title -d3 --packet-trace 192.0.2.10
Cosa fa:
-d2abilita l'output di debug a livello di script;--script-tracestampa ogni lettura/scrittura Nsock. Quando usarlo: Quando uno script non restituisce nulla e si sospetta un edge case di protocollo. Rischi: Le tracce di pacchetto sono voluminose; reindirizza su file. Output atteso: Stack trace Lua, transizioni di stato del socket, e coppie raw di richiesta/risposta HTTP.
Per il profiling sistematico, usa --script-timeout e --host-timeout per impedire che script bloccati rallentino intere fasi di scansione. La funzione stdnse.debug() accetta livelli 1-9; usa il livello 1 per diagnostica in produzione e il livello 3+ solo durante lo sviluppo attivo.
Mantenere Repository di Script Privati
Le organizzazioni con logica di rilevamento personalizzata o firme sensibili non dovrebbero affidarsi alla directory globale degli script di Nmap. Stabilisci una struttura di repository privata:
/opt/nse-private/
├── scripts/ # file *.nse
├── lib/ # Librerie Lua private
├── data/ # File di fingerprint, wordlist
└── update.sh # Deployment version-controlled
Invoca con datadir esplicito:
nmap --datadir /opt/nse-private --script my-custom-script 192.0.2.0/24
O crea symlink di singoli script nella directory di sistema ed esegui --script-updatedb per ricostruire il database degli script. Il file script.db nel datadir è una tabella Lua che Nmap analizza all'avvio; corruzioni qui causano criptici errori "Script not found".
Meccanismi di aggiornamento: il comando built-in nmap --script-update-db reindicizza solo i file locali. Per una vera consegna di aggiornamenti, versiona il tuo repository e fai deploy tramite configuration management (Ansible, Puppet, ecc.). Non tentare di sovrapporre script privati sulla directory upstream di Nmap—gli aggiornamenti dei pacchetti upstream entreranno in conflitto e sovrascriveranno.
NSE vs. Strumenti Esterni: Quando Restare, Quando Uscire
NSE eccelle nell'integrazione stretta con i risultati della scansione: consapevolezza dello stato delle porte, dati del rilevamento versione, e timing delle hostrule sono gratuiti. Vacilla quando hai bisogno di sessioni persistenti, macchine a stati di protocollo complesse, o post-elaborazione pesante.
| Scenario | NSE appropriato? | Alternativa migliore |
|---|---|---|
| Acquisizione header HTTP durante la scansione host | Sì | — |
| Crawl completo di web application e test di form | No | Burp Suite, OWASP ZAP |
| Fingerprinting chiavi SSH | Sì | — |
| Brute-force con logica personalizzata di retry/backoff | Marginale | Hydra, Medusa |
| Exploit con consegna payload multi-stadio | No | Metasploit framework |
| Controllo vulnerabilità con 100+ varianti di richiesta | No | Scanner standalone (OpenVAS, Nessus) |
I moduli Metasploit e gli script NSE si sovrappongono concettualmente ma divergono architetturalmente. NSE viene eseguito stateless per host/porta con secondi di tempo di esecuzione; Metasploit mantiene sessioni, effettua pivoting ed esegue Ruby arbitrario. Uno script come msrpc-enum elencherà interfacce; un modulo Metasploit si legherà a una ed estrarrà hash SAM. Usa NSE per la vastità della ricognizione, Metasploit per la profondità mirata.
Sicurezza degli Script e Denial of Service
La categorizzazione safe vs. intrusive è un segnale, non una garanzia. Gli script safe non causano crash di servizi nei test di Nmap, ma il tuo antico HMI ICS che parla un sottoinsieme HTTP rotto non era in quella matrice di test. Gli script intrusive possono inviare payload che esauriscono tabelle di connessione, riempiono log su disco, o attivano regole fail2ban.
Errori comuni:
| Errore | Perché ti colpisce |
|---|---|
Eseguire script brute senza --script-args brute.delay |
Blocco account, allarmi SIEM, telefonate arrabbiate |
Usare la categoria exploit in produzione senza scoping |
Crash effettivi di servizi su sistemi non patchati |
Globbing --script "*" su grandi reti |
Esaurimento risorse da centinaia di script × migliaia di host |
Ignorare http.max-cache-size e limiti simili |
Bloated di memoria, OOM kills su nodi di scansione a bassa risorsa |
Assumere che safe significhi "impatto di rete zero" |
Qualsiasi sonda aumenta il carico; l'effetto cumulativo conta a scala |
⚠️ Solo uso autorizzato e difensivo. Gli script exploit e intrusive sono progettati per validazione in lab e valutazioni di hardening autorizzate. Non indirizzarli mai a sistemi senza autorizzazione esplicita, documentata, che copra sia lo scope tecnico che l'impatto aziendale di una potenziale interruzione di servizio.
Prima del deployment in produzione, replicare le versioni dei servizi del target in un lab ed eseguire lo script previsto con -d3 --packet-trace. Osservare limiti di rateo di connessione, risposte di protocollo non standard, e crescita di memoria. Uno script che si completa in 0.3 secondi contro nginx può bloccarsi indefinitamente contro un server web embedded personalizzato che non chiude mai il socket.
Ottimizzazione delle prestazioni, tecniche di evasione e contro-rilevamento
Template di Timing e Controllo Granulare
I template -T di Nmap bilanciano velocità, stealth e carico di rete. L'intervallo utile va da -T0 (paranoico, un pacchetto ogni cinque minuti) a -T5 (folle, throughput massimo con potenziale perdita di accuratezza). Per la maggior parte delle valutazioni autorizzate, -T3 (normale) è il default, -T4 è lo standard aggressivo dei laboratori, e -T5 rischia report duplicati da probe persi.
I template configurano una matrice di timer interni. Quando serve un controllo chirurgico, sovrascrivili individualmente:
nmap -sS -p- --min-parallelism 50 --max-retries 2 --host-timeout 10m 192.0.2.0/24
Cosa fa: Esegue SYN-scan su tutte le 65.535 porte TCP con almeno 50 probe in volo, abbandonando un host dopo 2 tentativi o 10 minuti. Quando usarlo: Scansione di una rete lab stabile dove serve certezza di completamento contro host con firewall che scartano silenziosamente i pacchetti. Rischi: Il parallelismo elevato può sopraffare le tabelle di stato su equipaggiamenti di fascia bassa o attivare il rate-limiting. Output atteso: Tabella porte Nmap standard con stati
open,closed,filteredounfilteredper host; gli host che raggiungono--host-timeoutvengono riportati comeSKIPPED.
| Template | Comportamento | Caso d'uso tipico |
|---|---|---|
-T0 / -T1 |
Seriale, 5 min / 15 sec tra i probe | Evasione IDS, target estremamente sensibili |
-T2 |
Cortese, 0.4 sec tra i probe | Carico leggero su infrastruttura condivisa |
-T3 |
Timing dinamico default | Scansione generica |
-T4 |
Aggressivo, 10 ms tra i gruppi, parallelismo variabile | Ambienti lab, valutazioni con time-box |
-T5 |
Folle, assunzioni timeout a 5 ms | Solo segmenti gigabit locali; aspettarsi falsi negativi |
Un errore comune: assumere che -T5 trovi di più. Spesso trova meno, perché gli stimatori di timing di Nmap assumono condizioni di rete che percorsi congestionati o filtrati violano. Una porta marcata filtered a -T5 può rivelarsi open a -T3 con --max-retries 3.
Variante lab (velocità massima):
nmap -sS -T4 -p- --min-rate 1000 --max-rtt-timeout 500ms 10.0.0.0/24
Variante produzione (vincolata):
nmap -sS -T2 -p 22,80,443,8080-8090 --max-rate 100 --max-retries 3 10.0.0.0/24
Frammentazione, Manipolazione MTU e Scansione con Decoy
Nmap supporta la frammentazione IP con -f (frammenti da 8 byte dopo il primo) e --mtu per dimensioni personalizzate. L'obiettivo è suddividere le informazioni di header tra i frammenti, forzando il riassemblaggio prima dell'ispezione. Questo prende di mira sensori IDS/IPS più datati o mal configurati che mancano di motori di riassemblaggio completi.
nmap -sS -f --send-eth -p 22,80,443 192.0.2.100
Cosa fa: Frammenta i probe SYN in payload da 8 byte, bypassando alcuni pattern matcher semplici;
--send-ethforza l'Ethernet grezzo per garantire che Nmap controlli la frammentazione anziché lo stack IP del SO. Quando usarlo: Validare se un sensor edge del target riassembla prima di allertare. Rischi: I sensori moderni riassemblano i frammenti; spesso fallisce contro Suricata conreassemble_fragments: yeso dispositivi Palo Alto. Output atteso: Stati delle porte identici alla scansione non frammentata se avviene il riassemblaggio; le discrepanze rivelano lacune nei sensori.
La scansione con decoy (-D) offusca la vera sorgente intrecciando probe spoofati da host falsi o reali:
nmap -sS -D 198.51.100.1,ME,198.51.100.2 -p 80,443 192.0.2.100
Cosa fa: Invia scansioni da tre sorgenti apparenti;
MEposiziona il tuo IP reale tra i decoy. Il target logga tutti e tre; solo la vera sorgente riceve le risposte. Quando usarlo: Testare se gli analisti dei log correlano gli alert o semplicemente contano le sorgenti. Rischi: I decoy spoofati verso host live generano backscatter e tempeste RST; usare IP di terze parti reali ma non autorizzati è abusivo. Output atteso: La tua console mostra le risposte; i log del target mostrano sorgenti multiple.
⚠️ Solo uso autorizzato e difensivo. Usa queste tecniche solo in ambienti lab o in esercizi di validazione della detection esplicitamente autorizzati.
| Errore | Perché ti punisce |
|---|---|
-f senza --send-eth o --send-ip |
Lo stack del SO spesso riassembla prima della trasmissione, annullando la frammentazione |
| Decoy che sono host live e responsivi | Le loro risposte RST ai SYN non sollecitati creano rumore che aiuta gli analisti a isolare il vero scanner |
Valori --mtu non multipli di 8 |
Nmap rifiuta o frammenta male; verifica con nmap --mtu 16 vs. nmap --mtu 17 |
Spoofing Porta Sorgente, Spoofing MAC e Proxy Chains
Alcune regole firewall si fidano del traffico da porte sorgente specifiche (DNS legacy: 53, dati FTP: 20). Il --source-port di Nmap sfrutta questo:
nmap -sS --source-port 53 -p 22,80 192.0.2.100
Cosa fa: Genera probe SYN da UDP/53, potenzialmente corrispondendo a regole firewall
any port 53. Quando usarlo: Audit di set di regole che confondono numero di porta con fiducia nel servizio. Rischi: Il traffico di ritorno sulla porta 53 può entrare in conflitto con processi DNS locali o non raggiungere il socket senza manipolazioneSO_REUSEADDR. Output atteso: Porteopenche risultanofilteredsenza lo spoof; conferma logica di regola debole.
Lo spoofing dell'indirizzo MAC (--spoof-mac) opera solo su segmenti Ethernet locali e richiede root:
nmap -sS --spoof-mac 00:11:22:33:44:55 -e eth0 192.0.2.100
L'integrazione con proxy chains instrada Nmap attraverso proxy SOCKS4/5 o HTTP, aggiungendo latenza ma offuscando l'origine. Configura /etc/proxychains.conf, poi:
proxychains nmap -sT -Pn -n --max-retries 1 198.51.100.0/24
Cosa fa: Forza scansioni TCP connect (
-sT) attraverso la proxy chain;-Pnsalta il host discovery (l'ICMP non attraversa);-ndisabilita il DNS. Quando usarlo: Test da prospettiva esterna attraverso un pivot o servizio di scansione commerciale. Rischi:proxychainswrappa i socket via LD_PRELOAD, che le scansioni grezze di Nmap bypassano—solo-sTfunziona in modo affidabile. Output atteso: Completamento più lento con latenza del proxy iniettata; semantica degli stati identica.
Meccanica della Scansione Idle/Zombie
La scansione idle (-sI) è la tecnica di Nmap più anonima per quanto riguarda la sorgente. Sfrutta sequenze IPID prevedibili su un host "zombie" per inferire gli stati delle porte senza inviare pacchetti dal tuo IP al target.
Meccanismo: (1) Interroga l'IPID dello zombie; (2) Forgia SYN verso il target con l'indirizzo sorgente dello zombie; (3) Il target risponde SYN/ACK allo zombie (aumentando il suo IPID di 1 se la porta è aperta) o RST allo zombie (IPID invariato se chiusa, o nessuna risposta se filtrata); (4) Re-interroga l'IPID dello zombie. Un delta di 2 significa porta aperta; delta di 1 significa chiusa o filtrata.
Trovare zombie adatti richiede host con allocazione IPID incrementale e traffico basso:
nmap -sI 192.0.2.50:80 -p 22,80,443 198.51.100.25
Cosa fa: Usa
192.0.2.50come zombie, con la porta 80 come porta di probe dello zombie (deve essere aperta per il campionamento IPID). Quando usarlo: Requisiti estremi di anonimato in esercizi red-team autorizzati. Rischi: Zombie con IPID randomizzato o zero (Linux moderno, Windows post-Vista) rendono inutilizzabile la tecnica; zombie ad alto traffico producono delta ambigui. Output atteso: Stati delle porte inferiti tramite cambiamenti IPID; nessun pacchetto dal tuo IP al target eccetto i probe iniziali allo zombie.
Test di idoneità dello zombie:
nmap -sS -O -v --script ipidseq 192.0.2.50
Lab (scoperta aggressiva zombie):
nmap -n -Pn -sS -p 80 --script ipidseq --script-args probeport=80 192.0.2.0/24 | grep -i "incremental"
Produzione (singolo zombie verificato, velocità ridotta):
nmap -sI 192.0.2.50 -p 22,80,443 -T2 --max-retries 2 198.51.100.25
Adattamento al Logging di IDS/IPS e Firewall
L'evasione è una corsa agli armamenti, non una soluzione. I sensori moderni rilevano le scansioni per volume, pattern o anomalia comportamentale—non solo per contenuto dei pacchetti. Un testing autorizzato efficace imita pattern di traffico legittimo piuttosto che inseguire l'invisibilità perfetta.
Strategie di evitamento della firma:
| Tecnica | Limitazione | Contromisura di detection |
|---|---|---|
Throttling dei pacchetti (-T0, --max-rate) |
Completa lentamente; gli attaccanti pazienti vincono comunque | Correlazione time-windowed tra i probe |
Mismatch di protocollo (-sN, -sF, -sX) |
Le scansioni Null/Fin/Xmas falliscono contro filtri stateful e vengono loggate come anomalie comunque | Tracciare combinazioni rare di flag |
Ordine target randomizzato (--randomize-hosts) |
Rompe i log sequenziali ma non i modelli comportamentali | Analisi di cluster per timing e distribuzione dei probe |
Decoy (-D) |
Sorgenti multiple aumentano il carico di lavoro degli analisti | Analisi TTL, correlazione TCP timestamp, matching entropia payload |
La verità onesta: un difensore determinato e dotato di risorse con full packet capture vince contro un singolo scanner. L'evasione compra tempo contro analisti pigri o sensori sottodimensionati. Pianifica per la detection e tieni pronta la documentazione di autorizzazione.
Prospettiva Difensiva: Riconoscere Nmap nei Log
Il valore blue-team deriva dalla comprensione delle impronte degli scanner. La scansione SYN default di Nmap esibisce pattern prevedibili che tcpdump rivela:
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0' -c 20
Campione di output realistico:
14:32:10.123456 IP 203.0.113.50.54321 > 192.0.2.100.80: Flags [S], seq 1234567890, win 1024, length 0
14:32:10.123512 IP 203.0.113.50.54322 > 192.0.2.100.443: Flags [S], seq 1234567900, win 1024, length 0
14:32:10.123578 IP 203.0.113.50.54323 > 192.0.2.100.22: Flags [S], seq 1234567910, win 1024, length 0
Elementi riconoscibili: le porte sorgente incrementano sequenzialmente (54321, 54322, 54323), la dimensione della finestra TCP è fissa a 1024 (default Nmap per alcuni tipi di probe), i numeri di sequenza iniziale avanzano in modo prevedibile, e i probe arrivano in stretti cluster temporali.
Regola Suricata/Snort per rilevamento SYN stealth:
alert tcp any any -> any any (
msg:"NMAP TCP SYN Stealth Scan";
flags:S;
ack:0;
threshold:type both, track by_src, count 20, seconds 60;
reference:url,https://nmap.org/book/synscan.html;
classtype:attempted-recon;
sid:1000001;
rev:1;
)
Questo scatta su 20 pacchetti SYN-senza-ACK da una singola sorgente in 60 secondi. Regola count e seconds sulla tua baseline—le applicazioni legittime possono attivare soglie aggressive.
Per il rilevamento di scansioni zombie, monitora anomalie IPID: un singolo host che mostra incrementi IPID esattamente di 2 con connessioni esterne intrecciate suggerisce probing con sorgente forgiata. Logga le sequenze IPID dove fattibile.
Divulgazione Responsabile: Notificare o Trattenere?
La scoperta di lacune evasione-capaci nell'infrastruttura difensiva crea una scelta scomoda. Lo standard professionale: notificare il proprietario dell'infrastruttura prima di dimostrare l'impatto, a meno che tu non sia il proprietario o detenga autorizzazione esplicita a validare senza pre-briefing. Trattenere tecniche da un report per "rimanere utili per il prossimo impegno" è una mossa limitante per la carriera che erode la fiducia. Documenta cosa hai trovato, come l'hai trovato, e cosa un avversario meno vincolato potrebbe ottenere. Il valore di un red team si misura per ciò che migliora nelle difese, non per i trucchi che rimangono segreti.
Flussi di lavoro per l'analisi dell'output, l'integrazione e il monitoraggio continuo
Analisi Programmatica dell'Output XML di Nmap
L'output XML di Nmap (-oX) è l'unico formato sufficientemente strutturato per un'automazione affidabile. Lo schema è semplice: un elemento radice nmaprun contenente nodi host, ciascuno con figli address, hostnames, ports e os. Per Python, hai due percorsi pratici: la libreria python-nmap per l'orchestrazione diretta delle scansioni con accesso agli oggetti, oppure libnmap (che include parser, report e backend MongoDB/Elastic) per il post-processing di file esistenti. Quando devi solo analizzare—specialmente in un worker CI che non ha eseguito la scansione—evita il wrapper e usa la libreria standard.
Ecco un parser rodato in produzione che estrae le porte nuovamente aperte effettuando il diff rispetto a una baseline di scansione precedente:
#!/usr/bin/env python3
"""Extract new open ports from Nmap XML compared to a baseline."""
import xml.etree.ElementTree as ET
from pathlib import Path
from datetime import datetime
import sys
def parse_ports(xml_path):
"""Return dict: {(ip, port, proto): service_banner}."""
ports = {}
tree = ET.parse(xml_path)
for host in tree.findall('host'):
status = host.find('status')
if status is None or status.get('state') != 'up':
continue
ip = host.find('address').get('addr')
ports_elem = host.find('ports')
if ports_elem is None:
continue
for port in ports_elem.findall('port'):
if port.find('state').get('state') != 'open':
continue
portid = port.get('portid')
proto = port.get('protocol')
service = port.find('service')
banner = ''
if service is not None:
banner = service.get('name', '')
if service.get('product'):
banner += f" {service.get('product')}"
if service.get('version'):
banner += f" {service.get('version')}"
ports[(ip, portid, proto)] = banner.strip()
return ports
def diff_scans(baseline_path, current_path):
baseline = parse_ports(baseline_path)
current = parse_ports(current_path)
new = {k: v for k, v in current.items() if k not in baseline}
closed = {k: v for k, v in baseline.items() if k not in current}
return new, closed
if __name__ == '__main__':
new, closed = diff_scans(sys.argv[1], sys.argv[2])
print(f";; Delta report generated {datetime.utcnow().isoformat()}Z")
for (ip, port, proto), banner in sorted(new):
print(f"[NEW] {ip}:{port}/{proto} {banner}")
for (ip, port, proto), banner in sorted(closed):
print(f"[CLOSED] {ip}:{port}/{proto} {banner}")
Cosa fa: Confronta due file XML di Nmap, riportando le porte apparse o scomparse. Quando usarlo: Job cron notturni, gate CI, o triage incident-response quando servono delta actionable automaticamente. Rischi: XML senza
--service-versionproduce banner vuoti; abbinalo sempre a-sVper diff significativi. Output atteso: Righe prefissate con[NEW]o[CLOSED]con IP, porta, protocollo e fingerprint del servizio.
La libreria python-nmap incapsula il binario ed espone i risultati come dizionari; libnmap offre oggetti di reporting più sofisticati e serializzazione integrata. Entrambe si basano sullo stesso XML sottostante. Per Go o Rust, genera struct dallo schema con xsdgen o serde—la community ha pubblicato diverse implementazioni corrette.
Scansione Differenziale con Ndiff
Per confronti ad-hoc senza scrivere codice, Nmap include ndiff, un diff semantico che comprende la logica di scansione invece di effettuare un semplice diff testuale. Ignora il rumore di timestamp e runtime, concentrandosi sui cambiamenti di stato degli host, delle porte e del SO.
# Lab: Confronto settimanale del segmento lab interno
ndiff /scans/baseline-192.0.2.0-24.xml /scans/weekly-192.0.2.0-24.xml
# Produzione: Scansione a intensità ridotta, stesso flusso di diff
nmap -sS -p- --max-rate 100 --max-retries 2 -oX /scans/prod-weekly.xml 192.0.2.0/24
ndiff /scans/baseline-prod.xml /scans/prod-weekly.xml
Cosa fa: Confronta due file XML di Nmap e restituisce solo i cambiamenti significativi in formato human-readable. Quando usarlo: Revisioni operative settimanali, validazione del change-control, o dopo finestre di manutenzione per rilevare esposizioni non intenzionali. Rischi:
ndiffnon allerta su host mancanti che non hanno risposto; gli host down spariscono silenziosamente da entrambi i report. Output atteso: Righe prefissate con+e-che mostrano servizi acquisiti o persi;=per elementi invariati.
Output realistico di ndiff:
- Nmap 7.94 scan initiated Mon Jan 15 06:00:00 2024 as: nmap -sS -sV -p- -oX baseline.xml 192.0.2.0/24
+ Nmap 7.94 scan initiated Mon Jan 22 06:00:00 2024 as: nmap -sS -sV -p- -oX weekly.xml 192.0.2.0/24
192.0.2.10:
+ 8080/tcp open http Apache Tomcat 9.0.82
- 3306/tcp open mysql MySQL 8.0.34
192.0.2.55:
+ Host is up.
+ 22/tcp open ssh OpenSSH 9.3p1
La riga + 8080/tcp è il tuo segnale: o è avvenuto un deployment senza ticket di change, o è in esecuzione un servizio non autorizzato. La riga - 3306/tcp è altrettanto importante—la scomparsa di un servizio può indicare una risposta a un compromesso (attaccante che copre le tracce) o una misconfigurazione che ha rotto una dipendenza.
Integrazione con Database e Trending
L'archiviazione delle scansioni in PostgreSQL abilita l'analisi longitudinale: "Mostrami tutti gli host dove la porta 3389/RDP è apparsa negli ultimi 90 giorni" o "Conta le istanze SMB esposte per subnet nel tempo." Schema minimale:
CREATE TABLE scans (
scan_id SERIAL PRIMARY KEY,
started_at TIMESTAMPTZ NOT NULL,
target_cidr CIDR,
nmap_version TEXT,
xml_checksum BYTEA UNIQUE
);
CREATE TABLE hosts (
host_id BIGSERIAL PRIMARY KEY,
scan_id INT REFERENCES scans(scan_id),
ip INET NOT NULL,
mac TEXT,
hostname TEXT,
os_guess TEXT,
state TEXT CHECK (state IN ('up', 'down', 'unknown'))
);
CREATE TABLE ports (
port_id BIGSERIAL PRIMARY KEY,
host_id BIGINT REFERENCES hosts(host_id),
port INT,
protocol TEXT,
state TEXT,
service_name TEXT,
product TEXT,
version TEXT,
extrainfo TEXT
);
CREATE INDEX ON ports(port, protocol, state) WHERE state = 'open';
CREATE INDEX ON hosts(ip, scan_id);
Importa tramite COPY da un CSV prodotto dal tuo parser Python, o usa l'estensione xml2 di PostgreSQL per lo shredding diretto dell'XML. Partiziona scans per started_at mensilmente; gli archivi di scansione crescono rapidamente.
Architettura di Scansione Continua
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ Scheduler │────▶│ Scan Jobs │────▶│ Nmap Workers │
│ (cron/ │ │ (temporal/ │ │ (dedicated │
│ Airflow) │ │ ephemeral) │ │ network seg) │
└─────────────┘ └─────────────┘ └─────────────────┘
│
▼
┌─────────────┐
│ XML Output │
│ (S3/nfs) │
└─────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────────┐ ┌─────────────┐
│ Parser │ │ Ndiff │ │ Zenmap/ │
│ (Python)│ │ Engine │ │ Faraday │
└────┬────┘ └──────┬──────┘ └─────────────┘
│ │
▼ ▼
┌─────────┐ ┌─────────────┐
│PostgreSQL│ │ Alerting │
│(trends) │ │ (PagerDuty │
└─────────┘ │ /Slack/API) │
└─────────────┘
Decisioni operative chiave in questa pipeline:
| Decisione | Implicazione pratica |
|---|---|
| Frequenza di scansione dal CI | Scansioni baseline ad ogni deployment; sweep completi settimanali. Troppo frequenti e si desensibilizzano i responder; troppo radi e si accumula drift. |
| Segmentazione dei worker | Esegui Nmap da una NIC/VLAN dedicata con regole firewall esplicite. Un worker compromesso è una miniera d'oro per un attaccante. |
| Ritenzione XML | L'XML raw è 10-50× le righe compresse del DB. Mantieni 90 giorni hot, archivio glacier per il periodo di compliance. |
| Deduplicazione per checksum | XML identici (nessun cambiamento di rete) saltano il parsing; risparmia I/O, rivela infrastruttura stagnante. |
Integrazione con Pipeline CI/CD
Incorpora la scansione baseline nelle pipeline di deployment per intercettare il drift dell'infrastructure-as-code prima che raggiunga la produzione. Esempio GitLab CI:
network-baseline:
image: nmap:latest # pin digest, not tag
variables:
TARGET: "198.51.100.0/24"
RATE: "500" # Production: reduce to 100 or less
script:
- nmap -sS -sV -p- --max-rate $RATE -oX scan-$(date +%s).xml $TARGET
- python3 /scripts/parse_and_alert.py scan-*.xml --baseline /baselines/prod.xml
artifacts:
paths: ["scan-*.xml"]
expire_in: 30 days
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
Cosa fa: La pipeline schedulata esegue Nmap, analizza i risultati, e fallisce se appaiono nuove porte rispetto alla baseline. Quando usarlo: Ad ogni deployment su infrastruttura network-adjacent, o notturnamente per ambienti statici. Rischi: Fallimenti della pipeline da jitter di rete causano alert fatigue; implementa retry con backoff e alerting basato su soglia (es. 3 delta consecutivi). Output atteso: Log del job CI con le nuove porte analizzate, o pass verde se la baseline corrisponde.
Il parser dovrebbe emettere exit code 2 su drift, exit code 0 su match, e exit code 1 su fallimento della scansione—convenzioni standard Nagios che la maggior parte dei sistemi CI e degli hook di monitoring comprendono nativamente.
Visualizzazione e Integrazione con Strumenti di Terze Parti
La vista topologica di Zenmap è adeguata per la comprensione di singole reti ma non scala oltre poche centinaia di host. Per dashboard operative, esporta verso:
| Strumento | Ruolo | Percorso di integrazione |
|---|---|---|
| Faraday | Workspace collaborativo per pentest | Upload XML via API; correlazione con finding di exploit |
| Dradis | Generazione report | Importa XML come evidenza; template per executive summary |
| Grafana | Dashboard time-series | Backend PostgreSQL con query di esposizione porte |
| nmap-vulners | Contesto vulnerabilità | --script nmap-vulners arricchisce i dati porta con riferimenti CVE al momento della scansione |
# Lab: Arricchisci la scansione con lo script vulners per contesto di triage immediato
nmap -sV --script nmap-vulners -p 22,80,443 -oX vuln-enriched.xml 192.0.2.0/24
Cosa fa: Interroga l'API Vulners per CVE associati alle versioni di servizio rilevate. Quando usarlo: Prioritizzazione di servizi esposti; mai come unica valutazione di vulnerabilità. Rischi: Il rilevamento versione è probabilistico; falsi positivi su patch backportate comuni in Linux enterprise. Output atteso: Lista CVE appesa all'output script di ciascuna porta nell'XML.
RustScan come Livello di Accelerazione
Per il discovery iniziale su grandi patrimoni, la velocità ispirata a masscan di RustScan con fallback a Nmap migliora il throughput della pipeline. Non è un sostituto—il rilevamento servizi e gli script richiedono Nmap propriamente detto—ma collassa la fase di discovery da ore a minuti.
# Lab: RustScan per discovery porte, Nmap per ispezione approfondita
rustscan -a 192.0.2.0/24 --range 1-65535 --scan-order random \
-- -sV -sC -oX deep.xml
Il -- passa gli argomenti rimanenti a Nmap. In produzione richiede rate limiting: i default di RustScan sono aggressivi e sovraccaricheranno firewall stateful o triggereranno soglie IDS.
Ritenzione Dati per Archivi Sensibili di Topologia
Gli archivi di scansione contengono una mappa di rete completa—indirizzamento IP, host attivi, versioni servizi, guess SO. Trattali come confidenziali al livello di sensibilità della tua documentazione di rete, non semplicemente come dati di log.
Elementi pratici di policy:
- Ritenzione: 90 giorni online in PostgreSQL, 1-3 anni XML compresso in object storage, poi distruzione crittografica. Il legal hold sospende la cancellazione.
- Accesso: Solo service account per il parser; l'accesso umano richiede break-glass con riferimento ticket loggato.
- Crittografia: XML a riposo (AES-256-GCM via S3 o crittografia filesystem); TLS 1.3 per il trasporto parser-to-database.
- Geografia: Archivia nella stessa giurisdizione della rete; il trasferimento transfrontaliero di mappe infrastrutturali può violare la data residency o attivare review di export control.
Intuizione conquistata sul campo: Una porta marcata
filterednon è un risultato pulito—è una domanda senza risposta. Molti operatori archiviano solo le porteopene perdono il segnale rilevante per la sicurezza dei cambiamenti nelle regole firewall. Archivia gli statifilteredeclosed; il delta dafilteredaopensenza ticket di change è spesso il tuo primo indicatore di intrusione.
Errori comuni, risoluzione diagnostica dei problemi e checklist etica
Quando i Risultati Mentono: Falsi Positivi, Falsi Negativi e Interferenze dei Middlebox
Una porta marcata filtered non è un risultato pulito — è una domanda senza risposta. La trappola più pericolosa nello scanning di rete è assumere che il silenzio equivalga all'assenza, o che una porta aperta sia effettivamente raggiungibile end-to-end.
Cause alla base dei risultati ingannevoli:
| Sintomo | Probabile Colpevole | Priorità Diagnostica |
|---|---|---|
Tutte le porte open su IP esterno |
Proxy trasparente o dispositivo di intercettazione TCP | Verificare con probe a livello applicativo |
Host appare down ma i servizi rispondono |
Firewall stateful che scarta i probe, ICMP bloccato | Usare -Pn con ping specifico per l'applicazione |
| Fingerprint OS incoerente | Pool bilanciato, NAT hairpinning, o host virtualizzato | Multiple passate di scansione da diversi punti di vista |
Commutazione intermittente filtered/open |
Rate limiting o regola firewall dinamica | Ridurre --max-rate, osservare i pattern temporali |
closed inaspettato su servizio noto |
TCP wrappers, hosts.allow/deny, o IPS shun |
Controllare --reason e risposta a livello di pacchetto |
I firewall e i middlebox iniettano risposte sintetiche. Un SYN TCP alla porta 80 che restituisce SYN-ACK potrebbe raggiungere un server web, o potrebbe raggiungere un proxy trasparente che tenterà a sua volta la connessione verso upstream. Lo stato filtered — nessuna risposta, o ICMP admin-prohibited — indica che esiste un dispositivo di controllo, ma non se un servizio si nasconde dietro di esso.
Flag Diagnostici: Leggere la Mente di Nmap
Quando i risultati contraddicono le aspettative, scalare attraverso la verbosità diagnostica prima di ipotizzare.
# Livello 1: Perché Nmap ha concluso ciò che ha concluso?
nmap --reason -p 443 192.0.2.10
# Livello 2: Visibilità a livello di pacchetto (alto volume di output)
sudo nmap --packet-trace -p 443 192.0.2.10
# Livello 3: Version scan con piena disclosure dei probe
sudo nmap -sV --version-trace -p 443 192.0.2.10
# Livello 4: Traccia di esecuzione degli script NSE
sudo nmap --script "http-title" --script-trace -p 80 192.0.2.10
Cosa fa:
--reasonespone l'evidenza esatta per ogni stato di porta:syn-ack,syn-ack ttl 58,no-response,reset,admin-prohibited. Quando usarlo: Triage di prima linea per qualsiasi risultato inaspettato. Rischi: Trascurabili; non aggiunge pacchetti. Output atteso: Riga singola per host/porta con razionale esplicito.
Interpretazione dell'output di --packet-trace:
SENT (0.0423s) TCP 198.51.100.5:42311 > 192.0.2.10:443 S ttl=53 id=49217 iplen=44 seq=298743210 win=1024
RCVD (0.0891s) TCP 192.0.2.10:443 > 198.51.100.5:42311 SA ttl=122 id=0 iplen=44 seq=384721098 win=64240
| Campo | Interpretazione |
|---|---|
SA (SYN-ACK) vs RA (RST-ACK) |
Servizio genuino vs rifiuto attivo |
ttl=122 |
Tipico host Windows; Linux solitamente 64, Cisco IOS 255. TTL incoerente con l'OS atteso suggerisce middlebox o risposta contraffatta. |
id=0 |
Alcuni load balancer azzerano l'IP ID; artefatto utile per il fingerprinting |
Delta temporale 0.0468s |
Confrontare con la baseline; picchi di latenza improvvisi indicano rate limiting o accodamento |
Un valore ttl che salta tra le esecuzioni di scansione — 122, poi 58, poi 241 — è una prova schiacciante di load balancing o infrastruttura anycast. Non fidarsi del rilevamento OS da scansione singola in questi ambienti.
Variante di produzione per reti con vincoli:
# Lab: Traccia pacchetti completa
sudo nmap --packet-trace -T4 -p- 192.0.2.0/24
# Produzione: Limitata, mirata, con reason-only come prima passata
nmap --reason --max-rate 50 -p 22,443,8080 --max-retries 2 192.0.2.0/24
Cosa fa: La variante di produzione limita a 50 pacchetti/secondo, restringe i retry, e riduce lo scope delle porte. Quando usarla: Scansione attraverso collegamenti WAN, durante l'orario lavorativo, o vicino a segmenti fragili IoT/SCADA. Rischi: Più lenta ma previene l'esaurimento delle tabelle di stato sui firewall intermedi. Output atteso: Stessi dati di stato, larghezza di banda e carico sui dispositivi ridotti.
Impatto sull'Infrastruttura: Lo Scanning come Vettore di Denial-of-Service
Nmap può rompere cose che non ti appartengono. I seguenti sono modalità di guasto documentate e riproducibili:
Tempeste di broadcast da probe mal diretti: Domini broadcast di Livello 2 con VLAN scarsamente segmentate possono amplificare il traffico ARP. Una scansione /16 contro una topologia di rete flat genera ARP per ogni target; su reti con switch datati, questo riempie le tabelle CAM e triggera l'unknown unicast flooding.
Esaurimento della tabella di stato: I firewall stateful tracciano lo stato della connessione per ogni flusso. Una SYN scan a -T4 o -T5 contro un firewall con hardware modesto può esaurire la sua tabella di sessione, causando il drop o il mancato stabilimento di connessioni legittime. Questo non è teorico — è una causa frequente di incidenti del tipo "il firewall si è bloccato durante la scansione".
Saturazione della larghezza di banda: Le scansioni di frammentazione (-f) moltiplicano il conteggio dei pacchetti; il rilevamento versione (-sV) e gli script NSE aggiungono payload a livello applicativo. Un nmap -sV -sC -p- contro un /24 remoto su un collegamento MPLS da 10 Mbps lo saturerà per ore.
Incidente reale — scanning non autorizzato che causa outage di produzione:
Nel 2019, un analista junior di sicurezza presso un'azienda manifatturiera europea ha eseguito nmap -p- -sS -T5 contro un intervallo IP ritenuto essere un nuovo segmento server. L'intervallo includeva controller embedded sulla rete di tecnologia operazionale (OT), separata dall'IT solo da un firewall con una regola di permesso mal configurata. La velocità di scansione ha sopraffatto gli stack TCP dei controller; tre programmable logic controllers (PLC) sono entrati in modalità fault, arrestando una linea di produzione per 6,5 ore. L'analista aveva l'approvazione verbale di un IT manager ma nessuna approvazione dell'ingegneria OT, nessuna coordinazione della finestra temporale, e nessun contatto di emergenza. Post-incidente: l'analista è stato licenziato, l'azienda ha affrontato obblighi di notifica normativa, e la regola firewall è risultata esistere da 18 mesi a causa di una dismissione incompleta.
La lezione non è "Nmap è pericoloso" — è che la verifica dello scope e il controllo della velocità sono prerequisiti operazionali, non formalità burocratiche.
Albero Decisionale: Risultati di Scansione Inaspettati
Inizio: Risultato contraddice l'aspettativa (es., porta aperta che dovrebbe essere chiusa)
│
▼
┌─────────────────────────┐
│ Riesegui con --reason │
│ Stesso risultato? │
└─────────────────────────┘
│ No ──► Probabilmente transitorio; annota il timing e prosegui
▼ Sì
┌─────────────────────────┐
│ Controlla --packet-trace│
│ TTL/ID coerenti con il │
│ target atteso? │
└─────────────────────────┘
│ No ──► Interferenza middlebox/proxy/NAT; escala a test stratificati
▼ Sì
┌─────────────────────────┐
│ Lo stato è coerente │
│ tra multiple esecuzioni │
│ da diverse fonti? │
└─────────────────────────┘
│ No ──► Filtraggio dinamico o load balancing; documenta la varianza
▼ Sì
┌─────────────────────────┐
│ Verifica con strumento │
│ indipendente (nc, curl, │
│ openssl s_client) │
└─────────────────────────┘
│ Mismatch ──► La firma del probe Nmap ha triggerato risposta diversa;
│ possibile manipolazione IPS/IDS; ispeziona dispositivi inline
▼ Match
┌─────────────────────────┐
│ Risultato validato: │
│ Aggiorna l'inventario e │
│ valuta l'esposizione │
└─────────────────────────┘
Prevenzione dello Scope Creep e Procedure di Emergenza
Il confine tra "solo un'altra subnet" e un rapporto di incidente è più sottile di quanto la maggior parte immagini. Implementa controlli meccanici, non forza di volontà.
Arresti forzati — non negoziabili:
| Trigger | Azione Immediata |
|---|---|
| Scoperta di etichetta produzione critica (SCADA, MEDICAL, FIN-PROD) | Arresta scansione; verifica che l'autorizzazione copra esplicitamente questo segmento |
| Scansione causa latenza osservabile nelle risposte del target | Riduci --max-rate del 50%; se persiste, interrompi e rischedula |
| Contatto da network operations o SOC | Pausa tutte le scansioni attive; conferma ricezione entro 15 minuti |
| Superamento della finestra temporale concordata | Termina; non "finire questo host" |
Comando di arresto di emergenza: Tieni pronta una shell con pkill -9 nmap, o pre-posiziona uno script che uccida i processi di scansione e registri il timestamp di terminazione. Non affidarti a Ctrl-C attraverso sessioni SSH con lag.
⚠️ Solo uso autorizzato e difensivo. Le tecniche di evasione (
-f,--scanflags,-D,-S,--proxies) sono documentate per la validazione del rilevamento e il testing dell'architettura difensiva. Usare solo in ambienti lab o esercizi esplicitamente autorizzati con approvazione scritta che specifichi tecnica, target e durata.
Obblighi Pre-Engagement e Post-Scan
Template di checklist scaricabile (copia e adatta):
| Fase | Voce | Responsabile | Data/Iniziale |
|---|---|---|---|
| Pre-scan | Autorizzazione scritta con intervalli IP, porte e tecniche permesse | ||
| Confini dello scope confermati: elenco di inclusione esplicito, non "tranne produzione" | |||
| Contatti di emergenza: escalation tecnica e liaison legal/compliance | |||
| Finestra temporale: inizio, arresto forzato, fuso orario, periodi di blackout | |||
| Team di rete notificato; NOC/SOC informato degli IP sorgente della scansione | |||
| Limiti di velocità concordati e configurati nel comando di scansione | |||
| Durante la scansione | Monitoraggio in tempo reale della reattività del target | ||
| Ritenzione dei log: log locali della scansione, packet capture se usati flag diagnostici | |||
| Post-scan | Gestione dei dati: crittografia a riposo, controlli di accesso, periodo di ritenzione | ||
| Conferma distruzione: log eliminati secondo policy di ritenzione, certificati o artefatti eliminati in modo sicuro | |||
| Divulgazione responsabile: risultati riportati al proprietario dell'asset prima della pubblicazione esterna; standard 90 giorni a meno che la criticità richieda urgenza | |||
| Consegna del rapporto: risultati tecnici, rating del rischio, indicazioni di remediation, nessun dato raw nelle email |
Meccanismi di divulgazione responsabile: Un risultato senza un percorso di remediation è una passività, non un risultato. Consegna i rapporti cifrati (PGP o canale approvato dall'organizzazione), con severità calibrata sull'effettiva exploitabilità, non sul massimo teorico CVSS. Include passaggi di riproduzione sufficienti per la verifica ma non per la weaponization. Conferma ricezione. Se il proprietario dell'asset non risponde, consulta il consulente legale prima di qualsiasi divulgazione più ampia — l'approccio "pubblica e fatti maledire" distrugge la fiducia e può esporti a responsabilità.
Conferma distruzione dei dati: I log di Nmap contengono topologia del target, dati banner, e potenzialmente credenziali o identificatori di sessione catturati nell'output NSE. Uno shred -uz o la distruzione del volume cifrato sono insufficienti senza documentazione del processo. Mantieni un log di distruzione con hash crittografico dei dati pre-distruzione se il team di incident response o legale della tua organizzazione richiede evidenza della gestione.
La checklist non è teatro di compliance — è la differenza tra un engagement professionale e un evento limitante per la carriera.