Identificazione del Sistema Operativo e Analisi dello Stack TCP/IP
L'Anatomia di nmap-os-db: Test, Valori e Corrispondenza Fuzzy
Il motore di fingerprinting del sistema operativo di Nmap opera su un database di circa 5.000+ impronte memorizzate in nmap-os-db. Ogni riga di fingerprint segue un formato preciso: TEST(NAME)=VALUE. Il nome del test codifica il tipo di probe e lo stato della porta target, mentre il valore cattura specifiche caratteristiche della risposta.
Consideriamo questo estratto da un fingerprint Linux:
SEQ(SP=101-105%GCD=1-6%ISR=104-108%TI=I%CI=I%II=I%SS=S%TS=7)
OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%O5=M5B4ST11NW7%O6=M5B4ST11)
WIN(W1=FE88%W2=FE88%W3=FE88%W4=FE88%W5=FE88%W6=FE88)
ECN(R=Y%DF=Y%T=3B-45%TG=40%W=FAF0%O=M5B4NNSNW7%CC=Y%Q=)
T1(R=Y%DF=Y%T=3B-45%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
La riga SEQ testa la prevedibilità del numero di sequenza TCP: SP (indice del numero di sequenza), GCD (massimo comune divisore), ISR (contatore ISR), TI/CI/II (generazione ID TCP/IP/ICMP), SS (numeri di sequenza condivisi) e TS (algoritmo dell'opzione timestamp). I valori con range (101-105) permettono variazione naturale; i segni percentuale separano i campi.
Nmap impiega un algoritmo di corrispondenza fuzzy ponderato piuttosto che l'uguaglianza esatta. Ogni test contribuisce a un punteggio di soggettività—un totale progressivo di "punti di penalità" per le deviazioni dalle corrispondenze perfette. Un punteggio zero indica un comportamento identico; punteggi più alti indicano divergenza. Il motore ordina i candidati per questo punteggio e riporta solo quelli al di sotto delle soglie configurabili. Il formato predefinito di nmap-os-db utilizza codici di singolo carattere per efficienza: R=Y significa "risposta ricevuta: sì," DF=Y significa "bit Don't Fragment impostato," S=O significa "numero di sequenza zero."
I Sedici Test Core sul Comportamento dello Stack TCP/IP
Il rilevamento del sistema operativo di Nmap invia una serie attentamente orchestrata di probe e misura sedici dimensioni comportamentali distinte. Questi test rivelano peculiarità specifiche dell'implementazione che differenziano i sistemi operativi a livello di kernel.
TTL Iniziale (campi T/TT): Il valore TTL iniziale varia in base al SO—64 (Linux, macOS), 128 (Windows), 255 (Cisco IOS, Solaris). Nmap misura sia il TTL grezzo (T) che ipotizza il valore iniziale (TG). Un pacchetto di risposta con TTL 117 probabilmente è partito da 128 e ha attraversato 11 hop.
Dimensione della Finestra TCP (campi WIN/W): La finestra annunciata nelle risposte SYN-ACK segue spesso pattern specifici del SO. Windows Server 2019 tipicamente annuncia 64240; Linux 5.x utilizza 29200 o 65535. Alcuni sistemi variano la dimensione della finestra in base all'MSS, rivelando dettagli dell'implementazione dello scaling RFC 1323.
Bit Don't Fragment (DF): Il fatto che il target imposti il bit DF nelle risposte indica il supporto per il path MTU discovery e la filosofia dello stack. I sistemi moderni tipicamente impostano DF; i dispositivi embedded potrebbero non farlo.
Generazione della Sequenza IP ID (campi TI/CI/II): L'algoritmo di generazione del campo identificazione IP rivela informazioni critiche. TI=I indica ID incrementali (prevedibili, comuni nei sistemi più vecchi); TI=RI significa incrementi casuali; TI=Z indica zero (alcuni firewall). Questo test distingue Windows (I o RI) da Linux (I nei kernel più vecchi, più complesso nei più recenti).
Ordinamento e Padding delle Opzioni TCP (campi O1-O6): Forse l'elemento di fingerprint più distintivo. Ogni campo O codifica le opzioni come stringhe tipo-lunghezza-valore. M5B4 significa opzione MSS con valore 1460 (0x05B4); S significa acknowledgment selettivo permesso; T significa timestamp; N significa padding NOP; W7 significa fattore di scala della finestra 7.
Ad esempio, O1=M5B4ST11NW7 decodifica in: MSS 1460, SACK permesso, Timestamp con TSval e TSecr, padding NOP, Window scale 7. L'ordinamento è critico: Linux tipicamente posiziona MSS per primo; Windows spesso lo posiziona diversamente o omette SACK. Il padding con NOP per raggiungere l'allineamento a quattro byte rivela scelte del compilatore e dell'implementazione dello stack.
Test aggiuntivi includono notifica esplicita della congestione TCP (ECN), comportamento del timestamp TCP, gestione del numero di acknowledgment (test T1-T7 contro vari stati di porta) e analisi della risposta ICMP di porta UDP chiusa.
Fingerprinting Attivo Versus Passivo: Metodologia e Integrazione
Il flag -O di Nmap esegue fingerprinting attivo—inviando probe craftati e analizzando le risposte. Questo è rilevabile, intrusivo e spesso loggato dai sistemi di rilevamento delle intrusioni. L'alternativa, fingerprinting passivo, osserva il traffico esistente senza generare nuovi pacchetti.
Nmap si integra con l'analisi passiva in stile p0f principalmente attraverso il compromesso --osscan-limit. Quando specificato, Nmap limita il rilevamento del SO ai target con almeno una porta aperta e una chiusa, migliorando drasticamente l'accuratezza a scapito di saltare i target "difficili". Senza questo flag, Nmap tenta il rilevamento del SO contro qualsiasi host che risponde, producendo potenzialmente risultati inaffidabili.
Il vantaggio del fingerprinting attivo è il controllo: i probe sono temporizzati precisamente, targetizzano stati di porta specifici e mettono alla prova comportamenti edge case. Il vantaggio del fingerprinting passivo è la stealth ma richiede di osservare traffico significativo (scambi SYN, errori ICMP) e non può sondeggiare direttamente porte chiuse. Per operazioni red team, la raccolta passiva via p0f o analisi di cattura pacchetti precede qualsiasi conferma attiva.
Il Requisito della Porta Aperta/Chiusa e le Implicazioni di --osscan-guess
Un vincolo critico, spesso frainteso: il rilevamento del SO di Nmap richiede almeno una porta aperta e una chiusa per piena accuratezza. Questo requisito esiste perché diversi test targetizzano diversi stati di porta. I test sui numeri di sequenza richiedono una porta aperta per inviare probe SYN; il comportamento ICMP port-unreachable richiede una porta UDP chiusa; certe negoziazioni delle opzioni TCP differiscono tra risposte aperte e chiuse.
Quando questa condizione ideale non è soddisfatta, Nmap applica penalità al punteggio di soggettività e può rifiutarsi di presentare risultati. Consideriamo questo scenario:
nmap -O --osscan-guess 192.168.1.50
Senza --osscan-guess, Nmap outputta: "OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.34 seconds"—nessun SO identificato. Il motore ha trovato corrispondenze candidate ma con insufficiente confidenza.
Con --osscan-guess (o -A, che lo abilita implicitamente), Nmap presenta le corrispondenze più vicine indipendentemente dalla soglia, prefisse da percentuali di confidenza. L'output assomiglia a:
Aggressive OS guesses: Linux 5.4 - 5.10 (87%), Linux 5.0 - 5.5 (85%),
Linux 4.15 - 5.8 (83%)
No exact OS matches for host (test conditions non-ideal).
La confidenza dell'87% indica una corrispondenza forte ma non definitiva—probabilmente a causa di test su porte chiuse mancanti o filtraggio pacchetti. Questo flag dovrebbe essere usato con cautela: i risultati congetturati nelle valutazioni di sicurezza possono portare a selezione errata di exploit o sforzi di hardening fuorviati.
Punteggio di Soggettività e Standardizzazione CPE
Il punteggio di soggettività di Nmap opera su una scala interna dove punteggi più bassi indicano corrispondenze migliori. Il motore calcola questo confrontando il valore osservato di ogni test con la voce del database, applicando pesi specifici del test. Le opzioni TCP e il comportamento dei numeri di sequenza hanno pesi più alti del TTL perché sono più distintive.
Quando più fingerprint pareggiano o quasi pareggiano, Nmap riporta tutte le corrispondenze. Il sistema di punteggio incorpora importanza delle feature: i test sulla dimensione della finestra differenziano versioni Windows più affidabilmente delle distribuzioni Linux; il comportamento del timestamp distingue varianti BSD.
La standardizzazione dell'output utilizza il formato Common Platform Enumeration (CPE): cpe:/o:linux:linux_kernel:5.10. Questo abilita il parsing automatico, la correlazione delle vulnerabilità e l'integrazione con la gestione degli asset. L'output XML di Nmap (-oX) include esplicitamente i dati CPE; il formato grepable (-oG) non lo fa.
Evasione, Inganno e Contro-Fingerprinting
Gli avversari distruggono attivamente il fingerprinting del SO attraverso diverse tecniche. IP Personality (un modulo iptables di Linux) modifica le caratteristiche dei pacchetti in uscita per mimare stack alternativi—cambiando TTL, dimensione della finestra, ordinamento delle opzioni TCP e comportamento del timestamp. La configurazione richiede di specificare una personalità target:
iptables -t mangle -A POSTROUTING -o eth0 -j OSFAKE --os "Linux 2.4"
Middlebox di scrubbing—firewall, load balancer e proxy—normalizzano il traffico, spesso producendo fingerprint "confusi" che non corrispondono a nessun SO noto. I dispositivi Palo Alto Networks, Fortinet e Cisco ASA in modalità trasparente esibiscono frequentemente questo comportamento.
Inconsistenze deliberatamente dello stack rappresentano un inganno avanzato: un host Linux potrebbe usare dimensioni tipiche di Windows per la finestra ma opzioni tipiche di Linux per il TCP, o randomizzare comportamenti per connessione. Strumenti di ricerca come zscrambler implementano questo approccio.
Quando si incontrano fingerprint sospette, esaminare le contraddizioni interne: Il TTL suggerisce Windows mentre le opzioni TCP suggeriscono Linux? Le frequenze dei timestamp sono fisicamente impossibili? L'output -d (debug) di Nmap rivela i risultati grezzi dei test per analisi manuale.
Limitazioni IPv6 e Contributo della Comunità
Il fingerprinting del SO IPv6 rimane significativamente meno maturo rispetto a IPv4. Il nmap-os-db contiene molte meno impronte IPv6, e certi test (in particolare l'analisi della sequenza IP ID) sono meno affidabili a causa dello spazio di indirizzi più grande di IPv6 e della diversa struttura dell'header. Il flag -6 abilita la scansione IPv6, ma -O contro target IPv6 produce frequentemente "No OS matches" o congetture a bassa confidenza.
Le soluzioni alternative attuali includono correlazione dual-stack (fingerprinting IPv4 e inferenza dell'identità IPv6), osservazione passiva del comportamento IPv6 neighbor discovery e analisi manuale delle risposte ICMPv6. Il team di sviluppo di Nmap sollecita attivamente sottomissioni di fingerprint IPv6.
Per contribuire nuovi fingerprint, usare --osscan-guess contro target noti, catturare l'output debug (-d --packet-trace) e sottomettere a https://nmap.org/submit/ seguendo il formato template. Includere versione esatta del SO, versione del kernel, configurazione di rete (VM o bare metal) e qualsiasi dispositivo intermedio. Sottomissioni di alta qualità con multiple verifiche contro target diversi espandono significativamente la copertura del database.
Guida sull'affidabilità: Trattare i punteggi di soggettività sotto 100 come affidabili; 100-250 come borderline che richiede cross-validazione; sopra 250 come attivamente sospetti. Correlare sempre il rilevamento del SO con la scansione delle versioni dei servizi (-sV) e i risultati degli script per la difesa in profondità della propria accuratezza di valutazione.