SIP (Session Initiation Protocol)

Support HackTricks

Temel Bilgiler

SIP (Oturum Başlatma Protokolü), IP ağları üzerinden ses, video ve anlık mesajlaşma dahil olmak üzere çoklu ortam oturumlarını başlatmak, değiştirmek ve sonlandırmak için yaygın olarak kullanılan bir sinyalizasyon ve çağrı kontrol protokolüdür. Internet Engineering Task Force (IETF) tarafından geliştirilen SIP, RFC 3261'de tanımlanmıştır ve VoIP ve birleşik iletişim için fiili standart haline gelmiştir.

SIP'in bazı temel özellikleri şunlardır:

  1. Metin Tabanlı Protokol: SIP, insan tarafından okunabilir ve hata ayıklamayı kolaylaştıran metin tabanlı bir protokoldür. HTTP'ye benzer bir istek-cevap modeline dayanır ve çağrı oturumlarını kontrol etmek için INVITE, ACK, BYE ve CANCEL gibi yöntemler kullanır.

  2. Ölçeklenebilirlik ve Esneklik: SIP, yüksek derecede ölçeklenebilir olup, küçük ölçekli dağıtımlardan büyük işletme ve taşıyıcı sınıfı ortamlara kadar kullanılabilir. Yeni özelliklerle kolayca genişletilebilir, bu da çeşitli kullanım senaryolarına ve gereksinimlere uyum sağlamasını sağlar.

  3. Etkileşim: SIP'in yaygın benimsenmesi ve standartlaşması, farklı cihazlar, uygulamalar ve hizmet sağlayıcıları arasında daha iyi etkileşim sağlar ve çeşitli platformlar arasında kesintisiz iletişimi teşvik eder.

  4. Modüler Tasarım: SIP, medya iletimi için RTP (Gerçek Zamanlı Taşıma Protokolü) ve çoklu ortam oturumlarını tanımlamak için SDP (Oturum Tanım Protokolü) gibi diğer protokollerle çalışır. Bu modüler tasarım, farklı medya türleri ve kodeklerle daha büyük bir esneklik ve uyumluluk sağlar.

  5. Proxy ve Yönlendirme Sunucuları: SIP, çağrı yönlendirmeyi kolaylaştırmak ve çağrı yönlendirme, çağrı transferi ve sesli mesaj hizmetleri gibi gelişmiş özellikler sağlamak için proxy ve yönlendirme sunucularını kullanabilir.

  6. Varlık ve Anlık Mesajlaşma: SIP, ses ve video iletişimi ile sınırlı değildir. Ayrıca varlık ve anlık mesajlaşmayı destekler, bu da geniş bir birleşik iletişim uygulamaları yelpazesini mümkün kılar.

Birçok avantajına rağmen, SIP, özellikle NAT geçişi ve güvenlik duvarı sorunlarıyla başa çıkarken yapılandırması ve yönetimi karmaşık olabilir. Ancak, çok yönlülüğü, ölçeklenebilirliği ve endüstri genelindeki geniş desteği, onu VoIP ve çoklu ortam iletişimi için popüler bir seçim haline getirir.

SIP Yöntemleri

RFC 3261'de tanımlanan temel SIP yöntemleri şunlardır:

  1. INVITE: Yeni bir oturum (çağrı) başlatmak veya mevcut bir oturumu değiştirmek için kullanılır. INVITE yöntemi, önerilen oturumun ayrıntılarını, medya türleri, kodekler ve taşıma protokolleri gibi bilgileri alıcıya iletmek için oturum tanımını (genellikle SDP kullanarak) taşır.

  2. ACK: Bir INVITE isteğine verilen son yanıtın alındığını onaylamak için gönderilir. ACK yöntemi, uçtan uca onay sağlayarak INVITE işlemlerinin güvenilirliğini sağlar.

  3. BYE: Kurulmuş bir oturumu (çağrıyı) sonlandırmak için kullanılır. BYE yöntemi, iletişimi sonlandırmak isteyen taraf tarafından gönderilir.

  4. CANCEL: Oturum kurulmadan önce bekleyen bir INVITE isteğini iptal etmek için gönderilir. CANCEL yöntemi, gönderenin fikrini değiştirmesi veya alıcıdan yanıt gelmemesi durumunda bir INVITE işlemini iptal etmesine olanak tanır.

  5. OPTIONS: Bir SIP sunucusunun veya kullanıcı aracısının yeteneklerini sorgulamak için kullanılır. OPTIONS yöntemi, oturum kurmadan desteklenen yöntemler, medya türleri veya diğer uzantılar hakkında bilgi talep etmek için gönderilebilir.

  6. REGISTER: Bir kullanıcı aracı tarafından bir SIP kayıt sunucusuna mevcut konumunu kaydetmek için kullanılır. REGISTER yöntemi, bir kullanıcının SIP URI'si ile mevcut IP adresi arasında güncel bir eşleme sağlamaya yardımcı olur, bu da çağrı yönlendirme ve teslimatını mümkün kılar.

