# SIP (Session Initiation Protocol)
Naučite hakovanje AWS-a od nule do heroja sahtARTE (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 %}