SIP (Session Initiation Protocol)

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Informazioni di Base

SIP (Session Initiation Protocol) è un protocollo di segnalazione e controllo delle chiamate ampiamente utilizzato per stabilire, modificare e terminare sessioni multimediali, inclusi voce, video e messaggistica istantanea, su reti IP. Sviluppato dall'Internet Engineering Task Force (IETF), SIP è definito in RFC 3261 ed è diventato lo standard de facto per VoIP e comunicazioni unificate.

Alcune caratteristiche chiave di SIP includono:

  1. Protocollo basato su testo: SIP è un protocollo basato su testo, il che lo rende leggibile dall'essere umano e più facile da debuggare. Si basa su un modello di richiesta-risposta, simile a HTTP, e utilizza metodi come INVITE, ACK, BYE e CANCEL per controllare le sessioni di chiamata.

  2. Scalabilità e Flessibilità: SIP è altamente scalabile e può essere utilizzato in implementazioni di piccola scala così come in ambienti aziendali di grandi dimensioni e carrier-grade. Può essere facilmente esteso con nuove funzionalità, rendendolo adattabile a vari casi d'uso e requisiti.

  3. Interoperabilità: L'ampia adozione e standardizzazione di SIP garantiscono una migliore interoperabilità tra dispositivi, applicazioni e fornitori di servizi diversi, promuovendo una comunicazione senza soluzione di continuità su varie piattaforme.

  4. Design Modulare: SIP funziona con altri protocolli come RTP (Real-time Transport Protocol) per la trasmissione multimediale e SDP (Session Description Protocol) per descrivere sessioni multimediali. Questo design modulare consente una maggiore flessibilità e compatibilità con diversi tipi di media e codec.

  5. Server Proxy e di Reindirizzamento: SIP può utilizzare server proxy e di reindirizzamento per facilitare il routing delle chiamate e fornire funzionalità avanzate come il trasferimento di chiamata, il trasferimento di chiamata e i servizi di segreteria telefonica.

  6. Presenza e Messaggistica Istantanea: SIP non è limitato alla comunicazione vocale e video. Supporta anche la presenza e la messaggistica istantanea, consentendo una vasta gamma di applicazioni di comunicazione unificata.

Nonostante i suoi numerosi vantaggi, SIP può essere complesso da configurare e gestire, specialmente quando si tratta di attraversare NAT e problemi di firewall. Tuttavia, la sua versatilità, scalabilità e il supporto esteso nell'industria lo rendono una scelta popolare per VoIP e comunicazioni multimediali.

Metodi SIP

I metodi SIP principali definiti in RFC 3261 includono:

  1. INVITE: Usato per inizializzare una nuova sessione (chiamata) o modificare una esistente. Il metodo INVITE trasporta la descrizione della sessione (tipicamente utilizzando SDP) per informare il destinatario sui dettagli della sessione proposta, come tipi di media, codec e protocolli di trasporto.

  2. ACK: Inviato per confermare la ricezione di una risposta finale a una richiesta INVITE. Il metodo ACK garantisce l'affidabilità delle transazioni INVITE fornendo un riconoscimento end-to-end.

  3. BYE: Usato per terminare una sessione stabilita (chiamata). Il metodo BYE è inviato da una delle parti nella sessione per indicare che desiderano terminare la comunicazione.

  4. CANCEL: Inviato per annullare una richiesta INVITE in sospeso prima che la sessione sia stabilita. Il metodo CANCEL consente al mittente di annullare una transazione INVITE se cambia idea o se non riceve risposta dal destinatario.

  5. OPTIONS: Usato per interrogare le capacità di un server SIP o di un agente utente. Il metodo OPTIONS può essere inviato per richiedere informazioni su metodi supportati, tipi di media o altre estensioni senza effettivamente stabilire una sessione.

  6. REGISTER: Usato da un agente utente per registrare la sua posizione attuale con un server di registrazione SIP. Il metodo REGISTER aiuta a mantenere un mapping aggiornato tra l'URI SIP di un utente e il suo indirizzo IP attuale, consentendo il routing e la consegna delle chiamate.

Nota che per chiamare qualcuno non è necessario utilizzare il REGISTER per nulla. Tuttavia, è possibile che per effettuare un INVITE il chiamante debba autenticarsi prima o riceverà una risposta 401 Unauthorized.

