Fondamenti della Teoria della Scansione di Rete e dell'Architettura Nmap

Comportamento dello Stack TCP/IP: Il Fondamento di Ogni Scansione

La scansione di rete è, nella sua essenza, un esercizio di manipolazione dei protocolli. Per comprendere perché Nmap si comporta come fa, è necessario prima interiorizzare come lo stack TCP/IP elabora i pacchetti a livello fisico.

Il three-way handshake TCP (SYN → SYN-ACK → ACK) esiste per stabilire connessioni affidabili e stateful. Ogni pacchetto trasporta sei flag critici: SYN (synchronize), ACK (acknowledge), RST (reset), FIN (finish), PSH (push) e URG (urgent). La macchina a stati che governa queste transizioni è dove emergono le opportunità di scansione.

Considera il diagramma degli stati canonico: una porta chiusa risponde a qualsiasi SYN inaspettato con RST|ACK, mentre una porta aperta risponde con SYN|ACK. Questa asimmetria è sfruttabile. Un host che riceve un SYN|ACK che non ha mai iniziato (l'"apertura simultanea" o, più comunemente, una risposta a un probe artificiale) risponde con RST—comportamento che Nmap sfrutta per le scansioni inverse. Allo stesso modo, la RFC 793 impone che le porte chiuse devano rispondere con RST a pacchetti FIN, URG o PSH non richiesti, mentre le porte aperte dovrebbero scartarli silenziosamente. Questo comportamento di "FIN scan", tuttavia, varia tra i sistemi operativi (gli stack Windows spesso deviano), creando sia opportunità di fingerprinting che compromessi nell'affidabilità delle scansioni.

La macchina a stati TCP diventa rilevante quando si esaminano i vantaggi dei pacchetti raw di Nmap. In un'operazione standard connect(), lo stack TCP del kernel gestisce l'handshake completo, traccia i numeri di sequenza e mantiene lo stato del socket nelle tabelle del sistema operativo. Quando Nmap utilizza socket raw (modalità privilegiata), aggira completamente questo processo, costruendo i pacchetti byte per byte e interpretando le risposte autonomamente. Questa distinzione non è meramente architetturale—determina quali scansioni è possibile eseguire e quali informazioni è possibile estrarre.

Architettura Core di Nmap: Quattro Motori Interdipendenti

Nmap non è uno scanner monolitico ma un sistema coordinato di sottosistemi specializzati:

Il Scan Engine orchestra la generazione dei probe e l'interpretazione delle risposte. Gestisce i gruppi di host (unità di parallelizzazione), seleziona i tipi di probe in base alle flag di scansione e mantiene la macchina a stati per le porte target. L'efficienza del motore deriva dal suo modello I/O non-bloccante—non attende le risposte in serie ma invia i probe in base ai template di timing e si adatta in base al feedback di rete.

Il NSE (Nmap Scripting Engine) estende Nmap oltre il rilevamento dello stato delle porte. Scritto in Lua, gli script NSE eseguono durante o dopo la fase di scansione, eseguendo probe specifici per servizio, rilevamento di vulnerabilità e persino exploit. Critcamente, NSE opera con accesso ai risultati della scansione: gli script possono targetizzare solo porte aperte o eseguire a livello host indipendentemente dallo stato della porta, a seconda della loro classificazione prerule, hostrule, portrule o postrule.

Il Motore di OS Fingerprinting svolge due funzioni distinte: fingerprinting dello stack TCP/IP (confrontando le risposte dei probe contro nmap-os-db) e rilevamento della versione (-sV). Il primo invia fino a 16 probe accuratamente costruiti—variante opzioni TCP, dimensioni di finestra, comportamento di frammentazione e combinazioni di campi ICMP/TCP/IP—per suscitare peculiarità specifiche dell'implementazione. Il secondo sonda le porte aperte con payload specifici per servizio e confronta i banner contro nmap-service-probes.

Il Sottosistema di Timing governa l'intera orchestrazione. Implementa logica di congestione-avoidance (parallelismo adattivo basato su misurazioni RTT, rilevamento di perdita di pacchetti e rate limiting), traducendo template astratti (-T0 fino a -T5) in parametri concreti: min-rtt-timeout, max-retries, max-scan-delay e parallelism.

Tassonomia degli Stati di Porta: Precisione nell'Ambiguità

Nmap categorizza gli stati delle porte con una granularità deliberata che riflette la realtà di rete, non solo il binario aperto/chiuso:

| Stato | Definizione | Implicazione Diagnostica | |-------|-----------|------------------------| | open | Servizio che accetta connessioni | Confermato accessibile; procedere al rilevamento del servizio | | closed | Porta accessibile ma nessun servizio in ascolto | Firewall assente; host raggiungibile | | filtered | Probe bloccato; nessuna risposta o ICMP admin-prohibited | Firewall o ACL che interviene; stato indeterminato | | unfiltered | Porta risponde ma stato ambiguo (ACK scan) | Stato raro; tipicamente richiede follow-up | | open|filtered | Nessuna risposta a stealth probe (SYN, FIN, NULL, Xmas) | Ambiguità da firewall che scarta probe o porta aperta senza risposta | | closed|filtered | Nessuna risposta a ACK probe | Raro; indica filtrato o comportamento dello stack insolito |

L'ambiguità open|filtered è particolarmente istruttiva: quando una scansione UDP, FIN, NULL o Xmas non produce risposta, Nmap non può distinguere tra una porta filtrata (il firewall ha scartato il probe) e una porta aperta che l'ha accettato silenziosamente. Questo è il motivo per cui queste scansioni sono tipicamente più veloci ma meno definitive delle scansioni SYN.

Fasi di Scansione: Raccolta di Informazioni Orchestrata

Nmap esegue la ricognizione in fasi discrete, sebbene parzialmente sovrapposte:

  1. Host Discovery (-sn, default con la maggior parte delle scansioni): Determina la vitalità dei target tramite ICMP echo, TCP SYN/ACK alla porta 443, TCP SYN alla porta 80 e ICMP timestamp. Completamente saltato con -Pn (tratta tutti i target come online). Questa fase pota la lista dei target prima dell'investimento nella scansione delle porte.

  2. Port Scanning: La fase core di probe. Le tecniche spaziano da -sT (connect) a -sS (SYN stealth) fino a varianti esotiche (-sF, -sX, -sN, -sA, -sW, -sM). Ognuna sfrutta comportamenti specifici del TCP/IP.

  3. Rilevamento Servizio e Versione (-sV): Probe attivo delle porte aperte con payload specifici per protocollo per estrarre informazioni di banner e confrontarle con il database di fingerprint.

  4. OS Detection (-O): Fingerprinting dello stack TCP/IP che richiede almeno una porta aperta e una chiusa per il confronto.

  5. Esecuzione NSE: Dipendente dallo script; può eseguire durante qualsiasi fase o post-scansione.

La separazione delle fasi ha importanza operativa. L'host discovery può essere disabilitato (-Pn) quando si sa che i target esistono ma il ping è bloccato. Il rilevamento del servizio può essere eseguito senza OS detection (-sV senza -O), riducendo il volume dei probe e l'impronta di stealth.

Packet Crafting: Socket Raw versus Connessioni Standard

La distinzione tra scansione privilegiata e non privilegiata è dove la teoria diventa pratica.

Standard Connect Scan (-sT, non privilegiata):

# Esegui come utente normale - il kernel gestisce lo stack TCP
nmap -sT target.example.com

A livello fisico, questo produce traffico indistinguibile da qualsiasi applicazione:

Client              Server
  | ---- SYN --------> |
  | <--- SYN/ACK ----- |
  | ---- ACK --------> |
  | ---- ACK/FIN ----> |  [Nmap chiude immediatamente; handshake completo eseguito]

Il kernel alloca un socket completo, completa l'handshake e Nmap chiama close()—inviando FIN. Questo appare nei log delle applicazioni e nelle tabelle delle connessioni. Senza privilegi di root, il kernel impedisce la creazione di socket raw; Nmap non può impostare flag TCP arbitrari o accedere ai pacchetti di risposta prima dell'elaborazione dello stack.

SYN Stealth Scan (-sS, privilegiata/socket raw):

# Richiede root/sudo - Nmap costruisce i pacchetti direttamente
sudo nmap -sS target.example.com

Comportamento a livello fisico:

Client              Server
  | ---- SYN --------> |  [Nmap costruisce il pacchetto con libpcap/DPDK]
  | <--- SYN/ACK ----- |  [Nmap intercetta tramite packet capture]
  | ---- RST --------> |  [Nmap invia RST per interrompere; handshake mai completato]

Qui Nmap costruisce manualmente gli header IP e TCP, specificando porta sorgente, numero di sequenza, opzioni TCP e flag. Le risposte sono catturate via libpcap (aggirando lo stack TCP del kernel), permettendo a Nmap di vedere risposte RST che terminerebbero una connessione normale, osservare errori ICMP e rilevare condizioni di nessuna risposta per la determinazione dello stato filtrato.

La capacità di socket raw abilita lo spettro completo delle tecniche: FIN scan che inviano pacchetti senza SYN, NULL scan con nessun flag impostato, Xmas scan con FIN|PSH|URG attivi, ACK scan per il mapping delle regole firewall e Window scan che sfruttano variazioni nel campo window del TCP. Ogni tecnica si basa su comportamenti dello stack specifici (mandati dalla RFC o specifici dell'implementazione) che sarebbero impossibili da attivare tramite API di socket standard.

Comprendere questa architettura spiega perché la selezione della scansione conta oltre la stealth: le connect scan funzionano universalmente ma forniscono informazioni limitate e completano l'handshake; le raw scan richiedono privilegi ma offrono granularità di stato, vantaggi di velocità (connessioni half-open) e accesso a risposte che il kernel altrimenti astrarrebbe. La "magia" di Nmap non è affatto magia—è un'implementazione meticolosa del protocollo abilitata dai privilegi che tratta le specifiche TCP/IP come un'interfaccia programmabile piuttosto che un servizio di trasporto black-box.