SIP (Session Initiation Protocol)

Support HackTricks

Osnovne informacije

SIP (Session Initiation Protocol) je protokol za signalizaciju i kontrolu poziva koji se široko koristi za uspostavljanje, modifikovanje i prekidanje multimedijalnih sesija, uključujući glas, video i instant poruke, preko IP mreža. Razvijen od strane Internet Engineering Task Force (IETF), SIP je definisan u RFC 3261 i postao je de facto standard za VoIP i objedinjene komunikacije.

Neke ključne karakteristike SIP-a uključuju:

  1. Protokol zasnovan na tekstu: SIP je protokol zasnovan na tekstu, što ga čini čitljivim za ljude i lakšim za debagovanje. Zasnovan je na modelu zahtev-odgovor, sličnom HTTP-u, i koristi metode kao što su INVITE, ACK, BYE i CANCEL za kontrolu pozivnih sesija.

  2. Skalabilnost i fleksibilnost: SIP je veoma skalabilan i može se koristiti u malim implementacijama, kao i u velikim preduzećima i carrier-grade okruženjima. Može se lako proširiti novim funkcijama, što ga čini prilagodljivim različitim slučajevima korišćenja i zahtevima.

  3. Interoperabilnost: Široka upotreba i standardizacija SIP-a osiguravaju bolju interoperabilnost između različitih uređaja, aplikacija i provajdera usluga, promovišući neometanu komunikaciju na različitim platformama.

  4. Modularni dizajn: SIP radi sa drugim protokolima kao što su RTP (Real-time Transport Protocol) za prenos medija i SDP (Session Description Protocol) za opisivanje multimedijalnih sesija. Ovaj modularni dizajn omogućava veću fleksibilnost i kompatibilnost sa različitim tipovima medija i kodeka.

  5. Proxy i redirekcioni serveri: SIP može koristiti proxy i redirekcione servere za olakšavanje usmeravanja poziva i pružanje naprednih funkcija kao što su preusmeravanje poziva, prenos poziva i usluge govorne pošte.

  6. Prisutnost i instant poruke: SIP nije ograničen samo na glasovne i video komunikacije. Takođe podržava prisutnost i instant poruke, omogućavajući širok spektar aplikacija za objedinjene komunikacije.

Uprkos mnogim prednostima, SIP može biti složen za konfiguraciju i upravljanje, posebno kada se radi o NAT prolazu i problemima sa firewall-om. Međutim, njegova svestranost, skalabilnost i opsežna podrška u industriji čine ga popularnim izborom za VoIP i multimedijalnu komunikaciju.

SIP metode

Osnovne SIP metode definisane u RFC 3261 uključuju:

  1. INVITE: Koristi se za iniciranje nove sesije (poziva) ili modifikovanje postojeće. INVITE metoda nosi opis sesije (obično koristeći SDP) kako bi obavestila primaoca o detaljima predložene sesije, kao što su tipovi medija, kodeci i transportni protokoli.

  2. ACK: Šalje se da potvrdi prijem konačnog odgovora na INVITE zahtev. ACK metoda osigurava pouzdanost INVITE transakcija pružanjem potvrde od kraja do kraja.

  3. BYE: Koristi se za prekidanje uspostavljene sesije (poziva). BYE metoda se šalje od strane bilo koje strane u sesiji kako bi naznačila da želi da završi komunikaciju.

  4. CANCEL: Šalje se da otkaže čekajući INVITE zahtev pre nego što sesija bude uspostavljena. CANCEL metoda omogućava pošiljaocu da abortira INVITE transakciju ako promeni mišljenje ili ako ne dobije odgovor od primaoca.

  5. OPTIONS: Koristi se za upit o mogućnostima SIP servera ili korisničkog agenta. OPTIONS metoda može se poslati da zatraži informacije o podržanim metodama, tipovima medija ili drugim ekstenzijama bez zapravo uspostavljanja sesije.

  6. REGISTER: Koristi ga korisnički agent da registruje svoju trenutnu lokaciju sa SIP registrar serverom. REGISTER metoda pomaže u održavanju ažurirane mape između SIP URI korisnika i njihove trenutne IP adrese, omogućavajući usmeravanje i isporuku poziva.

Napomena da za pozivanje nekoga nije neophodno koristiti REGISTER za bilo šta. Međutim, moguće je da da bi se izvršio INVITE, pozivalac mora prvo da se autentifikuje ili će dobiti 401 Unauthorized odgovor.

