hacktricks/network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md
2023-06-06 18:56:34 +00:00

17 KiB

SIP (Protocolo de Iniciação de Sessão)

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

Informações Básicas

O SIP (Protocolo de Iniciação de Sessão) é um protocolo de sinalização e controle de chamadas amplamente utilizado para estabelecer, modificar e encerrar sessões multimídia, incluindo voz, vídeo e mensagens instantâneas, em redes IP. Desenvolvido pelo Internet Engineering Task Force (IETF), o SIP é definido no RFC 3261 e se tornou o padrão de fato para VoIP e comunicações unificadas.

Algumas características importantes do SIP incluem:

  1. Protocolo baseado em texto: o SIP é um protocolo baseado em texto, o que o torna legível para humanos e mais fácil de depurar. É baseado em um modelo de solicitação-resposta, semelhante ao HTTP, e usa métodos como INVITE, ACK, BYE e CANCEL para controlar as sessões de chamada.
  2. Escalabilidade e flexibilidade: o SIP é altamente escalável e pode ser usado em implantações de pequena escala, bem como em ambientes empresariais e de operadoras de grande porte. Ele pode ser facilmente estendido com novos recursos, tornando-o adaptável a vários casos de uso e requisitos.
  3. Interoperabilidade: a ampla adoção e padronização do SIP garantem melhor interoperabilidade entre diferentes dispositivos, aplicativos e provedores de serviços, promovendo comunicação perfeita em várias plataformas.
  4. Design modular: o SIP funciona com outros protocolos como RTP (Protocolo de Transporte em Tempo Real) para transmissão de mídia e SDP (Protocolo de Descrição de Sessão) para descrever sessões multimídia. Esse design modular permite maior flexibilidade e compatibilidade com diferentes tipos e codecs de mídia.
  5. Servidores de proxy e redirecionamento: o SIP pode usar servidores de proxy e redirecionamento para facilitar o roteamento de chamadas e fornecer recursos avançados como encaminhamento de chamadas, transferência de chamadas e serviços de correio de voz.
  6. Presença e mensagens instantâneas: o SIP não se limita à comunicação de voz e vídeo. Ele também suporta presença e mensagens instantâneas, permitindo uma ampla gama de aplicativos de comunicação unificada.

Apesar de suas muitas vantagens, o SIP pode ser complexo de configurar e gerenciar, especialmente ao lidar com problemas de travessia NAT e firewall. No entanto, sua versatilidade, escalabilidade e amplo suporte em toda a indústria o tornam uma escolha popular para comunicação de VoIP e multimídia.

Métodos SIP

Os métodos SIP principais definidos no RFC 3261 incluem:

  1. INVITE: usado para iniciar uma nova sessão (chamada) ou modificar uma existente. O método INVITE carrega a descrição da sessão (geralmente usando SDP) para informar o destinatário sobre os detalhes da sessão proposta, como tipos de mídia, codecs e protocolos de transporte.
  2. ACK: enviado para confirmar o recebimento de uma resposta final a uma solicitação INVITE. O método ACK garante a confiabilidade das transações INVITE fornecendo confirmação de ponta a ponta.
  3. BYE: usado para encerrar uma sessão estabelecida (chamada). O método BYE é enviado por qualquer uma das partes na sessão para indicar que desejam encerrar a comunicação.
  4. CANCEL: enviado para cancelar uma solicitação INVITE pendente antes que a sessão seja estabelecida. O método CANCEL permite que o remetente interrompa uma transação INVITE se mudar de ideia ou se não houver resposta do destinatário.
  5. OPTIONS: usado para consultar as capacidades de um servidor ou agente de usuário SIP. O método OPTIONS pode ser enviado para solicitar informações sobre métodos suportados, tipos de mídia ou outras extensões sem realmente estabelecer uma sessão.
  6. REGISTER: usado por um agente de usuário para registrar sua localização atual com um servidor de registro SIP. O método REGISTER ajuda a manter um mapeamento atualizado entre o URI SIP de um usuário e seu endereço IP atual, permitindo o roteamento e entrega de chamadas.

{% hint style="warning" %} Observe que para ligar para alguém não é necessário usar o REGISTER para nada.
No entanto, é possível que, para realizar um INVITE, o chamador precise se autenticar primeiro ou receberá uma resposta 401 Não autorizado. {% endhint %}

