INTERCETTAZIONE TRAFFICO HTTPS E RECUPERO DATI SENSIBILI

12/07/2014

E' possibile recuperare username e password trasmesse in HTTPS? In alcuni casi si. In pratica si tratta del recupero dei dati sensibili trasmessi da altri client della rete locale (credenziali di login tipo facebook, gmail, home banking e chi più ne ha più ne metta). Il trucchetto è abbastanza vecchio e collaudato; oltre a mostrare come eseguirlo correttamente vedremo  le contromisure (e qui ci tengo particolarmente) che finalmente sono state adottate dalla maggior parte dei web server: purtroppo non tutti sono stati aggiornati e moltissimi soffrono ancora di questo tipo di exploit  (siamo nel 2014!).

HTTPS da solo non basta, serve anche la testa! :-)

Come funziona

L'attacco si definisce propriamente come un MITM (Man in the Middle) nel quale andremo ad utilizzare alcuni specifici tool:

https://github.com/moxie0/sslstrip

http://en.wikipedia.org/wiki/DSniff

Durante l'attacco viene temporaneamente rimossa la protezione SSL impostando in modo trasparente l'intero traffico del client vittima in normali sessioni HTTP (invece di HTTPS). Questo permette la cattura e lettura dei dati trasmessi dalla macchina target al server e viceversa.  L'attacco funziona perche' l'attuale infrastruttura PKI di protezione del web non impone l'uso dell' HTTPS per tutta la sessione di navigazione dell'utente: si può tranquillamente richiedere HTTP per alcuni elementi delle pagine web visitate (immagini ad esempio...), poi passare ad HTTPS per altri elementi (form di login...), poi di nuovo ripassare ad HTTP e cosi' via.

https2

Utilizzando il tool SSLStrip e' possibile forzare le parti in comunicazione (server e client target) ad utilizzare sempre ed esclusivamente HTTP invece della versione sicura HTTPS. Facendo passare questo traffico attraverso la nostra macchina (da qui il man in the middle) possiamo collezionare e leggere lo stream di dati trasmessi (in chiaro!).

https

Un po' di background...

HTTPS e' il protocollo standard di protezione del traffico in internet. Viene utilizzato per garantire  trasferimenti riservati di dati nel web. Funziona aggiungendo un livello di crittografia (SSL, Secure Socket Layer) al normale traffico HTTP.

Normalmente il traffico HTTPS puo' essere intercettato ma non decodificato perche' cifrato. Il traffico HTTP invece puo' essere sia intercettato che letto e decodificato (essendo ovviamente in chiaro).

I siti web utilizzano HTTPS quando l'utente deve fornire le proprie credenziali di accesso al sito stesso oppure inviare altri dati sensibili ma possono anche utilizzarlo per tutta la durata della navigazione (come fa GMail, servizi di posta in genere, quasi tutte le online banking e molti altri...).

Questi servizi web non impongono HTTPS e il browser è libero di collegarsi in semplice HTTP.

Esecuzione dell'exploit

La prima fase consiste nel "mettersi in mezzo", ossia modificare il routing di rete affichè tutto il traffico della nostra vittima passi non direttamente al gateway ma venga redirezionato a noi. In soldoni ci impersonifichiamo come gateway della rete wifi (o cablata), prendiamo tutto il traffico generato dal client vittima e lo passiamo al vero gateway; facciamo anche il contrario: tutto il traffico del gateway verso di noi lo passiamo al client vittma. Ci mettiamo letteralmente in mezzo al canale di comunicazione tra client vittima e gateway.

Per far questo prendiamo la nostra distro KALI Linux (io ho utilizzato una macchina virtuale, va bene lo stesso), ci colleghiamo alla rete, otteniamo l'indirizzo IP ed abilitamo l'IP forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward

ipforward_enable

L'IP forwarding va abilitato affinchè i pacchetti possano passare attraverso la nostra macchina in modo trasparente.