Pored ovih osnovnih metoda, postoje brojne SIP ekstenzijske metode definisane u drugim RFC-ima, kao što su:

  1. SUBSCRIBE: Definisan u RFC 6665, SUBSCRIBE metoda se koristi za zahtev za obaveštenjima o stanju određenog resursa, kao što su prisutnost korisnika ili status poziva.

  2. NOTIFY: Takođe definisan u RFC 6665, NOTIFY metoda se šalje od strane servera da obavesti pretplaćenog korisničkog agenta o promenama u stanju nadgledanog resursa.

  3. REFER: Definisan u RFC 3515, REFER metoda se koristi za zahtev da primalac izvrši prenos ili se obrati trećoj strani. Ovo se obično koristi za scenarije prenosa poziva.

  4. MESSAGE: Definisan u RFC 3428, MESSAGE metoda se koristi za slanje instant poruka između SIP korisničkih agenata, omogućavajući komunikaciju zasnovanu na tekstu unutar SIP okvira.

  5. UPDATE: Definisan u RFC 3311, UPDATE metoda omogućava modifikovanje sesije bez uticaja na stanje postojećeg dijaloga. Ovo je korisno za ažuriranje parametara sesije, kao što su kodeci ili tipovi medija, tokom aktivnog poziva.

  6. PUBLISH: Definisan u RFC 3903, PUBLISH metoda se koristi od strane korisničkog agenta da objavi informacije o stanju događaja na server, čineći ih dostupnim drugim zainteresovanim stranama.

SIP kodovi odgovora

  • 1xx (Provisional Responses): Ovi odgovori ukazuju da je zahtev primljen i da server nastavlja da ga obrađuje.

  • 100 Trying: Zahtev je primljen i server na njemu radi.

  • 180 Ringing: Pozvani se obaveštava i preuzeće poziv.

  • 183 Session Progress: Pruža informacije o napretku poziva.

  • 2xx (Successful Responses): Ovi odgovori ukazuju da je zahtev uspešno primljen, shvaćen i prihvaćen.

  • 200 OK: Zahtev je bio uspešan i server ga je ispunio.

  • 202 Accepted: Zahtev je prihvaćen za obradu, ali još nije završen.

  • 3xx (Redirection Responses): Ovi odgovori ukazuju da je potrebna dalja akcija da bi se ispunio zahtev, obično kontaktiranjem alternativnog resursa.

  • 300 Multiple Choices: Postoji više dostupnih opcija, a korisnik ili klijent mora izabrati jednu.

  • 301 Moved Permanently: Zatraženi resurs je dodeljen novoj trajnoj URI.

  • 302 Moved Temporarily: Zatraženi resurs je privremeno dostupan na drugoj URI.

  • 305 Use Proxy: Zahtev mora biti poslat na određeni proxy.

  • 4xx (Client Error Responses): Ovi odgovori ukazuju da zahtev sadrži lošu sintaksu ili ga server ne može ispuniti.

  • 400 Bad Request: Zahtev je bio loše oblikovan ili nevažeći.

  • 401 Unauthorized: Zahtev zahteva autentifikaciju korisnika.

  • 403 Forbidden: Server je razumeo zahtev, ali odbija da ga ispuni.

  • 404 Not Found: Zatraženi resurs nije pronađen na serveru.

  • 408 Request Timeout: Server nije primio kompletan zahtev u okviru vremena koje je bio spreman da čeka.

  • 486 Busy Here: Pozvani je trenutno zauzet i ne može da preuzme poziv.

  • 5xx (Server Error Responses): Ovi odgovori ukazuju da je server nije uspeo da ispuni važeći zahtev.

  • 500 Internal Server Error: Server je naišao na grešku prilikom obrade zahteva.

  • 501 Not Implemented: Server ne podržava funkcionalnost potrebnu za ispunjenje zahteva.

  • 503 Service Unavailable: Server trenutno nije u mogućnosti da obradi zahtev zbog održavanja ili preopterećenja.

  • 6xx (Global Failure Responses): Ovi odgovori ukazuju da zahtev ne može biti ispunjen od strane bilo kog servera.

  • 600 Busy Everywhere: Sva moguća odredišta za poziv su zauzeta.

  • 603 Decline: Pozvani ne želi da učestvuje u pozivu.

  • 604 Does Not Exist Anywhere: Zatraženi resurs nije dostupan nigde u mreži.

Primeri

