mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-14 07:13:01 +00:00
242 lines
17 KiB
Markdown
242 lines
17 KiB
Markdown
# SIP (Session Initiation Protocol)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
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.
|
|
|
|
</details>
|
|
|
|
## 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
|
|
```
|
|
<details>
|
|
|
|
<summary>Objašnjenje svakog parametra</summary>
|
|
|
|
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 <sip:jdoe@example.com>` - 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 <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](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: <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).
|
|
|
|
</details>
|
|
|
|
### 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 <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](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 <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**.
|
|
|
|
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 <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**:
|
|
```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 <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
|
|
|
|
<figure><img src="../../../.gitbook/assets/image (1101).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% 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 %}
|