Birine çağrı yapmak için REGISTER kullanmak gerekli değildir. Ancak, bir INVITE gerçekleştirmek için arayanın önce kimlik doğrulaması yapması gerekebilir veya 401 Unauthorized yanıtı alabilir.

Bu temel yöntemlerin yanı sıra, diğer RFC'lerde tanımlanan birçok SIP uzantı yöntemi bulunmaktadır:

  1. SUBSCRIBE: RFC 6665'te tanımlanan SUBSCRIBE yöntemi, belirli bir kaynağın durumu hakkında bildirim talep etmek için kullanılır, örneğin bir kullanıcının varlığı veya çağrı durumu.

  2. NOTIFY: RFC 6665'te de tanımlanan NOTIFY yöntemi, bir sunucu tarafından abonelikteki bir kullanıcı aracısına izlenen bir kaynağın durumundaki değişiklikler hakkında bilgi vermek için gönderilir.

  3. REFER: RFC 3515'te tanımlanan REFER yöntemi, alıcının bir transfer gerçekleştirmesini veya üçüncü bir tarafa yönlendirmesini talep etmek için kullanılır. Bu genellikle çağrı transferi senaryolarında kullanılır.

  4. MESSAGE: RFC 3428'de tanımlanan MESSAGE yöntemi, SIP kullanıcı araçları arasında anlık mesajlar göndermek için kullanılır ve SIP çerçevesinde metin tabanlı iletişimi mümkün kılar.

  5. UPDATE: RFC 3311'de tanımlanan UPDATE yöntemi, mevcut diyalogun durumunu etkilemeden bir oturumu değiştirmeye olanak tanır. Bu, devam eden bir çağrı sırasında kodekler veya medya türleri gibi oturum parametrelerini güncellemek için yararlıdır.

  6. PUBLISH: RFC 3903'te tanımlanan PUBLISH yöntemi, bir kullanıcı aracı tarafından bir sunucuya olay durumu bilgilerini yayınlamak için kullanılır ve bu bilgileri diğer ilgilenen taraflara sunar.

