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

17 KiB

SIP (Session Initiation Protocol)

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

SIP (Session Initiation Protocol) je signalizacioni i kontrolni protokol poziva široko korišćen za uspostavljanje, modifikaciju i prekidanje multimedijalnih sesija, uključujući glas, video i trenutne 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 ujedinjene komunikacije.

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

  1. Tekstualni protokol: SIP je tekstualni protokol, što ga čini čitljivim za ljude i lakšim za otklanjanje grešaka. Baziran je na modelu zahteva-odgovora, sličnom HTTP-u, i koristi metode poput INVITE, ACK, BYE i CANCEL za kontrolu poziva.
  2. Povećana skalabilnost i fleksibilnost: SIP je visoko skalabilan i može se koristiti u malim implementacijama kao i u velikim preduzećima i nosačkim okruženjima. Može se lako proširiti novim funkcijama, što ga čini prilagodljivim različitim slučajevima upotrebe i zahtevima.
  3. Interoperabilnost: Široka upotreba i standardizacija SIP-a osiguravaju bolju interoperabilnost između različitih uređaja, aplikacija i pružalaca usluga, promovišući besprekornu komunikaciju na različitim platformama.
  4. Modularni dizajn: SIP radi sa drugim protokolima poput 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 Redirect serveri: SIP može koristiti proxy i redirect servere za olakšavanje rutiranja poziva i pružanje naprednih funkcija poput preusmeravanja poziva, transfera poziva i usluga glasovne pošte.
  6. Prisustvo i trenutne poruke: SIP nije ograničen samo na glasovnu i video komunikaciju. Takođe podržava prisustvo i trenutne poruke, omogućavajući širok spektar aplikacija za ujedinjenu komunikaciju.

I pored mnogih prednosti, SIP može biti kompleksan za konfigurisanje i upravljanje, posebno kada se suočavate sa problemima prolaska kroz NAT i sa firewall-om. Međutim, njegova svestranost, skalabilnost i obimna 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 modifikaciju postojeće. Metoda INVITE nosi opis sesije (obično koristeći SDP) kako bi obavestila primaoca o detaljima predložene sesije, poput tipova medija, kodeka i transportnih protokola.
  2. ACK: Poslat da potvrdi prijem konačnog odgovora na zahtev INVITE. Metoda ACK osigurava pouzdanost INVITE transakcija pružanjem potvrde o kraju do kraja.
  3. BYE: Koristi se za prekidanje uspostavljene sesije (poziva). Metoda BYE se šalje od strane bilo koje strane u sesiji kako bi naznačila da žele da završe komunikaciju.
  4. CANCEL: Poslat da otkaže čekajući INVITE zahtev pre nego što sesija bude uspostavljena. Metoda CANCEL omogućava pošiljaocu da prekine INVITE transakciju ako promeni mišljenje ili ako nema odgovora od primaoca.
  5. OPTIONS: Koristi se za upit o sposobnostima SIP servera ili korisničkog agenta. Metoda OPTIONS može biti poslata da zatraži informacije o podržanim metodama, tipovima medija ili drugim proširenjima bez stvarnog uspostavljanja sesije.
  6. REGISTER: Koristi ga korisnički agent da registruje svoju trenutnu lokaciju sa SIP registrar serverom. Metoda REGISTER pomaže u održavanju ažuriranog mapiranja između korisnikovog SIP URI-ja i njegove trenutne IP adrese, omogućavajući rutiranje i dostavu poziva.

{% hint style="warning" %} Imajte na umu da za pozivanje nekoga nije neophodno koristiti REGISTER za bilo šta.
Međutim, moguće je da kako bi izvršio INVITE pozivač mora autentifikovati prvo ili će primiti 401 Unauthorized odgovor. {% endhint %}

Pored ovih osnovnih metoda, postoje nekoliko SIP ekstenzija metoda definisanih u drugim RFC-ovima, kao što su:

  1. SUBSCRIBE: Definisana u RFC 6665, metoda SUBSCRIBE se koristi za zahtevanje obaveštenja o stanju određenog resursa, poput prisustva korisnika ili statusa poziva.
  2. NOTIFY: Takođe definisana u RFC 6665, metoda NOTIFY se šalje od strane servera da obavesti pretplaćenog korisničkog agenta o promenama u stanju praćenog resursa.
  3. REFER: Definisana u RFC 3515, metoda REFER se koristi za zahtev da primalac izvrši transfer ili uputi na treću stranu. Ovo se obično koristi za scenarije transfera poziva.
  4. MESSAGE: Definisana u RFC 3428, metoda MESSAGE se koristi za slanje trenutnih poruka između SIP korisničkih agenata, omogućavajući tekstualnu komunikaciju unutar SIP okvira.
  5. UPDATE: Definisana u RFC 3311, metoda UPDATE omogućava modifikaciju sesije bez uticaja na stanje postojećeg dijaloga. Ovo je korisno za ažuriranje parametara sesije, poput kodeka ili tipova medija, tokom aktivnog poziva.
  6. PUBLISH: Definisana u RFC 3903, metoda PUBLISH se koristi od strane korisničkog agenta da objavi informacije o stanju događaja serveru, čineći ih dostupnim drugim zainteresovanim stranama.

