# 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: * Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJEM**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
## 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 From: Jane Smith ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: 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](mailto: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 ` - To zaglavlje specificira primaoca poziva, uključujući njihovo prikazano ime (John Doe) i SIP URI (sip:[jdoe@example.com](mailto:jdoe@example.com)). 5. **From**: `From: Jane Smith ;tag=1928301774` - From zaglavlje specificira pošiljaoca poziva, uključujući njihovo prikazano ime (Jane Smith) i SIP URI (sip:[jsmith@example.org](mailto: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: ` - 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: ```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 ;tag=565656 To: Alice Call-ID: 1234567890@192.168.1.100 CSeq: 1 REGISTER Contact: ;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](mailto:alice@example.com)), i korisničku kontakt adresu (sip:alice@192.168.1.100:5060). 2. Odgovor **401 Unauthorized** od registrar servera: ```css cssCopy codeSIP/2.0 401 Unauthorized Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds From: Alice ;tag=565656 To: Alice ;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**. 3. REGISTER zahtev **sa autentifikacionim podacima**: ```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 ;tag=565656 To: Alice Call-ID: 1234567890@192.168.1.100 CSeq: 2 REGISTER Contact: ;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**: ```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}") ``` 4. **Uspešan odgovor** na registraciju od servera registrar: ```yaml SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds From: Alice ;tag=565656 To: Alice ;tag=7878744 Call-ID: 1234567890@192.168.1.100 CSeq: 2 REGISTER Contact: ;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 %}