Oltre a questi metodi principali, ci sono diversi metodi di estensione SIP definiti in altri RFC, come:

  1. SUBSCRIBE: Definito in RFC 6665, il metodo SUBSCRIBE è utilizzato per richiedere notifiche sullo stato di una risorsa specifica, come la presenza di un utente o lo stato della chiamata.

  2. NOTIFY: Anche definito in RFC 6665, il metodo NOTIFY è inviato da un server per informare un agente utente sottoscritto su modifiche dello stato di una risorsa monitorata.

  3. REFER: Definito in RFC 3515, il metodo REFER è utilizzato per richiedere che il destinatario esegua un trasferimento o faccia riferimento a un terzo. Questo viene tipicamente utilizzato per scenari di trasferimento di chiamata.

  4. MESSAGE: Definito in RFC 3428, il metodo MESSAGE è utilizzato per inviare messaggi istantanei tra agenti utente SIP, consentendo la comunicazione basata su testo all'interno del framework SIP.

  5. UPDATE: Definito in RFC 3311, il metodo UPDATE consente di modificare una sessione senza influenzare lo stato del dialogo esistente. Questo è utile per aggiornare i parametri della sessione, come codec o tipi di media, durante una chiamata in corso.

  6. PUBLISH: Definito in RFC 3903, il metodo PUBLISH è utilizzato da un agente utente per pubblicare informazioni sullo stato dell'evento su un server, rendendolo disponibile ad altre parti interessate.

Codici di Risposta SIP

  • 1xx (Risposte Provvisorie): Queste risposte indicano che la richiesta è stata ricevuta e il server sta continuando a elaborarla.

  • 100 Trying: La richiesta è stata ricevuta, e il server sta lavorando su di essa.

  • 180 Ringing: Il chiamato sta venendo avvisato e risponderà alla chiamata.

  • 183 Session Progress: Fornisce informazioni sul progresso della chiamata.

  • 2xx (Risposte di Successo): Queste risposte indicano che la richiesta è stata ricevuta, compresa e accettata con successo.

  • 200 OK: La richiesta è stata completata con successo, e il server l'ha soddisfatta.

  • 202 Accepted: La richiesta è stata accettata per l'elaborazione, ma non è ancora stata completata.

  • 3xx (Risposte di Reindirizzamento): Queste risposte indicano che è necessaria un'ulteriore azione per soddisfare la richiesta, tipicamente contattando una risorsa alternativa.

  • 300 Multiple Choices: Ci sono più opzioni disponibili, e l'utente o il client deve sceglierne una.

  • 301 Moved Permanently: La risorsa richiesta è stata assegnata a un nuovo URI permanente.

  • 302 Moved Temporarily: La risorsa richiesta è temporaneamente disponibile presso un URI diverso.

  • 305 Use Proxy: La richiesta deve essere inviata a un proxy specificato.

  • 4xx (Risposte di Errore del Cliente): Queste risposte indicano che la richiesta contiene una sintassi errata o non può essere soddisfatta dal server.

  • 400 Bad Request: La richiesta era malformata o non valida.

  • 401 Unauthorized: La richiesta richiede l'autenticazione dell'utente.

  • 403 Forbidden: Il server ha compreso la richiesta ma si rifiuta di soddisfarla.

  • 404 Not Found: La risorsa richiesta non è stata trovata sul server.

  • 408 Request Timeout: Il server non ha ricevuto una richiesta completa entro il tempo in cui era disposto ad attendere.

  • 486 Busy Here: Il chiamato è attualmente occupato e non può rispondere alla chiamata.

  • 5xx (Risposte di Errore del Server): Queste risposte indicano che il server non è riuscito a soddisfare una richiesta valida.

  • 500 Internal Server Error: Il server ha riscontrato un errore durante l'elaborazione della richiesta.

  • 501 Not Implemented: Il server non supporta la funzionalità richiesta per soddisfare la richiesta.

  • 503 Service Unavailable: Il server non è attualmente in grado di gestire la richiesta a causa di manutenzione o sovraccarico.

  • 6xx (Risposte di Fallimento Globale): Queste risposte indicano che la richiesta non può essere soddisfatta da nessun server.

  • 600 Busy Everywhere: Tutte le destinazioni possibili per la chiamata sono occupate.

  • 603 Decline: Il chiamato non desidera partecipare alla chiamata.

  • 604 Does Not Exist Anywhere: La risorsa richiesta non è disponibile in nessun punto della rete.

Esempi