Kodovi odgovora SIP-a

  • 1xx (Provizorni odgovori): Ovi odgovori ukazuju da je zahtev primljen i da server nastavlja da ga obrađuje.
  • 100 Trying: Zahtev je primljen i server radi na njemu.
  • 180 Ringing: Pozvani se obaveštava i preuzeće poziv.
  • 183 Session Progress: Pruža informacije o napretku poziva.
  • 2xx (Uspešni odgovori): Ovi odgovori ukazuju da je zahtev uspešno primljen, razumljen i prihvaćen.
  • 200 OK: Zahtev je uspešan i server ga je ispunio.
  • 202 Accepted: Zahtev je prihvaćen za obradu, ali još nije završen.
  • 3xx (Odgovori preusmeravanja): Ovi odgovori ukazuju da je potrebna dalja akcija da bi se ispunio zahtev, obično kontaktiranjem alternativnog resursa.
  • 300 Multiple Choices: Postoje više opcija dostupnih, i korisnik ili klijent mora odabrati jednu.
  • 301 Moved Permanently: Traženi resurs je dodeljen novom trajnom URI-ju.
  • 302 Moved Temporarily: Traženi resurs je privremeno dostupan na drugom URI-ju.
  • 305 Use Proxy: Zahtev se mora poslati određenom proksi serveru.
  • 4xx (Odgovori greške klijenta): Ovi odgovori ukazuju da zahtev sadrži lošu sintaksu ili ga server ne može ispuniti.
  • 400 Bad Request: Zahtev je loše formiran ili nevažeći.
  • 401 Unauthorized: Zahtev zahteva autentifikaciju korisnika.
  • 403 Forbidden: Server je razumeo zahtev ali odbija da ga ispuni.
  • 404 Not Found: Traženi resurs nije pronađen na serveru.
  • 408 Request Timeout: Server nije primio kompletan zahtev u vreme koje je bio spreman da čeka.
  • 486 Busy Here: Pozvani je trenutno zauzet i nije u mogućnosti da preuzme poziv.
  • 5xx (Odgovori greške servera): Ovi odgovori ukazuju da server nije uspeo da ispuni validan 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ćenosti.
  • 6xx (Globalni odgovori neuspeha): Ovi odgovori ukazuju da zahtev ne može biti ispunjen od strane bilo kog servera.
  • 600 Busy Everywhere: Svi mogući odredišta za poziv su zauzeta.
  • 603 Decline: Pozvani ne želi da učestvuje u pozivu.
  • 604 Does Not Exist Anywhere: Traženi resurs nije dostupan nigde u mreži.

Primeri

Primer SIP INVITE-a

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
Objašnjenje svakog parametra
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Ova linija označava metod (INVITE), URI zahteva (sip:jdoe@example.com), i verziju SIP protokola (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 uparivanje transakcija.
  3. Max-Forwards: Max-Forwards: 70 - Ovo zaglavlje ograničava broj puta koliko zahtev može biti prosleđen 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 njihovo prikazano 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 njihovo prikazano 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 metod korišćen u zahtevu. Koristi se za uparivanje odgovora na zahteve i detekciju poruka van redosleda.
  8. Contact: Contact: <sip:jsmith@pc33.example.com> - Contact zaglavlje pruža direktnu rutu do pošiljaoca, koja se može koristiti za naknadne 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 podržane od strane pošiljaoca. Ovo pomaže primaocu da razume koje metode mogu biti korišćene tokom komunikacije.
  11. Content-Type: Content-Type: application/sdp - Content-Type zaglavlje specificira medijum tip 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. Telo poruke: Telo poruke sadrži SDP opis sesije, koji uključuje informacije o tipovima medija, codec-ima 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 (jedna crtica označava da nema imena sesije)
  • c=IN IP4 pc33.example.com - Informacije o konekciji (tip mreže, tip adrese i adresa)
  • t=0 0 - Informacije o vremenu (početak i kraj vremena, 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 se audio strim korišćenjem RTP/AVP (Real-time Transport Protocol / Audio Video Profile) i format 0 (PCMU/8000).
  • a=rtpmap:0 PCMU/8000 - Atribut mapiranja formata (0) na codec (PCMU) i njegovu brzinu takta (8000 Hz).

Primer SIP REGISTRACIJE

Metod REGISTER se koristi u Protokolu za inicijaciju sesije (SIP) kako bi omogućio korisničkom agentu (UA), kao što je VoIP telefon ili softver za telefoniranje, da registruje svoju lokaciju sa SIP registrar serverom. Ovaj proces omogućava serveru da zna gde da usmeri dolazne SIP zahteve namenjene registrovanom korisniku. Registrar server obično čini deo SIP proxy servera ili posebnog serverskog registra.

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

  1. Početni REGISTER zahtev od UA ka registrar serveru:
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 početna REGISTER poruka se šalje od strane UA (Alice) registrar serveru. Uključuje važne informacije poput željenog trajanja registracije (Expires), SIP URI korisnika (sip:alice@example.com), i korisničku kontakt adresu (sip:alice@192.168.1.100:5060).

  1. Odgovor 401 Unauthorized od registrar 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 porukom "401 Unauthorized", koja uključuje zaglavlje "WWW-Authenticate". Ovo zaglavlje sadrži informacije potrebne UA da se autentifikuje, kao što su realm autentikacije, nonce i algoritam.

  1. REGISTER zahtev sa autentifikacionim podacima:
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, ovog puta uključujući "Authorization" zaglavlje sa potrebnim pristupnim podacima, kao što su korisničko ime, realm, nonce, i vrednost odgovora izračunata koristeći pružene informacije i korisnikovu lozinku.

Ovako se računa 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šan odgovor na registraciju od servera 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

Nakon što registrar server proveri pružene akreditive, šalje "200 OK" odgovor da označi da je registracija 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, i dolazni SIP zahtevi za Alice mogu biti usmereni ka odgovarajućoj kontakt adresi.

Primer poziva

{% hint style="info" %} Nije pomenuto, ali korisnik B mora da pošalje REGISTER poruku ka Proxy 2 pre nego što može primati pozive. {% endhint %}