Con Zfone chiamate VoIP inintercettabili
by admin on Jul.24, 2010, under Asterisk, Hacking, Linux, Networking, Sicurezza, Telefonia, Tools, VoIP
Uno dei modi più facili ed efficaci di crittare delle chiamate VoIP, sia audio che video, è ottenibile con il software Zfone. Lo sviluppatore principale del software è Phil Zimmermann, fellow alla Stanford University, noto principalmente per aver creato PGP (Pretty Good Privacy), il software più usato nel mondo per la email encryption.
Zfone utilizza un nuovo protocollo chiamato ZRTP, del quale esiste pure un Internet draft, approvato come RFC, che definisce come i VoIP phones comunichino tra loro in modalità criptata way. Esso è in grado di interagire con un qualsiasi phone che segue lo standard SIP, ma di conseguenza, è in grado di criptare solamente la chiamata destinate ad un altro client ZRTP.
Zfone non è in sè stesso un client VoIP bensì un plugin di tipo universale, adatto ad un’ampia gamma di clients VoIP esistenti, convertendoli effettivamente in terminali sicuri.
Il software Zfone opera nello stack del’ Internet Protocol di qualsiasi piattaforma Windows XP, Mac OS X, oppure Linux, e di fatto intercetta e filtra tutti i pacchetti VoIP in ingresso ed in uscita dalla macchina, rendendo la chiamata sicura on the fly. Si può utilizzare una ampia varietà di differenti clients VoIP per effettuare tali chiamate.
Il software Zfone rileva quando una chiamata inizia, e di conseguenza da avvio ad una negoziazione relativa ad una chiave crittografica ed iniziare tra le due parti, quindi procede a crittare e decrittare i pacchetti voce “on the fly”.
Le chiavi sono stringhe di bits, e senza di esse, non è possibile decrittare la conversazione. Esse vengono automaticamente create all’avvio della chiamata, e distrutte al termine di essa. Solo le due parti terminali conoscono le keys, e l’eventuale compagnia telefonica utilizzata come tramite non ha la possibilità di fornire le chiavi a terze parti.
La chiamata potrebbe venire intercettata, ma cio’ non sarebbe utile. Le keys vengono negoziate tra le due parti usando un algoritmo conosciuto come Diffie-Hellman, che rende computazionalmente inraticabile ad una terza parte ricostruire le chiavi intercettandone la negoziazione.
L’avversario può intercettare tutti i pacchetti di dati relativi alla negoziazione, e ancora non è in grado di estrapolare le chiavi, a meno di non possedere virtualmente infinite risorse di calcolo. Avrebbe bisogno di potenze di calcolo superiori a quelle attualmente in possesso di tutta la razza umana e una infinità di tempo per lavorare su di esse.
Allorquando le due parti abbiano le keys, possono usare standard avanzati di criptazione comunemente usati al giono d’oggi. Si tratta di una codifica molto difficultosa da ricostruire in maniera inversa senza conoscere le keys.
E con “molto difficoltosa,” si intende ancora che i calcoli impiegherebbero milioni di volte l’età dell’ universo.
Tornando coi piedi a terra, cercherò di illustrare un semplice test di Zfone, naturalmente su Linux.
Prima di tutto si tratta di ottenere il software, previa accettazione dei termini d’uso e registrazione tramite un valido indirizzo email al quale verrà recapitato il link da cui effettivamente scaricare il tarball
Distinguendosi dalle altre versioni, quella per Linux viene rilasciata sotto forma di sorgenti, dichiarando esplicitamente che, trattandosi di una massa di smanettoni, sapranno certo cavarsela con un tarball.
L’impresa, che può essere intrapresa evidentemente solo da iniziati alle arti oscure, consiste nello scompattare il tarball in una directory non specificata, pertanto di nostro gradimento, come la mia sfruttatissima /opt/, e dalla risultante directory dei sorgenti, nel caso una pleonastca /opt/zfone/zfone-linux/zfone-linux/, e lanciare il magico:
# ./install.sh
lo script invoca una serie di azioni tipo compilare e configurare la libreria zrtp, la GUI, ed il daemon della call detection (zfoned), operazioni che tuttavia presuppongono che sul sistema si trovino preenti alcuni componenti essenziali.
Per una distribuzione Ubuntu possiamo indicare alcuni tools generici di sviluppo, tipo g++, automake ed autoconf. Pertanto,
# sudo apt-get install g++ automake autoconf
Per quanto riguarda le dipendenze da soddisfare per costruire il ZFone encryption daemon: iptables-dev.
# sudo apt-get install iptables-dev
# sudo apt-get install libglib2.0-dev libgtk2.0-dev
invece, per in installare le dipendenze necessarie a costruire la GUI/Control Panel di ZFone.
Zfone dispone infatti, a scopo di verifica, di una una GUI separata, che indica nel frattempo all’utente se la chiamata è attualmente sicura. È come se Zfone stazionasse tra il client VoIP ed Internet (o la LAN aziendale od accademica ecc.).
Assunto che per prima cosa, in ciascuno dei due agenti terminali, andrà lanciato preventivamente il daemon zfoned, che può anche venire inserito nel contesto autostart usando update-rc.d
# sudo update-rc.d zfone defaults"
tramite il comando:
# /etc/init.d/zfone start
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
[...]
zfoned 3137 root 3u IPv4 14966 0t0 TCP localhost:5000 (LISTEN)
Cui peraltro corrisponde una nuova impostazione delle regole iptables, per l’UDP:
# iptables -L -v -n
Chain INPUT (policy ACCEPT 7359 packets, 5580K bytes)
pkts bytes target prot opt in out source destination
0 0 QUEUE udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:1024:65535
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 QUEUE udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:1024:65535
Chain OUTPUT (policy ACCEPT 7210 packets, 4287K bytes)
pkts bytes target prot opt in out source destination
0 0 QUEUE udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spts:1024:65535
La presenza del target QUEUE sta a significare la consegna dei pacchetti a qualche software in user-land, che li filtri trattandoli in qualche maniera particolare, come evidentemente capita in questo caso.
Per lanciare infine il panello di controllo di Zfone si può usare da console:
# /usr/local/bin/zfone &
oppure selezionare la applicazione ZFone dal Menu–>Internet–>Zfone di Gnome, che fa la sua apparizione in tal modo su entrambi i nodi:

