SIP (Session Initiation Protocol)

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support 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 nella RFC 3261 ed è diventato lo standard de facto per VoIP e comunicazioni unificate.

Al alcune caratteristiche chiave di SIP includono:

  1. Protocollo basato su testo: SIP è un protocollo basato su testo, il che lo rende leggibile dall'uomo e più facile da debug. 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 piccole dimensioni così come in ambienti aziendali e di carrier di grandi dimensioni. Può essere facilmente esteso con nuove funzionalità, rendendolo adattabile a vari casi d'uso e requisiti.

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

  4. Design modulare: SIP funziona con altri protocolli come RTP (Real-time Transport Protocol) per la trasmissione dei media e SDP (Session Description Protocol) per descrivere le 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 inoltro di chiamata, trasferimento di chiamata e 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 molti vantaggi, SIP può essere complesso da configurare e gestire, in particolare quando si tratta di problemi di attraversamento NAT e firewall. Tuttavia, la sua versatilità, scalabilità e ampio supporto nel settore lo rendono una scelta popolare per VoIP e comunicazione multimediale.

Metodi SIP

I metodi SIP fondamentali definiti nella RFC 3261 includono:

  1. INVITE: Utilizzato per iniziare 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: Utilizzato per terminare una sessione stabilita (chiamata). Il metodo BYE è inviato da una delle parti nella sessione per indicare che desidera terminare la comunicazione.

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

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

  6. REGISTER: Utilizzato da un agente utente per registrare la propria posizione attuale con un server registratore SIP. Il metodo REGISTER aiuta a mantenere una mappatura aggiornata tra l'URI SIP di un utente e il suo indirizzo IP attuale, abilitando il routing e la consegna delle chiamate.

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

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

  1. SUBSCRIBE: Definito nella 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: Anch'esso definito nella RFC 6665, il metodo NOTIFY è inviato da un server per informare un agente utente iscritto sui cambiamenti nello stato di una risorsa monitorata.

  3. REFER: Definito nella RFC 3515, il metodo REFER è utilizzato per richiedere che il destinatario esegua un trasferimento o si riferisca a una terza parte. Questo è tipicamente utilizzato per scenari di trasferimento di chiamata.

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

  5. UPDATE: Definito nella 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 nella RFC 3903, il metodo PUBLISH è utilizzato da un agente utente per pubblicare informazioni sullo stato degli eventi a un server, rendendole disponibili 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 è in fase di avviso 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 soddisfatta con successo e il server l'ha adempiuta.

  • 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: Sono disponibili più opzioni 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 a un URI diverso.

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

  • 4xx (Risposte di errore del client): 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 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 che 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 errore globale): Queste risposte indicano che la richiesta non può essere soddisfatta da alcun server.

  • 600 Busy Everywhere: Tutte le possibili destinazioni 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 luogo nella rete.

Esempi

Esempio 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 la rilevazione dei loop e il matching delle transazioni.

  3. Max-Forwards: Max-Forwards: 70 - Questo campo di 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 loro 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 loro nome visualizzato (Jane Smith) e l'URI SIP (sip:jsmith@example.org). Il parametro "tag" è utilizzato per identificare univocamente il ruolo del mittente nel dialogo.

  6. Call-ID: Call-ID: a84b4c76e66710 - L'intestazione Call-ID identifica univocamente 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. È utilizzato per abbinare le risposte alle richieste e rilevare messaggi fuori ordine.

  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 nome e 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. Message Body: 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 singolo trattino 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 temporali (tempi di inizio e fine, 0 0 significa che la sessione non è limitata)

  • m=audio 49170 RTP/AVP 0 - Descrizione del media (tipo di media, numero di porta, protocollo di trasporto e lista 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 alla sua frequenza di campionamento (8000 Hz).

Esempio di SIP REGISTER

Il metodo REGISTER è utilizzato nel Session Initiation Protocol (SIP) per consentire a un agente utente (UA), come un telefono VoIP o un softphone, di registrare la propria posizione con un server registrar SIP. Questo processo informa il server dove instradare le richieste SIP in arrivo destinate all'utente registrato. Il server registrar è solitamente 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 REGISTER:

  1. Richiesta iniziale REGISTER dall'UA al server registrar:

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 iniziale REGISTER viene inviato dall'UA (Alice) al server registrar. Include informazioni importanti come la durata di registrazione desiderata (Expires), l'URI SIP dell'utente (sip:alice@example.com) e l'indirizzo di contatto dell'utente (sip:alice@192.168.1.100:5060).

  1. 401 Non autorizzato risposta dal server 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 registrar risponde con un messaggio "401 Unauthorized", che include un'intestazione "WWW-Authenticate". Questa intestazione contiene informazioni necessarie affinché l'UA si autentichi, come il realm di autenticazione, nonce e algoritmo.

  1. Richiesta REGISTER 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'altra richiesta REGISTER, questa volta includendo l'intestazione "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.

Questo è il modo in cui 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 riuscita dal server 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 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 per la registrazione. A questo punto, l'agente utente (Alice) è registrato con successo presso il server 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.

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

Last updated