A questo punto aggiungiamo una regola al firewall iptables che ci permetterà di acquisire il traffico del client vittima verso di noi:

iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 12345

iptbles_rule

Il client vittima naviga in rete normalmente e questa regola del firewall ci permetterà di acquisire tutto il suo traffico su porta 80 e redirigerlo localmente sulla porta 12345. In ascolto sulla 12345 metteremo SSLStrip che provvederà a modificare le richieste originali di connessione HTTPS prodotte dal client vittima in semplici richieste HTTP.

Occorre ora convincere il client vittima che siamo noi il vero access point e non quello col quale sta comunicando. Per far questo andremo ad alterare le tabelle di routing ARP della rete wifi, in gergo faremo un ARP poisoning (o ARP spoofing) che potremmo tradurre in "avvelenamento della cache ARP" :-) .

In pratica iniziamo ad iniettare una gran quantità di pacchetti ARP nella rete; questi pacchetti comunicano agli altri client della rete che il nostro indirizzo MAC è quello del gateway. In questo modo costringiamo il client vittima a passare da noi prima di uscire su internet. Questa informazione errata può essere inviata ad un singolo client di rete (la vittima designata) oppure mandata in broadcast a tutti i partecipanti.

L'arpspoofing è possibile in quanto il protocollo ARP non prevede autenticazione: è possibile comunicare la verità ("io non sono il gateway") o semplicemente iniettare informazione errata ("io sono il gateway").

Apriamo una nuova console ed avviamo arpspoof:

arpspoof -i eth0 10.0.0.101 10.0.0.1