A questo punto occorre che ciascun nodo esegua il proprio client VoIP (SIP).
A questo proposito ho voluto utilizzare due softphone di cui non avevo notizia di alcuna precedente esperienza con Zfone: da una parte Kphone e dall’altra SJphone, nello specifico Kphone su macchina con IP 192.168.1.12 e SJphone su macchina con IP 192.168.1.10.



All’avviamento della chiamata corrispondeva puntualmente il cambiamento di stato di entrambe le GUI terminali:

Il successivo tentativo di estrapolazione di file wav dal file pcap relativo ad una cattura, effettuato con videosnarf:
# videosnarf -i cattura.pcap
Starting videosnarf 0.63
[+]Starting to snarf the media packets
[+] Please wait while decoding pcap file…
added new stream. :192.168.1.12(40572) to 192.168.1.10(49152). codec is 08
added new stream. :192.168.1.10(49152) to 192.168.1.12(55908). codec is 08
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
Protocol: Unsupported
[+]Stream saved to file G711ALAW-media-1.wav
[+]Stream saved to file G711ALAW-media-2.wav
[+]Number of streams found are 2
[+]Snarfing Completed
portava ad ottenere due files sonori di alte frequenze incomprensibili, praticamente dei fruscii:
# play G711ALAW-media-1.wav
G711ALAW-media-1.wav:
File Size: 830k Bit Rate: 283
Encoding: A-law
Channels: 1 @ 13-bit
Samplerate: 8000Hz
Replaygain: off
Duration: 06:30:30.29
[...]
L’interesse per questa tecnologia non termina qui dato che esiste anche un set di patches che forniscono il supporto di ZRTP in Asterisk PBX, che non consente ancora, senza alcuna estensione, chiamate criptate.
Costituirà l’argomento di un prossimo post.