Esempio di SIP INVITE

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
Ogni parametro spiegato
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Questa riga indica il metodo (INVITE), l'URI della richiesta (sip:jdoe@example.com), e la versione SIP (SIP/2.0).

  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - L'intestazione Via specifica il protocollo di trasporto (UDP) e l'indirizzo del client (pc33.example.com). Il parametro "branch" è utilizzato per il rilevamento di loop e il matching delle transazioni.

  3. Max-Forwards: Max-Forwards: 70 - Questo campo dell'intestazione limita il numero di volte in cui la richiesta può essere inoltrata dai proxy per evitare loop infiniti.

  4. To: To: John Doe <sip:jdoe@example.com> - L'intestazione To specifica il destinatario della chiamata, inclusi il suo nome visualizzato (John Doe) e l'URI SIP (sip:jdoe@example.com).

  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - L'intestazione From specifica il mittente della chiamata, inclusi il suo nome visualizzato (Jane Smith) e l'URI SIP (sip:jsmith@example.org). Il parametro "tag" è utilizzato per identificare in modo univoco il ruolo del mittente nel dialogo.

  6. Call-ID: Call-ID: a84b4c76e66710 - L'intestazione Call-ID identifica in modo univoco una sessione di chiamata tra due agenti utente.

  7. CSeq: CSeq: 314159 INVITE - L'intestazione CSeq contiene un numero di sequenza e il metodo utilizzato nella richiesta. Viene utilizzato per abbinare le risposte alle richieste e rilevare messaggi fuori sequenza.

  8. Contact: Contact: <sip:jsmith@pc33.example.com> - L'intestazione Contact fornisce un percorso diretto al mittente, che può essere utilizzato per richieste e risposte successive.

  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - L'intestazione User-Agent fornisce informazioni sul software o hardware del mittente, inclusi il nome e la versione.

  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - L'intestazione Allow elenca i metodi SIP supportati dal mittente. Questo aiuta il destinatario a capire quali metodi possono essere utilizzati durante la comunicazione.

  11. Content-Type: Content-Type: application/sdp - L'intestazione Content-Type specifica il tipo di media del corpo del messaggio, in questo caso, SDP (Session Description Protocol).

  12. Content-Length: Content-Length: 142 - L'intestazione Content-Length indica la dimensione del corpo del messaggio in byte.

  13. Corpo del messaggio: Il corpo del messaggio contiene la descrizione della sessione SDP, che include informazioni sui tipi di media, codec e protocolli di trasporto per la sessione proposta.

  • v=0 - Versione del protocollo (0 per SDP)

  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Origine e identificatore della sessione

  • s=- - Nome della sessione (un trattino singolo indica nessun nome di sessione)

  • c=IN IP4 pc33.example.com - Informazioni di connessione (tipo di rete, tipo di indirizzo e indirizzo)

  • t=0 0 - Informazioni sul timing (tempi di inizio e fine, 0 0 significa che la sessione non è limitata)

  • m=audio 49170 RTP/AVP 0 - Descrizione dei media (tipo di media, numero di porta, protocollo di trasporto e elenco dei formati). In questo caso, specifica uno stream audio utilizzando RTP/AVP (Real-time Transport Protocol / Audio Video Profile) e formato 0 (PCMU/8000).

  • a=rtpmap:0 PCMU/8000 - Attributo che mappa il formato (0) al codec (PCMU) e al suo clock rate (8000 Hz).

Esempio di REGISTRAZIONE SIP

Il metodo REGISTER viene utilizzato nel Protocollo di Iniziazione della Sessione (SIP) per consentire a un agente utente (UA), come un telefono VoIP o un softphone, di registrare la propria posizione presso un server di registrazione SIP. Questo processo consente al server di sapere dove instradare le richieste SIP in arrivo destinate all'utente registrato. Il server di registrazione fa generalmente parte di un server proxy SIP o di un server di registrazione dedicato.

Ecco un esempio dettagliato dei messaggi SIP coinvolti in un processo di autenticazione REGISTRAZIONE:

  1. Richiesta REGISTER iniziale da UA al server di registrazione:

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

Questo messaggio di REGISTRAZIONE iniziale viene inviato dall'UA (Alice) al server del registrar. Include informazioni importanti come la durata di registrazione desiderata (Scade), l'SIP URI dell'utente (sip:alice@example.com), e l'indirizzo di contatto dell'utente (sip:alice@192.168.1.100:5060).

  1. Risposta 401 Non autorizzato dal server del registrar:

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

Il server del registrar risponde con un messaggio "401 Unauthorized", che include un'intestazione "WWW-Authenticate". Questa intestazione contiene le informazioni necessarie affinché l'UA possa autenticarsi, come il dominio di autenticazione, nonce e algoritmo.

  1. Richiesta di REGISTRAZIONE con credenziali di autenticazione:

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

L'UA invia un altro richiesta REGISTER, questa volta includendo l'header "Authorization" con le credenziali necessarie, come il nome utente, il dominio, il nonce e un valore di risposta calcolato utilizzando le informazioni fornite e la password dell'utente.

Ecco come viene calcolata la risposta di autorizzazione:

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. Risposta di registrazione avvenuta con successo dal server del registrar:

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

Dopo che il server del registrar verifica le credenziali fornite, invia una risposta "200 OK" per indicare che la registrazione è avvenuta con successo. La risposta include le informazioni di contatto registrate e il tempo di scadenza della registrazione. A questo punto, l'agente utente (Alice) è registrato con successo presso il server del registrar SIP e le richieste SIP in arrivo per Alice possono essere instradate all'indirizzo di contatto appropriato.

Esempio di Chiamata

Non è menzionato, ma l'Utente B deve aver inviato un messaggio REGISTER a Proxy 2 prima di poter ricevere chiamate.

Last updated