10.0.0.101 è il client vittima (il mio pc :-) ), 10.0.0.1 il gateway ufficiale (spesso l'AP della rete wifi)

arpspoof_in_action

fatto ciò mettiamo in ascolto SSLStrip sulla porta 12345 e lasciamo che logghi tutto il traffico cifrato del client vittima verso l'esterno. Con Arpspoof che lavora in background, apriamo una nuova console ed avviamo SSLStrip:

sslstrip -l 12345

di default SSLStrip catturerà solo il traffico SSL POST (quindi solo richieste POST sotto HTTPS) ma possiamo anche configurarlo per ricevere anche tutto il traffico SSL o tutto il traffico HTTP/HTTPS.

sslstrip_running

A questo punto non ci resta che passare al client vittima, navigare in un sito "protetto" da HTTPS e provare ad esempio ad accedere al sito con le nostre credenziali.

Allo scopo mostrerò come recuperare le credenziali in HTTPS da un noto sito italiano. Questo sito non è stato ancora messo completamente in sicurezza e l'exploit è ancora valido. Speriamo ovviamente che venga sistemato il prima possibile.

Andiamo alla login del sito:

poste_loginColleghiamoci con le nostre credenziali. La richiesta arriverà prima ad SSLStrip (siamo in una configurazione MITM, quindi tutte le richiste passano dalla distro Kali Linux) che provvederà a trasformare la richiesta di connessione HTTPS in una HTTP normale. SSLStrip logga su file di testo tutta la transazione, compresi i dati di login.

A questo punto ritorniamo sulla distro ed apriamo il file di log di SSLStrip (ssltrip.log). Troveremo la richiesta POST che il client ha effettuato verso il sito. Le credenziali sono leggibili in chiaro:

password_highlight

Fortunatamente l'exploit non funziona su una WAN, occorre che il client target sia nella propria rete locale.

E quindi?

E' stato da poco introdotto (da poco per modo di dire,  nel 2012) l'HTTP Strict Transport Security o HTST

http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

Questo meccanismo impone l'uso di HTTPS per tutta la durata di navigazione del sito. Il browser semplicemente si rifiuta di connettersi al sito tramite il semplice HTTP. La policy, per poter funzionare correttamente, deve essere condivisa ed accettata sia dal server remoto che dal browser. Qui una rapida descrizione:

https://scotthelme.co.uk/hsts-the-missing-link-in-tls/

https://www.eff.org/deeplinks/2014/02/websites-hsts

Ad oggi molti siti internet si sono adeguati tra i quali GMail, Paypal e Twitter. Molti altri, come ad esempio Facebook stentano ad implementarla (la versione mobile è scoperta) e sono quindi ancora vulnerabili. Come dicevo anche i browser devono essere compatibili con HTST, non tutti lo sono e alcuni solo in parte come ad esempio Internet Explorer di Microsoft.

Alcune soluzioni per prevenire l'exploit:

https://serverfault.com/questions/417173/enable-http-strict-transport-security-hsts-in-iis-7

http://www.debian-administration.org/article/662/Enabling_HTTP_Strict_Transport_Security_on_debian_servers


Torna alla home

Commenti

35 commenti


giorgio p (orgpas@gmail.com)
il 22 Dicembre 2015 alle 23:05

sono stato troppo attento ma ho avuto la sensazione di un forte mal di testa!!!!!!!!!!!!

Rispondi


Gianluca (Admin)
il 22 Dicembre 2015 alle 23:23

Ah! in che senso?!?!??

Rispondi


()
il 1 Gennaio 2016 alle 23:30

che non ho capito niente con tutte queste sigle che non sono altro che tranelli informatici...

Rispondi


Mauro (jhonny@live.it)
il 4 Febbraio 2016 alle 19:53

Tranelli informatici?
La guida è ottima e non ci sono tranelli informatici.
Se le tue conoscenze sul world wide web si limitano a digitare nella barra di ricerca del broswer l'indirizzo di facebook è più che normale che non capisci nulla.
Evitate di fare i lamer.

Rispondi


Leo (Leo2001.lf@gmail.com)
il 8 Marzo 2016 alle 19:03

Funziona ancora?

Rispondi


Gianluca (Admin)
il 8 Marzo 2016 alle 19:17

Ciao Leo,
si certo, ci sono ancora siti vulnerabili a questo tipo di attacco. Ma ormai stanno quasi tutti adottando l'HSTS

Rispondi


Leo (Leo2001.lf@gmail.com)
il 8 Marzo 2016 alle 22:20

Gianluca mi potresti dire qualche sito su cui funziona?

Rispondi


Antonio ()
il 8 Marzo 2016 alle 22:37

Sì può fare su tutta la rete e non su un singolo dispositivo?

Rispondi


Gianluca (Admin)
il 18 Marzo 2016 alle 00:03

Ciao Antonio,
cosa intendi per tutta la rete?

Rispondi


Gigi (digitangi@gmail.com)
il 30 Aprile 2016 alle 01:58

Ciao Gianluca e complimenti per la tua guida, molto chiara. Ho seguito passo passo i vari step ma purtroppo il mio browser(Safari) non riesce a stabilire una connessione (questo mi capita solo con i siti in https). Ho provato anche il sito che usi tu nella guida ma non si connette. Come mai?

Rispondi


Gianluca (Admin)
il 30 Aprile 2016 alle 10:58

cambia browser ed usa Chrome. Safari ha qualche problema con i certificati SSL e la PKI in genere. Ad esempio, il PayPal sandbox e' rifiutato da Safari

Rispondi


Gigi (digitangi@gmail.com)
il 5 Maggio 2016 alle 22:14

Comunque ho provato con Chrome e non si bloccano i siti https ma comunque sslstrip non mi da nessun risultato . Ne approficco comunque per segnalarti degli errori:

  1. echo 1 > /proc/sys/net/ipv4/ip_forward" l'apice
  2. arpspoof -i eth0 10.0.0.101 10.0.0.1 qui non manca -t ??
Rispondi


Gianluca (Admin)
il 6 Maggio 2016 alle 23:54

Ciao Gigi, grazie delle correzioni!

Rispondi


Gigi (digitangi@gmail.com)
il 9 Maggio 2016 alle 14:32

Prego Gianluca :)
Comunque non riesco capire cosa sbaglio. Continua a non funzionare

