hacktricks/network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

17 KiB

SIP (Protocolo de Inicio de Sesión)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Información Básica

SIP (Protocolo de Inicio de Sesión) es un protocolo de señalización y control de llamadas ampliamente utilizado para establecer, modificar y terminar sesiones multimedia, incluyendo voz, video y mensajería instantánea, sobre redes IP. Desarrollado por el Grupo de Trabajo de Ingeniería de Internet (IETF), SIP está definido en RFC 3261 y se ha convertido en el estándar de facto para VoIP y comunicaciones unificadas.

Algunas características clave de SIP incluyen:

  1. Protocolo basado en texto: SIP es un protocolo basado en texto, lo que lo hace legible para los humanos y más fácil de depurar. Está basado en un modelo de solicitud-respuesta, similar a HTTP, y utiliza métodos como INVITE, ACK, BYE y CANCEL para controlar las sesiones de llamadas.
  2. Escalabilidad y flexibilidad: SIP es altamente escalable y se puede utilizar en implementaciones de pequeña escala, así como en entornos empresariales y de operadores de telecomunicaciones de gran tamaño. Se puede extender fácilmente con nuevas características, lo que lo hace adaptable a varios casos de uso y requisitos.
  3. Interoperabilidad: La amplia adopción y estandarización de SIP aseguran una mejor interoperabilidad entre diferentes dispositivos, aplicaciones y proveedores de servicios, promoviendo una comunicación sin problemas en varias plataformas.
  4. Diseño modular: SIP funciona con otros protocolos como RTP (Protocolo de Transporte en Tiempo Real) para la transmisión de medios y SDP (Protocolo de Descripción de Sesión) para describir sesiones multimedia. Este diseño modular permite una mayor flexibilidad y compatibilidad con diferentes tipos de medios y códecs.
  5. Servidores proxy y de redireccionamiento: SIP puede utilizar servidores proxy y de redireccionamiento para facilitar el enrutamiento de llamadas y proporcionar funciones avanzadas como el reenvío de llamadas, la transferencia de llamadas y los servicios de correo de voz.
  6. Presencia y mensajería instantánea: SIP no se limita a la comunicación de voz y video. También admite presencia y mensajería instantánea, lo que permite una amplia gama de aplicaciones de comunicación unificada.

A pesar de sus muchas ventajas, SIP puede ser complejo de configurar y administrar, especialmente al tratar con problemas de NAT y firewall. Sin embargo, su versatilidad, escalabilidad y amplio soporte en la industria lo convierten en una opción popular para la comunicación multimedia y VoIP.

Métodos SIP

Los métodos SIP principales definidos en RFC 3261 incluyen:

  1. INVITE: Se utiliza para iniciar una nueva sesión (llamada) o modificar una existente. El método INVITE lleva la descripción de la sesión (normalmente utilizando SDP) para informar al destinatario sobre los detalles de la sesión propuesta, como los tipos de medios, códecs y protocolos de transporte.
  2. ACK: Se envía para confirmar la recepción de una respuesta final a una solicitud INVITE. El método ACK garantiza la confiabilidad de las transacciones INVITE proporcionando una confirmación de extremo a extremo.
  3. BYE: Se utiliza para terminar una sesión establecida (llamada). El método BYE es enviado por cualquiera de las partes en la sesión para indicar que desean finalizar la comunicación.
  4. CANCEL: Se envía para cancelar una solicitud INVITE pendiente antes de que se establezca la sesión. El método CANCEL permite al remitente abortar una transacción INVITE si cambia de opinión o si no hay respuesta del destinatario.
  5. OPTIONS: Se utiliza para consultar las capacidades de un servidor o agente de usuario SIP. El método OPTIONS se puede enviar para solicitar información sobre los métodos admitidos, los tipos de medios u otras extensiones sin establecer realmente una sesión.
  6. REGISTER: Utilizado por un agente de usuario para registrar su ubicación actual con un servidor de registro SIP. El método REGISTER ayuda a mantener una asignación actualizada entre el URI SIP de un usuario y su dirección IP actual, lo que permite el enrutamiento y la entrega de llamadas.

{% hint style="warning" %} Tenga en cuenta que para llamar a alguien no es necesario usar el REGISTER para nada.
Sin embargo, es posible que para realizar un INVITE el llamante necesite autenticarse primero o recibirá una respuesta 401 Unauthorized. {% endhint %}