Além desses métodos principais, existem vários métodos de extensão SIP definidos em outros RFCs, como:

  1. SUBSCRIBE: definido no RFC 6665, o método SUBSCRIBE é usado para solicitar notificações sobre o estado de um recurso específico, como a presença ou o status da chamada de um usuário.
  2. NOTIFY: também definido no RFC 6665, o método NOTIFY é enviado por um servidor para informar um agente de usuário inscrito sobre alterações no estado de um recurso monitorado.
  3. REFER: definido no RFC 3515, o método REFER é usado para **solicitar que o destinat
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
Cada parâmetro explicado
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Esta linha indica o método (INVITE), o URI da solicitação (sip:jdoe@example.com) e a versão do SIP (SIP/2.0).
  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - O cabeçalho Via especifica o protocolo de transporte (UDP) e o endereço do cliente (pc33.example.com). O parâmetro "branch" é usado para detecção de loop e correspondência de transação.
  3. Max-Forwards: Max-Forwards: 70 - Este campo de cabeçalho limita o número de vezes que a solicitação pode ser encaminhada por proxies para evitar loops infinitos.
  4. To: To: John Doe <sip:jdoe@example.com> - O cabeçalho To especifica o destinatário da chamada, incluindo seu nome de exibição (John Doe) e URI do SIP (sip:jdoe@example.com).
  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - O cabeçalho From especifica o remetente da chamada, incluindo seu nome de exibição (Jane Smith) e URI do SIP (sip:jsmith@example.org). O parâmetro "tag" é usado para identificar exclusivamente o papel do remetente no diálogo.
  6. Call-ID: Call-ID: a84b4c76e66710 - O cabeçalho Call-ID identifica exclusivamente uma sessão de chamada entre dois agentes de usuário.
  7. CSeq: CSeq: 314159 INVITE - O cabeçalho CSeq contém um número de sequência e o método usado na solicitação. É usado para corresponder respostas a solicitações e detectar mensagens fora de ordem.
  8. Contact: Contact: <sip:jsmith@pc33.example.com> - O cabeçalho Contact fornece uma rota direta para o remetente, que pode ser usado para solicitações e respostas subsequentes.
  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - O cabeçalho User-Agent fornece informações sobre o software ou hardware do remetente, incluindo seu nome e versão.
  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - O cabeçalho Allow lista os métodos SIP suportados pelo remetente. Isso ajuda o destinatário a entender quais métodos podem ser usados durante a comunicação.
  11. Content-Type: Content-Type: application/sdp - O cabeçalho Content-Type especifica o tipo de mídia do corpo da mensagem, neste caso, SDP (Protocolo de Descrição de Sessão).
  12. Content-Length: Content-Length: 142 - O cabeçalho Content-Length indica o tamanho do corpo da mensagem em bytes.
  13. Corpo da mensagem: O corpo da mensagem contém a descrição da sessão SDP, que inclui informações sobre os tipos de mídia, codecs e protocolos de transporte para a sessão proposta.
  • v=0 - Versão do protocolo (0 para SDP)
  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Identificador de origem e sessão
  • s=- - Nome da sessão (um hífen único indica que não há nome de sessão)
  • c=IN IP4 pc33.example.com - Informações de conexão (tipo de rede, tipo de endereço e endereço)
  • t=0 0 - Informações de tempo (horários de início e término, 0 0 significa que a sessão não está limitada)
  • m=audio 49170 RTP/AVP 0 - Descrição da mídia (tipo de mídia, número da porta, protocolo de transporte e lista de formatos). Neste caso, especifica um fluxo de áudio usando RTP/AVP (Protocolo de Transporte em Tempo Real / Perfil de Vídeo) e formato 0 (PCMU/8000).
  • a=rtpmap:0 PCMU/8000 - Atributo que mapeia o formato (0) para o codec (PCMU) e sua taxa de clock (8000 Hz).

Exemplo de SIP REGISTER

O método REGISTER é usado no Protocolo de Iniciação de Sessão (SIP) para permitir que um agente de usuário (UA), como um telefone VoIP ou um softphone, registre sua localização com um servidor de registro SIP. Esse processo permite que o servidor saiba onde encaminhar as solicitações SIP recebidas destinadas ao usuário registrado. O servidor de registro geralmente faz parte de um servidor proxy SIP ou de um servidor de registro dedicado.

Aqui está um exemplo detalhado das mensagens SIP envolvidas em um processo de autenticação REGISTER:

  1. Solicitação REGISTER inicial do UA para o servidor de registro:
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

Esta mensagem REGISTER inicial é enviada pelo UA (Alice) para o servidor de registro. Ela inclui informações importantes, como a duração desejada do registro (Expires), o URI SIP do usuário (sip:alice@example.com) e o endereço de contato do usuário (sip:alice@192.168.1.100:5060).

  1. Resposta 401 Não Autorizado do servidor de registro:
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

O servidor de registro responde com uma mensagem "401 Não autorizado", que inclui um cabeçalho "WWW-Authenticate". Este cabeçalho contém informações necessárias para que o UA se autentique, como o reino de autenticação, nonce e algoritmo.

  1. Pedido de registro com credenciais de autenticação:
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

O UA envia outro pedido REGISTER, desta vez incluindo o cabeçalho "Authorization" com as credenciais necessárias, como o nome de usuário, realm, nonce e um valor de resposta calculado usando as informações fornecidas e a senha do usuário.

Assim é calculada a resposta de autorização:

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. Resposta de registro bem-sucedido do 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

Depois que o servidor de registro verifica as credenciais fornecidas, ele envia uma resposta "200 OK" para indicar que o registro foi bem-sucedido. A resposta inclui as informações de contato registradas e o tempo de expiração do registro. Neste ponto, o agente do usuário (Alice) está registrado com sucesso no servidor de registro SIP e as solicitações SIP de entrada para Alice podem ser roteadas para o endereço de contato apropriado.

Exemplo de Chamada

{% hint style="info" %} Não é mencionado, mas o Usuário B precisa ter enviado uma mensagem REGISTER para o Proxy 2 antes de poder receber chamadas. {% endhint %}

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