Rispondi


Gianluca (Admin)
il 9 Maggio 2016 alle 14:37

Dove ottieni l'errore? che errore e'?

Rispondi


Michele (o-zone@zerozone.it)
il 31 Gennaio 2017 alle 20:33

Non riesco a capire come mai per intercettare il traffico SSL, tipicamente su porta 443, faccio un PREROUTING sulla porta 80, tipicamente dedicata al traffico non cifrato. Ho paura che sia un errore, ripetuto su più tutorials...

Rispondi


Gianluca (Admin)
il 1 Febbraio 2017 alle 01:10

Ciao Michele, nessun errore. Questo tutorial e quelli che hai visto in giro sono corretti. Ti spiego:


Quando digiti il nome di un sito internet sulla barra degli indirizzi, il browser ti porta di default alla versione http di suddetto sito. Il server quindi istruisce il browser ad andare in https automaticamente.
Digitando "facebook" prima vai a facebook.com:80 e quindi avviene il redirect a https://facebook.com:443. Non molti utenti partono digitando https:// nella barra degli indirizzi, mai visto uno :-)

SSLStrip entra in azione in quel preciso momento, ascolta in 80 redirige il traffico in 12345 e altera tutte le richieste di connessione https future rimuovendo il protocollo SSL (da qui il nome ssl "strip")

ti invito a dare un'occhiata alla presentazione ufficiale a BlackHat 2009 -> https://www.youtube.com/watch?v=MFol6IMbZ7Y e a leggerti il paper originale

Rispondi


Nick (depascalenicola@gmail.com)
il 24 Marzo 2017 alle 23:40

Ciao, il log sslstrip non mi restituisce niente...hai suggerimenti?
Grazie

Rispondi


Gianluca (Admin)
il 25 Marzo 2017 alle 16:05

Ciao Nick, cosa intendi per "il log non ti restiuisce niente?" come lanci sslstrip?

Rispondi


vins (ziobob79@hotmail.it)
il 25 Agosto 2017 alle 16:46

Questo metodo funziona solo su protocollo HTTP , ma con i nuovi aggiornamenti e le nuove sicurezze come : protezione SSL , non riuscirai mai a intercettare le password . Questo perche' non avviene il reindirizzamento dalla pagina da HTTP a HTTPS , ovvero la pagina fake . Questo metodo va benissimo ad esempio se siete collegati in una rete lan , li dove sono connesse telecamere di videosorveglianza , a quel punto una volta avviato "attacco" , bastera' aspettare il primo client che si connette e il gioco è fatto.......

Rispondi


Vale (valeciciretti@libero.it)
il 5 Settembre 2017 alle 15:38

C'è un modo per aggirare il problema dell'HSTS utilizzato dai browser che mi bloccano la navigazione in rete( dato che non permettono la navigazione in http) ?

Rispondi


Gianluca (Admin)
il 5 Settembre 2017 alle 15:41
Rispondi


Riccardo (riccardo-barbero@outlook.it)
il 12 Ottobre 2017 alle 22:07

Ciao Gianluca,
ho Kali Linux su VirtualBox e sto provando qualche trucchetto dal terminale, in particolare per la gestione della rete. Ho trovato questa tua guida e ho provato ad applicarla ma il risultato è...un po' diverso... Ti spiego: ho eseguito da un terminale i comandi echo 1 > /proc/... e iptables... dopodiché ho individuato l'indirizzo IP del mio PC all'interno della rete e dopo aver aperto un altro terminale ho avviato arpspoof -i eth0 -t 192.168.1.3 192.168.1.1 (dove il primo IP è appunto quello del mio PC). Tutto funzionerebbe apparentemente ma...quello che ottengo è un blocco della connessione internet per quell'indirizzo IP! Ho ripetuto la procedura inserendo l'IP del mio cellulare ed effettivamente viene bloccata anche quella...
Cosa può esserci che non va?
Ti ringrazio. Ciao!