SIP INVITE Primer

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
Svaki Param Objašnjen
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Ova linija označava metodu (INVITE), URI zahteva (sip:jdoe@example.com), i SIP verziju (SIP/2.0).

  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - Via zaglavlje specificira transportni protokol (UDP) i adresu klijenta (pc33.example.com). Parametar "branch" se koristi za detekciju petlji i usklađivanje transakcija.

  3. Max-Forwards: Max-Forwards: 70 - Ovo zaglavlje ograničava broj puta na koji se zahtev može proslediti od strane proxy servera kako bi se izbegle beskonačne petlje.

  4. To: To: John Doe <sip:jdoe@example.com> - To zaglavlje specificira primaoca poziva, uključujući njegovo ime (John Doe) i SIP URI (sip:jdoe@example.com).

  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - From zaglavlje specificira pošiljaoca poziva, uključujući njegovo ime (Jane Smith) i SIP URI (sip:jsmith@example.org). Parametar "tag" se koristi za jedinstveno identifikovanje uloge pošiljaoca u dijalogu.

  6. Call-ID: Call-ID: a84b4c76e66710 - Call-ID zaglavlje jedinstveno identifikuje sesiju poziva između dva korisnička agenta.

  7. CSeq: CSeq: 314159 INVITE - CSeq zaglavlje sadrži broj sekvence i metodu korišćenu u zahtevu. Koristi se za usklađivanje odgovora sa zahtevima i detekciju poruka koje su van reda.

  8. Contact: Contact: <sip:jsmith@pc33.example.com> - Contact zaglavlje pruža direktan put do pošiljaoca, koji se može koristiti za naredne zahteve i odgovore.

  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - User-Agent zaglavlje pruža informacije o softveru ili hardveru pošiljaoca, uključujući njegovo ime i verziju.

  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - Allow zaglavlje navodi SIP metode koje podržava pošiljalac. Ovo pomaže primaocu da razume koje metode se mogu koristiti tokom komunikacije.

  11. Content-Type: Content-Type: application/sdp - Content-Type zaglavlje specificira medijski tip tela poruke, u ovom slučaju, SDP (Session Description Protocol).

  12. Content-Length: Content-Length: 142 - Content-Length zaglavlje označava veličinu tela poruke u bajtovima.

  13. Message Body: Telo poruke sadrži SDP opis sesije, koji uključuje informacije o medijskim tipovima, kodecima i transportnim protokolima za predloženu sesiju.

  • v=0 - Verzija protokola (0 za SDP)

  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Inicijator i identifikator sesije

  • s=- - Ime sesije (jedan crtica označava da nema imena sesije)

  • c=IN IP4 pc33.example.com - Informacije o vezi (tip mreže, tip adrese i adresa)

  • t=0 0 - Informacije o vremenu (vreme početka i završetka, 0 0 znači da sesija nije ograničena)

  • m=audio 49170 RTP/AVP 0 - Opis medija (tip medija, broj porta, transportni protokol i lista formata). U ovom slučaju, specificira audio stream koristeći RTP/AVP (Real-time Transport Protocol / Audio Video Profile) i format 0 (PCMU/8000).

  • a=rtpmap:0 PCMU/8000 - Atribut koji mapira format (0) na kodek (PCMU) i njegovu frekvenciju (8000 Hz).

SIP REGISTER Primer

Metoda REGISTER se koristi u Protokolu za inicijaciju sesije (SIP) kako bi omogućila korisničkom agentu (UA), kao što je VoIP telefon ili softverski telefon, da registruje svoju lokaciju kod SIP registrar servera. Ovaj proces omogućava serveru da zna kuda da usmeri dolazne SIP zahteve namenjene registrovanom korisniku. Registrar server je obično deo SIP proxy servera ili posvećenog servera za registraciju.

Evo detaljnog primera SIP poruka uključenih u proces autentifikacije REGISTER:

  1. Početni REGISTER zahtev od UA do registrar servera:

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

Ova inicijalna REGISTER poruka se šalje od strane UA (Alice) registracionom serveru. Uključuje važne informacije kao što su željeno trajanje registracije (Expires), SIP URI korisnika (sip:alice@example.com), i kontakt adresu korisnika (sip:alice@192.168.1.100:5060).

  1. 401 Unauthorized odgovor od registracionog servera:

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

Registrar server odgovara sa "401 Unauthorized" porukom, koja uključuje "WWW-Authenticate" header. Ovaj header sadrži informacije potrebne za UA da se autentifikuje, kao što su authentication realm, nonce, i algorithm.

  1. REGISTER zahtev sa autentifikacionim kredencijalima:

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

UA šalje još jedan REGISTER zahtev, ovaj put uključujući "Authorization" zaglavlje sa potrebnim akreditivima, kao što su korisničko ime, realm, nonce i vrednost odgovora izračunatu koristeći date informacije i korisničku lozinku.

Ovako se izračunava Authorization odgovor:

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. Uspešna registracija odgovor sa registrar servera:

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

Nakon što registrar server verifikuje pružene akreditive, šalje "200 OK" odgovor kako bi naznačio da je registracija bila uspešna. Odgovor uključuje registrovane kontakt informacije i vreme isteka registracije. U ovom trenutku, korisnički agent (Alice) je uspešno registrovan sa SIP registrar serverom, a dolazni SIP zahtevi za Alice mogu biti usmereni na odgovarajuću kontakt adresu.

Primer poziva

Nije pomenuto, ali Korisnik B treba da je poslao REGISTER poruku Proxy 2 pre nego što može da prima pozive.

Support HackTricks

Last updated