networking

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

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 #

CampoDimensioneDescrizione
Source Port16 bitPorta sorgente (1-65535)
Destination Port16 bitPorta destinazione
Sequence Number32 bitNumero di sequenza del primo byte del payload
Acknowledgment Number32 bitProssimo byte atteso dal mittente
Data Offset4 bitLunghezza header in word da 32 bit
Reserved3 bitRiservati
Flags9 bitURG, ACK, PSH, RST, SYN, FIN, ECE, CWR, NS
Window Size16 bitDimensione della finestra di ricezione
Checksum16 bitChecksum header + payload
Urgent Pointer16 bitPuntatore a dati urgenti (se URG è set)
OptionsvariabileMSS, 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.

FlagBitSignificatoUso offensivo
SYN0x02Apertura connessioneSYN scan, SYN flood
ACK0x10Conferma ricezioneACK scan (firewall bypass)
FIN0x01Chiusura connessioneFIN scan (stealth)
RST0x04Reset connessioneTerminazione forzata sessioni
PSH0x08Push dati all’applicazioneInjection, exploit delivery
URG0x20Dati urgentiRaramente usato, fingerprinting
NULL0x00Nessun flagNULL scan (stealth)
XMASFIN+PSH+URGTutti i flag insolitiXMAS scan (stealth)

Il Three-Way Handshake #

La connessione TCP si stabilisce in tre passi:

text
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):

text
Client --- FIN --> Server
Client <-- ACK --- Server
Client <-- FIN --- Server
Client --- ACK --> Server

Abrupt (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:

text
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
          ↓
       SYN_SENT → ESTABLISHED

Lo 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.

bash
nmap -sS <target>           # SYN scan (default con root)
nmap -sS -p- <target>       # Tutte le 65535 porte
nmap -sS --min-rate 5000 <target>  # Velocità aggressiva

Connect scan: completa il three-way handshake. Genera log nei servizi. Usato quando SYN scan non è disponibile (senza root):

bash
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:

bash
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):

bash
nmap -sF <target>   # FIN scan
nmap -sN <target>   # NULL scan
nmap -sX <target>   # XMAS scan

Fingerprinting 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:

bash
nmap -O <target>                    # OS detection
nmap -O --osscan-guess <target>     # Forza una stima anche con pochi dati

Dopo aver identificato le porte aperte, il service detection invia probe specifici e analizza le risposte per identificare il servizio e la versione:

bash
nmap -sV <target>
nmap -sV --version-intensity 9 <target>   # Intensità massima

Manualmente con netcat:

bash
nc -nv <target> 80
# Poi invia: HEAD / HTTP/1.0\r\n\r\n

TCP 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:

python
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:

bash
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:

bash
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):

bash
nmap --script tcp-timestamp <target>

Esempi pratici con TCP in laboratorio #

Analisi handshake TCP con Wireshark #

text
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 window

Costruire pacchetti TCP custom con Scapy #

python
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 #

bash
ss -tnp               # Connessioni TCP con PID
ss -tnp state established   # Solo ESTABLISHED
netstat -tnp          # Equivalente classico

Detection 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 #

bash
sysctl -w net.ipv4.tcp_syncookies=1

Ridurre il backlog delle half-open connections #

bash
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_synack_retries=2

Timeout aggressivi #

bash
sysctl -w net.ipv4.tcp_fin_timeout=15
sysctl -w net.ipv4.tcp_keepalive_time=300

Disabilitare TCP Timestamps (se la privacy è rilevante) #

bash
sysctl -w net.ipv4.tcp_timestamps=0

Cifrare 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:

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

#three-way-handshake #syn-flood

DIVENTA PARTE DELL’ÉLITE DELL’HACKING ETICO.

Accedi a risorse avanzate, lab esclusivi e strategie usate dai veri professionisti della cybersecurity.

Non sono un robot

Iscrivendoti accetti di ricevere la newsletter di HACKITA. Ti puoi disiscrivere in qualsiasi momento.