Además de estos métodos principales, hay varios métodos de extensión SIP definidos en otros RFC, como:

  1. SUBSCRIBE: Definido en RFC 6665, el método SUBSCRIBE se utiliza para solicitar notificaciones sobre el estado de un recurso específico, como la presencia de un usuario o el estado de una llamada.
  2. NOTIFY: También definido en RFC 6665, el método NOTIFY es enviado por un servidor para informar a un agente de usuario suscrito sobre cambios en el estado de un recurso monitoreado.
  3. REFER: Definido en RFC 3515, el método REFER se utiliza para solicitar que el destinatario realice una transferencia o se refiera a un tercero. Esto se utiliza típicamente para
INVITE sip:jdoe@example.com SIP/2.0
Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: John Doe <sip:jdoe@example.com>
From: Jane Smith <sip:jsmith@example.org>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:jsmith@pc33.example.com>
User-Agent: ExampleSIPClient/1.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp
Content-Length: 142

v=0
o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com
s=-
c=IN IP4 pc33.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000te
Explicación de cada parámetro
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Esta línea indica el método (INVITE), el URI de solicitud (sip:jdoe@example.com), y la versión de SIP (SIP/2.0).
  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - La cabecera Via especifica el protocolo de transporte (UDP) y la dirección del cliente (pc33.example.com). El parámetro "branch" se utiliza para la detección de bucles y la coincidencia de transacciones.
  3. Max-Forwards: Max-Forwards: 70 - Este campo de cabecera limita el número de veces que la solicitud puede ser reenviada por los proxies para evitar bucles infinitos.
  4. To: To: John Doe <sip:jdoe@example.com> - La cabecera To especifica el destinatario de la llamada, incluyendo su nombre de visualización (John Doe) y URI de SIP (sip:jdoe@example.com).
  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - La cabecera From especifica el remitente de la llamada, incluyendo su nombre de visualización (Jane Smith) y URI de SIP (sip:jsmith@example.org). El parámetro "tag" se utiliza para identificar de manera única el papel del remitente en el diálogo.
  6. Call-ID: Call-ID: a84b4c76e66710 - La cabecera Call-ID identifica de manera única una sesión de llamada entre dos agentes de usuario.
  7. CSeq: CSeq: 314159 INVITE - La cabecera CSeq contiene un número de secuencia y el método utilizado en la solicitud. Se utiliza para hacer coincidir las respuestas con las solicitudes y detectar mensajes fuera de orden.
  8. Contact: Contact: <sip:jsmith@pc33.example.com> - La cabecera Contact proporciona una ruta directa al remitente, que se puede utilizar para solicitudes y respuestas posteriores.
  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - La cabecera User-Agent proporciona información sobre el software o hardware del remitente, incluyendo su nombre y versión.
  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - La cabecera Allow enumera los métodos SIP admitidos por el remitente. Esto ayuda al destinatario a entender qué métodos se pueden utilizar durante la comunicación.
  11. Content-Type: Content-Type: application/sdp - La cabecera Content-Type especifica el tipo de medio del cuerpo del mensaje, en este caso, SDP (Protocolo de Descripción de Sesión).
  12. Content-Length: Content-Length: 142 - La cabecera Content-Length indica el tamaño del cuerpo del mensaje en bytes.
  13. Cuerpo del mensaje: El cuerpo del mensaje contiene la descripción de sesión SDP, que incluye información sobre los tipos de medios, códecs y protocolos de transporte para la sesión propuesta.
  • v=0 - Versión del protocolo (0 para SDP)
  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Identificador de origen y sesión
  • s=- - Nombre de la sesión (un guión indica que no hay nombre de sesión)
  • c=IN IP4 pc33.example.com - Información de conexión (tipo de red, tipo de dirección y dirección)
  • t=0 0 - Información de temporización (tiempos de inicio y finalización, 0 0 significa que la sesión no está limitada)
  • m=audio 49170 RTP/AVP 0 - Descripción de medios (tipo de medio, número de puerto, protocolo de transporte y lista de formatos). En este caso, especifica un flujo de audio utilizando RTP/AVP (Protocolo de Transporte en Tiempo Real / Perfil de Audio y Video) y formato 0 (PCMU/8000).
  • a=rtpmap:0 PCMU/8000 - Atributo que asigna el formato (0) al códec (PCMU) y su frecuencia de reloj (8000 Hz).

