TCP (Transmission Control Protocol): cos'è, come funziona e come sfruttarlo in un pentest

Guida completa a TCP: three-way handshake, flag, sequence number, windowing, port scanning con Nmap, session hijacking, SYN flood e analisi del traffico.
- Pubblicato il 2026-03-26
- Tempo di lettura: 8 min
TCP è il protocollo di trasporto su cui viaggiano la maggior parte delle comunicazioni di rete. Capire cos’è TCP e come funziona il three-way handshake, il windowing, e la gestione delle connessioni è la base di qualsiasi attività di port scanning, exploitation, e analisi del traffico. Senza conoscere TCP non si capisce come funziona Nmap, come si costruisce un exploit, o perché certi attacchi DoS funzionano.
Cos’è TCP #
TCP (Transmission Control Protocol) è definito nell’RFC 793 del 1981. Opera al livello 4 del modello OSI (Transport Layer) sopra IP, fornendo un canale di comunicazione orientato alla connessione, affidabile, e ordinato.
A differenza di IP (connectionless e best-effort) e UDP (connectionless e non affidabile), TCP garantisce:
- Consegna affidabile: ogni segmento deve essere confermato dal destinatario
- Ordine: i segmenti vengono riordinati a destinazione anche se arrivano fuori sequenza
- Controllo del flusso: il mittente non sommerge il destinatario
- Controllo della congestione: riduce la velocità di trasmissione in caso di congestione di rete
- Full-duplex: comunicazione bidirezionale simultanea
Queste garanzie hanno un costo in termini di overhead e latenza — motivo per cui applicazioni che privilegiano velocità su affidabilità usano UDP invece.
Come funziona TCP #
Struttura dell’header TCP #
| Campo | Dimensione | Descrizione |
|---|---|---|
| Source Port | 16 bit | Porta sorgente (1-65535) |
| Destination Port | 16 bit | Porta destinazione |
| Sequence Number | 32 bit | Numero di sequenza del primo byte del payload |
| Acknowledgment Number | 32 bit | Prossimo byte atteso dal mittente |
| Data Offset | 4 bit | Lunghezza header in word da 32 bit |
| Reserved | 3 bit | Riservati |
| Flags | 9 bit | URG, ACK, PSH, RST, SYN, FIN, ECE, CWR, NS |
| Window Size | 16 bit | Dimensione della finestra di ricezione |
| Checksum | 16 bit | Checksum header + payload |
| Urgent Pointer | 16 bit | Puntatore a dati urgenti (se URG è set) |
| Options | variabile | MSS, SACK, Timestamps, Window Scaling |
I flag TCP e il loro significato offensivo #
I flag TCP sono fondamentali per un pentester: ogni combinazione di flag ha un significato diverso nel protocollo, e flag insoliti o non validi possono essere usati per fingerprinting, evasion, e scanning.
| Flag | Bit | Significato | Uso offensivo |
|---|---|---|---|
| SYN | 0x02 | Apertura connessione | SYN scan, SYN flood |
| ACK | 0x10 | Conferma ricezione | ACK scan (firewall bypass) |
| FIN | 0x01 | Chiusura connessione | FIN scan (stealth) |
| RST | 0x04 | Reset connessione | Terminazione forzata sessioni |
| PSH | 0x08 | Push dati all’applicazione | Injection, exploit delivery |
| URG | 0x20 | Dati urgenti | Raramente usato, fingerprinting |
| NULL | 0x00 | Nessun flag | NULL scan (stealth) |
| XMAS | FIN+PSH+URG | Tutti i flag insoliti | XMAS scan (stealth) |
Il Three-Way Handshake #
La connessione TCP si stabilisce in tre passi:
Client Server
| |
|--- SYN (seq=x) --------> | Client inizia
| |
|<-- SYN-ACK (seq=y, | Server risponde
| ack=x+1) ------------ |
| |
|--- ACK (seq=x+1, | Client conferma
| ack=y+1) -----------> |
| |
| === CONNESSIONE === |I numeri di sequenza iniziali (ISN — Initial Sequence Number) devono essere casuali per prevenire TCP session hijacking. Sistemi con ISN prevedibili sono vulnerabili.
Chiusura della connessione TCP #
La chiusura può essere:
Graceful (FIN handshake):
Client --- FIN --> Server
Client <-- ACK --- Server
Client <-- FIN --- Server
Client --- ACK --> ServerAbrupt (RST): Un singolo pacchetto RST chiude immediatamente la connessione da entrambi i lati. Usato dai firewall e dai sistemi per terminare connessioni non desiderate.
TCP Window e Flow Control #
Il campo Window Size indica quanti byte il destinatario può ricevere prima di richiedere una conferma. Il mittente non invia più dati di quanti la finestra permetta.
Con Window Scaling (TCP option), la finestra effettiva può essere molto più grande: finestra_effettiva = window_size * 2^scale_factor.
Una Window Size pari a 0 (zero window) indica che il destinatario non può ricevere altri dati — se persistente, può essere usato per attacchi DoS (TCP zero window attack).
TCP State Machine #
Le connessioni TCP passano attraverso stati ben definiti:
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
↓
SYN_SENT → ESTABLISHEDLo stato TIME_WAIT dura 2×MSL (Maximum Segment Lifetime, tipicamente 60-120 secondi). Porta alla table exhaustion in caso di molte connessioni in chiusura rapida.
Dove viene usato TCP nelle reti #
TCP trasporta la maggior parte del traffico applicativo:
- Web: HTTP (80), HTTPS (443)
- Email: SMTP (25/587), IMAP (143/993), POP3 (110/995)
- Accesso remoto: SSH (22), RDP (3389), Telnet (23)
- File transfer: FTP (20/21), SMB (445), NFS (2049)
- Database: MySQL (3306), PostgreSQL (5432), MSSQL (1433)
- Directory: LDAP (389/636), Kerberos (88)
Qualsiasi servizio che richiede affidabilità usa TCP. In un engagement, la stragrande maggioranza dei target è raggiungibile tramite TCP.
Perché TCP è importante in cybersecurity #
TCP è il protocollo su cui si basano quasi tutti gli attacchi applicativi. Conoscerne i meccanismi a fondo permette di:
- Port scanning preciso: capire perché SYN scan è più stealth di un connect scan
- Firewall evasion: usare flag insoliti per bypassare filtri che analizzano solo SYN
- Session hijacking: sfruttare ISN prevedibili o posizionamento MITM per iniettare dati in sessioni TCP attive
- DoS attacks: SYN flood, RST injection, TCP zero window
- Exploitation: costruire payload che sfruttano il comportamento TCP dello stack target
Per il livello di rete su cui TCP opera, vedi IP Internet Protocol. Per la cifratura delle connessioni TCP, vedi TLS/SSL.
TCP in un engagement di pentesting #
Port scanning con TCP: le diverse tecniche #
SYN scan (half-open scan): il più usato. Invia SYN, riceve SYN-ACK (porta aperta) o RST (porta chiusa) o niente (filtrata). Non completa il handshake — più stealth, meno log nei servizi applicativi.
nmap -sS <target> # SYN scan (default con root)
nmap -sS -p- <target> # Tutte le 65535 porte
nmap -sS --min-rate 5000 <target> # Velocità aggressivaConnect scan: completa il three-way handshake. Genera log nei servizi. Usato quando SYN scan non è disponibile (senza root):
nmap -sT <target>ACK scan: invia solo ACK. Un RST significa che la porta è raggiungibile (non filtrata); nessuna risposta significa filtrata da stateful firewall. Non rileva porte aperte, ma mappa i filtri:
nmap -sA <target>FIN, NULL, XMAS scan: inviano flag insoliti. Le porte aperte non rispondono (su sistemi Unix); le porte chiuse rispondono con RST. Spesso bypassano filtri stateless. Non funzionano su Windows (che risponde con RST su tutto):
nmap -sF <target> # FIN scan
nmap -sN <target> # NULL scan
nmap -sX <target> # XMAS scanFingerprinting dello stack TCP #
Nmap usa una serie di probe TCP con flag, opzioni, e window size specifici per identificare l’OS del target analizzando le risposte. Le differenze nello stack TCP tra Linux, Windows, e Cisco IOS sono sufficienti per un fingerprinting accurato:
nmap -O <target> # OS detection
nmap -O --osscan-guess <target> # Forza una stima anche con pochi datiBanner grabbing e service detection #
Dopo aver identificato le porte aperte, il service detection invia probe specifici e analizza le risposte per identificare il servizio e la versione:
nmap -sV <target>
nmap -sV --version-intensity 9 <target> # Intensità massimaManualmente con netcat:
nc -nv <target> 80
# Poi invia: HEAD / HTTP/1.0\r\n\r\nTCP Session Hijacking #
Su connessioni TCP non cifrate, se un attaccante conosce i numeri di sequenza correnti (ottenibili con sniffing in posizione MITM), può iniettare dati nella sessione con pacchetti forgiati:
from scapy.all import *
# Injection in una sessione TCP esistente
inject = IP(src="victim_ip", dst="server_ip") / \
TCP(sport=victim_port, dport=server_port,
seq=current_seq, ack=current_ack,
flags="PA") / \
"injected payload"
send(inject)SYN Flood (DoS) #
Inviare SYN con IP sorgente spoofati esaurisce la tabella delle half-open connections del server:
hping3 -S --flood -V -p 80 --rand-source <target>I SYN cookie (abilitati di default su Linux) mitigano questo attacco.
RST Injection #
Inviare RST con IP e numeri di sequenza forgiati chiude forzatamente connessioni TCP attive. Tecnica usata da alcuni sistemi di censura e da attacchi DoS mirati a sessioni specifiche.
Attacchi e abusi possibili su TCP #
SYN Flood #
Come descritto: esaurire la tabella delle half-open connections con SYN spoofati. Mitigation: SYN cookies, rate limiting, firewall stateful.
TCP Zero Window Attack #
Aprire connessioni con Window Size 0 o resettarla a 0 dopo l’apertura blocca il mittente che aspetta indefinitamente il permesso di inviare. Efficace contro server con limiti di connessioni concorrenti.
TCP Connection Exhaustion #
Aprire migliaia di connessioni TCP complete (o half-open) verso tutti i servizi disponibili, esaurendo le risorse del server (file descriptor, memoria, connection table).
Idle Scan (TCP Zombie Scan) #
Tecnica di scanning che usa un host “zombie” per nascondere l’IP reale dello scanner. Sfrutta l’IP ID incrementale di alcuni stack TCP:
nmap -sI <zombie_host> <target>TCP Timestamp Information Leakage #
Il TCP Timestamp option rivela l’uptime del sistema e può aiutare a identificare la versione del kernel Linux (il valore incrementa a frequenza nota):
nmap --script tcp-timestamp <target>Esempi pratici con TCP in laboratorio #
Analisi handshake TCP con Wireshark #
tcp.flags.syn == 1 && tcp.flags.ack == 0 # Solo SYN (inizio connessioni)
tcp.flags.reset == 1 # RST — connessioni rifiutate/resettate
tcp.flags.fin == 1 # FIN — chiusura connessioni
tcp.analysis.retransmission # Ritrasmissioni (perdita pacchetti)
tcp.window_size == 0 # Zero windowCostruire pacchetti TCP custom con Scapy #
from scapy.all import *
# SYN packet
syn = IP(dst="192.168.1.1") / TCP(dport=80, flags="S")
response = sr1(syn, timeout=2)
response.show()
# XMAS packet
xmas = IP(dst="192.168.1.1") / TCP(dport=80, flags="FPU")
send(xmas)Analisi delle connessioni attive su un host #
ss -tnp # Connessioni TCP con PID
ss -tnp state established # Solo ESTABLISHED
netstat -tnp # Equivalente classicoDetection e difesa TCP #
- SYN flood: SYN cookies, rate limiting per IP, threshold su half-open connections
- Port scan: IDS con signature per SYN scan rapidi, FIN/NULL/XMAS scan;
portsentry,fail2ban - Session hijacking: cifrare tutto con TLS; eliminare qualsiasi sessione TCP in chiaro per servizi critici
- RST injection: difficile da prevenire senza cifratura; TLS rende inutile l’injection nel payload
- Zero window attack: timeout aggressivi sulle connessioni con zero window; circuit breaker nei servizi
Hardening e mitigazioni TCP #
Abilitare SYN cookies #
sysctl -w net.ipv4.tcp_syncookies=1Ridurre il backlog delle half-open connections #
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_synack_retries=2Timeout aggressivi #
sysctl -w net.ipv4.tcp_fin_timeout=15
sysctl -w net.ipv4.tcp_keepalive_time=300Disabilitare TCP Timestamps (se la privacy è rilevante) #
sysctl -w net.ipv4.tcp_timestamps=0Cifrare tutto con TLS #
Qualsiasi servizio che trasporta dati sensibili su TCP deve usare TLS. TCP da solo non offre confidenzialità né autenticazione dell’identità.
Errori comuni su TCP #
“Un SYN scan è completamente invisibile” Non esattamente. Un SYN scan genera molto traffico anomalo verso molte porte in breve tempo — rilevabile da IDS/IPS anche senza completare il handshake.
“RST significa che la porta è chiusa” Non sempre. Un RST può provenire da un firewall che filtra il traffico. La distinzione closed vs filtered è fondamentale per capire la topologia della rete.
“TCP garantisce la sicurezza dei dati” TCP garantisce affidabilità e ordine, non confidenzialità né autenticazione. I dati viaggiano in chiaro. La sicurezza richiede TLS sopra TCP.
“Il numero di sequenza TCP è imprevedibile” Dipende dall’implementazione. Sistemi moderni usano ISN casuali, ma sistemi vecchi o embedded possono avere ISN prevedibili — vulnerabili a session hijacking.
FAQ su TCP #
Cos’è TCP e come si differenzia da UDP? TCP (Transmission Control Protocol) è un protocollo di trasporto orientato alla connessione che garantisce consegna affidabile, ordinata, e con controllo degli errori. UDP è connectionless e best-effort: più veloce, meno overhead, ma senza garanzie. TCP è usato per applicazioni che richiedono affidabilità; UDP per streaming, DNS, e applicazioni latency-sensitive.
Cos’è il three-way handshake TCP? È il meccanismo di apertura di una connessione TCP: il client invia SYN, il server risponde con SYN-ACK, il client conferma con ACK. Dopo questi tre scambi, la connessione è stabilita e i dati possono fluire in entrambe le direzioni.
Cos’è un SYN scan e perché è più stealth di un connect scan? Un SYN scan invia solo SYN e analizza la risposta senza completare il handshake. Non viene registrata una connessione completa nei log dei servizi applicativi. Un connect scan completa il handshake, generando log più visibili.
Come funziona il SYN flood? Il SYN flood invia una quantità massiva di SYN con IP sorgente spoofati. Il server alloca risorse per ogni half-open connection in attesa del terzo ACK, che non arriverà mai. Quando la tabella è piena, il server non può più accettare connessioni legittime.
Cos’è il TCP session hijacking? È un attacco in cui l’attaccante, in posizione MITM e conoscendo i numeri di sequenza correnti, inietta dati in una sessione TCP attiva tra due host. Efficace solo su connessioni non cifrate (senza TLS).
Conclusione su TCP #
TCP è il protocollo su cui si appoggiano praticamente tutti i servizi di rete. Capirne la struttura — header, flag, handshake, state machine, windowing — non è un dettaglio tecnico secondario: è la base su cui si costruisce qualsiasi attività di port scanning, exploitation, e analisi del traffico.
Gli attacchi su TCP vanno dal SYN flood all’idle scan, dal session hijacking alla RST injection. Tutti richiedono una comprensione solida del funzionamento del protocollo. Tutti sono strumenti reali del toolkit di un pentester.
Approfondisci i protocolli correlati:
- IP Internet Protocol: il livello di rete sottostante
- UDP: trasporto connectionless
- TLS/SSL: cifratura su TCP
- Nmap: port scanning e service detection
- ICMP: diagnostica e complemento a TCP
- Man in the Middle: session hijacking
- Sniffing: analisi del traffico TCP
Riferimento ufficiale: RFC 9293 — Transmission Control Protocol (TCP)
Vuoi approfondire il network pentesting con un percorso strutturato su misura? Formazione 1:1 e assessment su hackita.it/servizi.
HackITA è un progetto gratuito che vive grazie alla community: hackita.it/supporto







