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

224 lines
16 KiB
Markdown
Raw Normal View History

# SIP (Session Initiation Protocol)
<details>
2024-02-10 13:11:20 +00:00
<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>
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2024-02-03 12:22:53 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](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 **Twitter-u** 🐦 [**@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>
2024-02-10 13:11:20 +00:00
## Osnovne informacije
2024-02-10 13:11:20 +00:00
SIP (Session Initiation Protocol) je **signalizacijski i kontrolni protokol poziva** koji se široko koristi 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.
2024-02-10 13:11:20 +00:00
Neki ključni elementi SIP-a uključuju:
2024-02-10 13:11:20 +00:00
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. **Skalabilnost i fleksibilnost**: SIP je visoko skalabilan i može se koristiti u malim implementacijama, kao i u velikim preduzećima i provajderskim okruženjima. Može se lako proširiti novim funkcionalnostima, š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 provajdera 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 vrstama medija i kodeka.
5. **Proxy i preusmeravajući serveri**: SIP može koristiti proxy i preusmeravajuće servere za olakšavanje rutiranja poziva i pružanje naprednih funkcionalnosti poput preusmeravanja poziva, transfera poziva i 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.
2024-02-10 13:11:20 +00:00
Uprkos mnogim prednostima, SIP može biti kompleksan za konfigurisanje i upravljanje, posebno kada se suočava sa NAT prelazom i problemima sa firewall-om. Međutim, njegova fleksibilnost, skalabilnost i široka podrška u industriji čine ga popularnim izborom za VoIP i multimedijalnu komunikaciju.
2024-02-10 13:11:20 +00:00
### SIP metode
2024-02-10 13:11:20 +00:00
Osnovne SIP metode definisane u **RFC 3261** uključuju:
2024-02-10 13:11:20 +00:00
1. **INVITE**: Koristi se za **inicijaciju nove sesije (poziva)** ili modifikaciju postojeće. Metoda INVITE prenosi opis sesije (obično koristeći SDP) kako bi obavestila primaoca o detaljima predložene sesije, poput vrsta medija, kodeka i transportnih protokola.
2. **ACK**: Služi za **potvrdu prijema** konačnog odgovora na INVITE zahtev. Metoda ACK obezbeđuje pouzdanost INVITE transakcija pružanjem potvrde o prijemu od kraja do kraja.
3. **BYE**: Koristi se za **prekidanje uspostavljene sesije (poziva)**. Metoda BYE se šalje od strane bilo koje strane u sesiji kako bi se naznačilo da žele prekinuti komunikaciju.
4. **CANCEL**: Služi za **otkazivanje čekajućeg INVITE** zahteva pre uspostavljanja sesije. 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 **upitivanje mogućnosti SIP servera ili korisničkog agenta**. Metoda OPTIONS se može poslati kako bi se zatražile informacije o podržanim metodama, vrstama medija ili drugim ekstenzijama, a da se pritom ne uspostavi sesija.
6. **REGISTER**: Koristi ga korisnički agent da **registruje svoju trenutnu lokaciju kod SIP registarskog servera**. Metoda REGISTER pomaže u održavanju ažurnog mapiranja između korisnikovog SIP URI-ja i njegove trenutne IP adrese, omogućavajući rutiranje i dostavu poziva.
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Napomena da bi se nekoga pozvalo **nije neophodno koristiti REGISTER** za bilo šta.\
Međutim, moguće je da bi pozivaoc trebao da se **autentifikuje** pre nego što izvrši **INVITE**, ili će dobiti odgovor **`401 Unauthorized`**.
{% endhint %}
2024-02-10 13:11:20 +00:00
Pored ovih osnovnih metoda, postoje **brojne SIP ekstenzije** definisane u drugim RFC-ovima, kao što su:
2024-02-10 13:11:20 +00:00
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 kako bi **obavestila pretplaćeni korisnički agent** o promenama u stanju praćenog resursa.
3. **REFER**: Definisana u RFC 3515, metoda REFER se koristi za **zahtevanje da primalac izvrši transfer ili uputi na treću stranu**. Ovo se obično koristi za scenari
## Primeri
### Primer SIP POZIVANJA
```
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>
2024-02-10 13:11:20 +00:00
<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-a (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 preko proksija 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](mailto: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](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 koji se koristi u zahtevu. Koristi se za uparivanje odgovora na zahteve i otkrivanje 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 sledeće 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 mogu biti korišćene tokom komunikacije.
11. **Content-Type**: `Content-Type: application/sdp` - Content-Type zaglavlje specificira medija 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, kodecima i transportnim protokolima za predloženu sesiju.
* `v=0` - Verzija protokola (0 za SDP)
* `o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com` - Originator i identifikator sesije
* `s=-` - Naziv sesije (jedan crtića ukazuje na odsustvo naziva sesije)
* `c=IN IP4 pc33.example.com` - Informacije o konekciji (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 se audio tok 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 taktovanja (8000 Hz).
</details>
2024-02-10 13:11:20 +00:00
### Primer SIP REGISTER-a
2024-02-10 13:11:20 +00:00
Metod REGISTER se koristi u protokolu za inicijaciju sesije (SIP) kako bi omogućio korisničkom agentu (UA), poput VoIP telefona ili softfona, da **registruje svoju lokaciju kod SIP registracionog servera**. Ovaj proces omogućava serveru da zna **gde da usmeri dolazne SIP zahteve namenjene registrovanom korisniku**. Registracioni server obično čini deo SIP proxy servera ili posebnog registracionog servera.
2024-02-10 13:11:20 +00:00
Evo detaljnog primera SIP poruka uključenih u proces autentifikacije REGISTER:
2024-02-10 13:11:20 +00:00
1. Početni **REGISTER** zahtev od UA do registracionog servera:
```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
```
2024-02-10 13:11:20 +00:00
Ova početna REGISTER poruka se šalje od strane UA (Alice) registrar serveru. Ona uključuje važne informacije kao što su željeno trajanje registracije (Expires), SIP URI korisnika (sip:[alice@example.com](mailto:alice@example.com)), i kontakt adresa korisnika (sip:alice@192.168.1.100:5060).
2024-02-10 13:11:20 +00:00
2. **401 Unauthorized** odgovor 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
```
2024-02-10 13:11:20 +00:00
Registar server odgovara sa "401 Unauthorized" porukom, koja uključuje "WWW-Authenticate" zaglavlje. Ovo zaglavlje sadrži informacije potrebne UA-u da se autentifikuje, kao što su **autentifikaciono područje, nonce i algoritam**.
2024-02-10 13:11:20 +00:00
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
```
2024-02-10 13:11:20 +00:00
UA šalje još jedan REGISTER zahtev, ovog puta uključujući **"Authorization" zaglavlje sa potrebnim podacima za autentifikaciju, kao što su korisničko ime, realm, nonce i vrednost odgovora** izračunata koristeći pružene informacije i korisnikovu lozinku.
2024-02-10 13:11:20 +00:00
Ovako se izračunava **Authorization odgovor**:
```python
import hashlib
def calculate_sip_md5_response(username, password, realm, method, uri, nonce, nc, cnonce, qop):
2024-02-10 13:11:20 +00:00
# 1. Calculate HA1 (concatenation of username, realm, and password)
ha1_input = f"{username}:{realm}:{password}"
ha1 = hashlib.md5(ha1_input.encode()).hexdigest()
2024-02-10 13:11:20 +00:00
# 2. Calculate HA2 (concatenation of method and uri)
ha2_input = f"{method}:{uri}"
ha2 = hashlib.md5(ha2_input.encode()).hexdigest()
2024-02-10 13:11:20 +00:00
# 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()
2024-02-10 13:11:20 +00:00
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}")
```
2024-02-10 13:11:20 +00:00
4. **Uspešan odgovor** na registraciju od strane servera registra:
```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
```
2024-02-10 13:11:20 +00:00
Nakon što registrar server verifikuje pružene akreditive, **šalje "200 OK" odgovor da bi pokazao 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.
2024-02-10 13:11:20 +00:00
### Primer poziva
<figure><img src="../../../.gitbook/assets/image (666).png" alt=""><figcaption></figcaption></figure>
{% hint style="info" %}
2024-02-10 13:11:20 +00:00
Nije pomenuto, ali korisnik B mora da pošalje **REGISTER poruku ka Proxy 2** pre nego što bude u mogućnosti da prima pozive.
{% endhint %}
<details>
2024-02-10 13:11:20 +00:00
<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>
2024-02-10 13:11:20 +00:00
Drugi načini da podržite HackTricks:
2024-02-03 12:22:53 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](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 **Twitter-u** 🐦 [**@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>