Ejemplo de SIP REGISTER

El método REGISTER se utiliza en el Protocolo de Inicio de Sesión (SIP) para permitir que un agente de usuario (UA), como un teléfono VoIP o un softphone, registre su ubicación con un servidor de registro SIP. Este proceso permite que el servidor sepa dónde dirigir las solicitudes SIP entrantes destinadas al usuario registrado. El servidor de registro suele formar parte de un servidor proxy SIP o de un servidor de registro dedicado.

Aquí hay un ejemplo detallado de los mensajes SIP involucrados en un proceso de autenticación REGISTER:

REGISTER sip:example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
Max-Forwards: 70
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>
Call-ID: 1234567890@192.168.1.100
CSeq: 1 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Content-Length: 0

Este mensaje inicial REGISTER es enviado por el UA (Alice) al servidor registrador. Incluye información importante como la duración deseada de registro (Expires), el URI SIP del usuario (sip:alice@example.com), y la dirección de contacto del usuario (sip:alice@192.168.1.100:5060).

  1. Respuesta 401 Unauthorized del servidor registrador:
cssCopy codeSIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>;tag=7878744
Call-ID: 1234567890@192.168.1.100
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="example.com", nonce="abcdefghijk", algorithm=MD5, qop="auth"
Content-Length: 0

El servidor de registro responde con un mensaje "401 no autorizado", que incluye una cabecera "WWW-Authenticate". Esta cabecera contiene información necesaria para que el UA se autentique, como el reino de autenticación, nonce y algoritmo.

  1. Solicitud de REGISTRO con credenciales de autenticación:
REGISTER sip:example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
Max-Forwards: 70
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>
Call-ID: 1234567890@192.168.1.100
CSeq: 2 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Authorization: Digest username="alice", realm="example.com", nonce="abcdefghijk", uri="sip:example.com", response="65a8e2285879283831b664bd8b7f14d4", algorithm=MD5, cnonce="lmnopqrst", qop=auth, nc=00000001
Content-Length: 0

El UA envía otra solicitud REGISTER, esta vez incluyendo la cabecera "Authorization" con las credenciales necesarias, como el nombre de usuario, reino, nonce y un valor de respuesta calculado utilizando la información proporcionada y la contraseña del usuario.

Así es como se calcula la respuesta de autorización:

import hashlib

def calculate_sip_md5_response(username, password, realm, method, uri, nonce, nc, cnonce, qop):
    # 1. Calculate HA1 (concatenation of username, realm, and password)
    ha1_input = f"{username}:{realm}:{password}"
    ha1 = hashlib.md5(ha1_input.encode()).hexdigest()

    # 2. Calculate HA2 (concatenation of method and uri)
    ha2_input = f"{method}:{uri}"
    ha2 = hashlib.md5(ha2_input.encode()).hexdigest()

    # 3. Calculate the final response value (concatenation of h1, stuff and h2)
    response_input = f"{ha1}:{nonce}:{nc}:{cnonce}:{qop}:{ha2}"
    response = hashlib.md5(response_input.encode()).hexdigest()

    return response

# Example usage
username = "alice"
password = "mysecretpassword"
realm = "example.com"
method = "REGISTER"
uri = "sip:example.com"
nonce = "abcdefghijk"
nc = "00000001"
cnonce = "lmnopqrst"
qop = "auth"

response = calculate_sip_md5_response(username, password, realm, method, uri, nonce, nc, cnonce, qop)
print(f"MD5 response value: {response}")
  1. Respuesta de registro exitoso del servidor de registro:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>;tag=7878744
Call-ID: 1234567890@192.168.1.100
CSeq: 2 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Content-Length: 0

Después de que el servidor registrador verifica las credenciales proporcionadas, envía una respuesta "200 OK" para indicar que el registro fue exitoso. La respuesta incluye la información de contacto registrada y el tiempo de vencimiento para el registro. En este punto, el agente de usuario (Alice) está registrado con éxito en el servidor registrador SIP, y las solicitudes SIP entrantes para Alice pueden ser enrutadas a la dirección de contacto correspondiente.

Ejemplo de llamada

{% hint style="info" %} No se menciona, pero el Usuario B necesita haber enviado un mensaje REGISTER al Proxy 2 antes de poder recibir llamadas. {% endhint %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