SIP Yanıt Kodları

  • 1xx (Geçici Yanıtlar): Bu yanıtlar, isteğin alındığını ve sunucunun işlemeye devam ettiğini gösterir.

  • 100 Trying: İstek alındı ve sunucu üzerinde çalışıyor.

  • 180 Ringing: Aranan kişi uyarılıyor ve çağrıyı alacak.

  • 183 Session Progress: Çağrının ilerlemesi hakkında bilgi sağlar.

  • 2xx (Başarılı Yanıtlar): Bu yanıtlar, isteğin başarıyla alındığını, anlaşıldığını ve kabul edildiğini gösterir.

  • 200 OK: İstek başarılı oldu ve sunucu bunu yerine getirdi.

  • 202 Accepted: İstek işleme alındı, ancak henüz tamamlanmadı.

  • 3xx (Yönlendirme Yanıtları): Bu yanıtlar, isteği yerine getirmek için daha fazla eylem gerektiğini gösterir, genellikle alternatif bir kaynağa başvurarak.

  • 300 Multiple Choices: Birden fazla seçenek mevcut ve kullanıcı veya istemci birini seçmelidir.

  • 301 Moved Permanently: İstenilen kaynak yeni bir kalıcı URI'ye atanmıştır.

  • 302 Moved Temporarily: İstenilen kaynak geçici olarak farklı bir URI'de mevcuttur.

  • 305 Use Proxy: İstek belirtilen bir proxy'e gönderilmelidir.

  • 4xx (İstemci Hatası Yanıtları): Bu yanıtlar, isteğin kötü bir sözdizimi içerdiğini veya sunucu tarafından yerine getirilemeyeceğini gösterir.

  • 400 Bad Request: İstek biçimsel olarak hatalı veya geçersizdi.

  • 401 Unauthorized: İstek kullanıcı kimlik doğrulaması gerektirir.

  • 403 Forbidden: Sunucu isteği anladı ancak yerine getirmeyi reddetti.

  • 404 Not Found: İstenilen kaynak sunucuda bulunamadı.

  • 408 Request Timeout: Sunucu, beklemeye hazır olduğu süre içinde tamamlanmış bir istek almadı.

  • 486 Busy Here: Aranan kişi şu anda meşguldür ve çağrıyı alamaz.

  • 5xx (Sunucu Hatası Yanıtları): Bu yanıtlar, sunucunun geçerli bir isteği yerine getirmekte başarısız olduğunu gösterir.

  • 500 Internal Server Error: Sunucu isteği işlerken bir hata ile karşılaştı.

  • 501 Not Implemented: Sunucu, isteği yerine getirmek için gereken işlevselliği desteklemiyor.

  • 503 Service Unavailable: Sunucu, bakım veya aşırı yük nedeniyle isteği şu anda işleyemiyor.

  • 6xx (Küresel Hata Yanıtları): Bu yanıtlar, isteğin herhangi bir sunucu tarafından yerine getirilemeyeceğini gösterir.

  • 600 Busy Everywhere: Çağrı için tüm olası varış noktaları meşguldür.

  • 603 Decline: Aranan kişi çağrıya katılmak istemiyor.

  • 604 Does Not Exist Anywhere: İstenilen kaynak ağda hiçbir yerde mevcut değil.

Örnekler

SIP INVITE Örneği

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
Her Parametre Açıklandı
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Bu satır, yöntemi (INVITE), istek URI'sini (sip:jdoe@example.com) ve SIP sürümünü (SIP/2.0) belirtir.

  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - Via başlığı, taşıma protokolünü (UDP) ve istemcinin adresini (pc33.example.com) belirtir. "branch" parametresi döngü tespiti ve işlem eşleştirmesi için kullanılır.

  3. Max-Forwards: Max-Forwards: 70 - Bu başlık alanı, isteğin proxyler tarafından kaç kez iletilebileceğini sınırlayarak sonsuz döngüleri önler.

  4. To: To: John Doe <sip:jdoe@example.com> - To başlığı, aramanın alıcısını, görüntüleme adını (John Doe) ve SIP URI'sini (sip:jdoe@example.com) belirtir.

  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - From başlığı, aramanın gönderenini, görüntüleme adını (Jane Smith) ve SIP URI'sini (sip:jsmith@example.org) belirtir. "tag" parametresi, gönderenin diyalogdaki rolünü benzersiz olarak tanımlamak için kullanılır.

  6. Call-ID: Call-ID: a84b4c76e66710 - Call-ID başlığı, iki kullanıcı ajanı arasındaki bir çağrı oturumunu benzersiz olarak tanımlar.

  7. CSeq: CSeq: 314159 INVITE - CSeq başlığı, bir sıra numarası ve istekte kullanılan yöntemi içerir. Yanıtları isteklere eşleştirmek ve sırasız mesajları tespit etmek için kullanılır.

  8. Contact: Contact: <sip:jsmith@pc33.example.com> - Contact başlığı, gönderenin doğrudan yolunu sağlar; bu, sonraki istekler ve yanıtlar için kullanılabilir.

  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - User-Agent başlığı, gönderenin yazılımı veya donanımı hakkında bilgi sağlar; adı ve sürümünü içerir.

  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - Allow başlığı, gönderen tarafından desteklenen SIP yöntemlerini listeler. Bu, alıcının iletişim sırasında hangi yöntemlerin kullanılabileceğini anlamasına yardımcı olur.

  11. Content-Type: Content-Type: application/sdp - Content-Type başlığı, mesaj gövdesinin medya türünü belirtir; bu durumda, SDP (Oturum Tanım Protokolü).

  12. Content-Length: Content-Length: 142 - Content-Length başlığı, mesaj gövdesinin boyutunu bayt cinsinden belirtir.

  13. Message Body: Mesaj gövdesi, önerilen oturum için medya türleri, kodekler ve taşıma protokolleri hakkında bilgi içeren SDP oturum tanımını içerir.

  • v=0 - Protokol sürümü (SDP için 0)

  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Başlatıcı ve oturum tanımlayıcı

  • s=- - Oturum adı (tek bir tire, oturum adı olmadığını belirtir)

  • c=IN IP4 pc33.example.com - Bağlantı bilgileri (ağ türü, adres türü ve adres)

  • t=0 0 - Zamanlama bilgileri (başlangıç ve bitiş zamanları, 0 0 oturumun sınırlı olmadığını belirtir)

  • m=audio 49170 RTP/AVP 0 - Medya tanımı (medya türü, port numarası, taşıma protokolü ve format listesi). Bu durumda, RTP/AVP (Gerçek Zamanlı Taşıma Protokolü / Ses Video Profili) kullanarak bir ses akışını ve format 0 (PCMU/8000) belirtir.

  • a=rtpmap:0 PCMU/8000 - Formatı (0) kodek (PCMU) ve saat hızı (8000 Hz) ile eşleyen özellik.

