hacktricks/network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md

217 lines
17 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
## SIP (Protocolo de Iniciação de Sessão)
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>
2023-06-06 18:56:34 +00:00
## Informações Básicas
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
Algumas características importantes do SIP incluem:
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
### Métodos SIP
2023-06-06 18:56:34 +00:00
Os métodos SIP principais definidos no **RFC 3261** incluem:
2023-06-06 18:56:34 +00:00
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" %}
2023-06-06 18:56:34 +00:00
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 %}
2023-06-06 18:56:34 +00:00
Além desses métodos principais, existem **vários métodos de extensão SIP** definidos em outros RFCs, como:
2023-06-06 18:56:34 +00:00
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
```
<details>
2023-06-06 18:56:34 +00:00
<summary>Cada parâmetro explicado</summary>
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](mailto: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](mailto: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](mailto: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).
</details>
2023-06-06 18:56:34 +00:00
### Exemplo de SIP REGISTER
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
Aqui está um exemplo detalhado das mensagens SIP envolvidas em um processo de autenticação REGISTER:
2023-06-06 18:56:34 +00:00
1. Solicitação **REGISTER** inicial do UA para o servidor de registro:
```yaml
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
```
2023-06-06 18:56:34 +00:00
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](mailto:alice@example.com)) e o endereço de contato do usuário (sip:alice@192.168.1.100:5060).
2023-06-06 18:56:34 +00:00
2. Resposta **401 Não Autorizado** do servidor de registro:
```css
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
```
2023-06-06 18:56:34 +00:00
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**.
2023-06-06 18:56:34 +00:00
3. Pedido de registro **com credenciais de autenticação**:
```vbnet
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
```
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
Assim é calculada a resposta de autorização:
```python
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}")
```
2023-06-06 18:56:34 +00:00
4. Resposta de **registro bem-sucedido** do servidor de registro:
```yaml
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
```
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
### Exemplo de Chamada
<figure><img src="../../../.gitbook/assets/image (666).png" alt=""><figcaption></figcaption></figure>
{% hint style="info" %}
2023-06-06 18:56:34 +00:00
Não é mencionado, mas o Usuário B precisa ter enviado uma mensagem **REGISTER para o Proxy 2** antes de poder receber chamadas.
{% endhint %}
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>