Rispondi


Gianluca (Admin)
il 12 Ottobre 2017 alle 23:07

ciao, sono tante le cose che potrebbero essere andate storte, la VM deve essere in rete in modo bridge, non NAT. Prova poi a vedere se le regole iptables sono corrette. Il fatto che l'host si blocchi è buon segno, significa che il suo DNS è stato alterato ma poi non esce su internet perchè forse la VM non riceve la connessione o altro. Causa più probabile, la VM è in rete NAT

Rispondi


Gianluca (Admin)
il 12 Ottobre 2017 alle 23:07

ciao, sono tante le cose che potrebbero essere andate storte, la VM deve essere in rete in modo bridge, non NAT. Prova poi a vedere se le regole iptables sono corrette. Il fatto che l'host si blocchi è buon segno, significa che il suo DNS è stato alterato ma poi non esce su internet perchè forse la VM non riceve la connessione o altro. Causa più probabile, la VM è in rete NAT

Rispondi


Lumpwhisper (loredema2003@gmail.com)
il 20 Novembre 2017 alle 20:51

Immagino sia impossibile, ma con wireshark non si può vero ?

Rispondi


Gianluca (Admin)
il 20 Novembre 2017 alle 22:31

fare cosa esattamente?

Rispondi


Anonymous (5b06cf16de058@example.com)
il 24 Maggio 2018 alle 16:41

cioa, quando scrivo arpspoof ecc ecc mi dice: couldn't arp for host.
soluzioni?

Rispondi


OMENBART458 (antoniom4ak@gmail.com)
il 24 Maggio 2018 alle 16:42

ciao, quando scrivo arpspoof ecc ecc mi dice: couldn’t arp for host.
soluzioni?

Rispondi


TheOldJoker (iscrizioni.jonny@gmail.com)
il 18 Aprile 2019 alle 15:29

ciao, quando scrivo iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 12345 mi restituisce questo errore iptables v1.8.2 (nf_tables): unknown option "--destination-port"
Try `iptables -h' or 'iptables --help' for more information.
come potrei fare per risolvere?

Rispondi


Anonymous (5d8dcc4bf26e9@example.com)
il 27 Settembre 2019 alle 10:46

devi usare il doppio --

Rispondi


cdjabva (yidoxi7469@timothyjsilverman.com)
il 9 Marzo 2021 alle 20:44

che bisogno c'è allora di fare un redirect sulla porta inventata 10000? non era possibile impostare la porta 80 anche qui e successivamente mettere in ascolto anche sslstrip sulla porta 80?

Rispondi


cdjabva (yidoxi7469@timothyjsilverman.com)
il 9 Marzo 2021 alle 20:45

che bisogno c’è allora di fare un redirect sulla porta inventata 10000? non era possibile impostare la porta 80 anche qui e successivamente mettere in ascolto anche sslstrip sulla porta 80?

Rispondi


cdjabva (yidoxi7469@timothyjsilverman.com)
il 9 Marzo 2021 alle 20:46

che bisogno c’è allora di fare un redirect sulla porta inventata 12345? non era possibile impostare la porta 80 anche qui e successivamente mettere in ascolto anche sslstrip sulla porta 80?

Rispondi


dfskbjsd (yidoxi7469@timothyjsilverman.com)
il 10 Marzo 2021 alle 16:20

ottima guida ma ho un dubbio: che bisogno c’è di fare un redirect sulla porta inventata 12345? non era possibile impostare la porta 80 anche qui e successivamente mettere in ascolto anche sslstrip sulla porta 80?

Rispondi


Il tuo nome o email (Se usi l'email potrai essere notificato delle risposte)
Il tuo messaggio