SIP REGISTER Örneği

REGISTER yöntemi, bir kullanıcı ajanının (UA), örneğin bir VoIP telefonu veya bir softphone'un, bir SIP kayıt sunucusuna konumunu kaydetmesine olanak tanır. Bu süreç, sunucunun kayıtlı kullanıcıya yönelik gelen SIP isteklerini nereye yönlendireceğini bilmesini sağlar. Kayıt sunucusu genellikle bir SIP proxy sunucusunun veya özel bir kayıt sunucusunun parçasıdır.

İşte bir REGISTER kimlik doğrulama sürecinde yer alan SIP mesajlarının ayrıntılı bir örneği:

  1. UA'dan kayıt sunucusuna ilk REGISTER isteği:

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

Bu başlangıç REGISTER mesajı, UA (Alice) tarafından kayıt sunucusuna gönderilir. İstenilen kayıt süresi (Expires), kullanıcının SIP URI'si (sip:alice@example.com) ve kullanıcının iletişim adresi (sip:alice@192.168.1.100:5060) gibi önemli bilgileri içerir.

  1. 401 Yetkisiz yanıtı kayıt sunucusundan:

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

The registrar server responds with a "401 Unauthorized" message, which includes a "WWW-Authenticate" header. This header contains information required for the UA to authenticate itself, such as the authentication realm, nonce, and algorithm.

  1. KAYIT isteği kimlik doğrulama bilgileri ile:

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, bu sefer gerekli kimlik bilgilerini içeren "Authorization" başlığını, kullanıcı adı, realm, nonce ve sağlanan bilgiler ile kullanıcının şifresini kullanarak hesaplanan bir yanıt değeri ile birlikte başka bir REGISTER isteği gönderir.

Authorization yanıtı bu şekilde hesaplanır:

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. Başarılı kayıt yanıtı kayıt sunucusundan:

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

After the registrar server verifies the provided credentials, kayıt işleminin başarılı olduğunu belirtmek için "200 OK" yanıtı gönderir. Yanıt, kayıtlı iletişim bilgilerini ve kaydın sona erme zamanını içerir. Bu noktada, kullanıcı ajanı (Alice) SIP kayıt sunucusuna başarıyla kaydedilmiştir ve Alice için gelen SIP istekleri uygun iletişim adresine yönlendirilebilir.

Arama Örneği

Bahsedilmemiştir, ancak Kullanıcı B'nin arama alabilmesi için Proxy 2'ye bir REGISTER mesajı göndermiş olması gerekir.

Support HackTricks

Last updated