SIP (Session Initiation Protocol)

AWS hackleme konusunu sıfırdan ileri seviyeye öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

SIP (Session Initiation Protocol), ses, video ve anlık iletişim de dahil olmak üzere çoklu ortam oturumlarını kurmak, değiştirmek ve sonlandırmak için yaygın olarak kullanılan bir işaret ve çağrı kontrol protokolüdür. Internet Mühendisliği Görev Gücü (IETF) tarafından geliştirilen SIP, VoIP ve birleşik iletişim için de facto standart haline gelmiştir ve RFC 3261'de tanımlanmıştır.

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

  1. Metin Tabanlı Protokol: SIP, insan tarafından okunabilir ve hata ayıklamayı kolaylaştıran bir metin tabanlı protokoldür. HTTP'ye benzer şekilde 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 oldukça ölçeklenebilir olup küçük ölçekli dağıtımlardan büyük kurumsal ve taşıyıcı sınıfı ortamlara kadar kullanılabilir. Yeni özelliklerle kolayca genişletilebilir, bu da çeşitli kullanım durumlarına ve gereksinimlere uyum sağlar.

  3. Uyum: SIP'nin geniş çapta benimsenmesi ve standartlaştırılması, farklı cihazlar, uygulamalar ve hizmet sağlayıcılar arasında daha iyi uyumluluğu sağlar, farklı platformlar arasında sorunsuz 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 fazla 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ı aktarımı ve sesli posta gibi gelişmiş özellikler sağlamak için proxy ve yönlendirme sunucularını kullanabilir.

  6. Varlık ve Anlık İletişim: SIP sadece ses ve video iletişimle sınırlı değildir. Varlık ve anlık iletişimi de destekler, geniş bir birleşik iletişim uygulama yelpazesini mümkün kılar.

Birçok avantajına rağmen, SIP'nin NAT geçidi ve güvenlik duvarı sorunlarıyla uğraşırken yapılandırılması ve yönetilmesi karmaşık olabilir. Bununla birlikte, esnekliği, ölçeklenebilirliği ve endüstri genelinde geniş destek görmesi, VoIP ve çoklu ortam iletişimi için popüler bir tercih haline getirir.

SIP Yöntemleri

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

  1. INVITE: Yeni bir oturumu (çağrıyı) başlatmak veya mevcut bir oturumu değiştirmek için kullanılır. INVITE yöntemi, alıcıyı önerilen oturumun ayrıntıları hakkında bilgilendirmek için oturum açıklamasını (genellikle SDP kullanarak) taşır.

  2. ACK: INVITE isteğine verilen nihai yanıtın alındığını onaylamak için gönderilir. ACK yöntemi, INVITE işlemlerinin uçtan uca doğruluğunu sağlayarak güvenilirliği 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 taraflardan biri 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 alamaması durumunda bir INVITE işlemini iptal etmesine olanak tanır.

  5. OPTIONS: Bir SIP sunucusunun veya kullanıcı ajanının yeteneklerini sorgulamak için kullanılır. OPTIONS yöntemi, oturum kurmadan gerçekleştirmeden 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ı ajanının mevcut konumunu bir SIP kayıt sunucusuna 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, çağrı yönlendirme ve teslimatını mümkün kılar.

Birine çağrı yapmak için REGISTERkullanmak zorunlu değildir. Ancak, INVITE işlemini 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 birkaç SIP uzantı yöntemi bulunmaktadır, bunlar arasında:

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

  2. NOTIFY: Aynı şekilde RFC 6665'te tanımlanan NOTIFY yöntemi, bir sunucunun, izlenen bir kaynağın durumundaki değişiklikler hakkında abone olan bir kullanıcı ajanını bilgilendirmek için gönderdiği bir yöntemdir.

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

  4. MESSAGE: RFC 3428'de tanımlanan MESSAGE yöntemi, SIP kullanıcı ajanları arasında anlık mesajlar göndermek için kullanılır, SIP çerçevesi içinde 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ştirmeyi sağlar. Bu, devam eden bir çağrı sırasında kodekler veya medya türleri gibi oturum parametrelerini güncellemek için kullanışlıdır.

  6. PUBLISH: RFC 3903'te tanımlanan PUBLISH yöntemi, bir kullanıcı ajanının bir sunucuya olay durumu bilgisi yayınlaması için kullanılır, bu bilgiyi ilgilenen diğer 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ışılı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ılı bir şekilde 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şlenmek üzere kabul edildi, ancak henüz tamamlanmadı.

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

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

  • 301 Moved Permanently: İstenen kaynağa yeni kalıcı bir URI atandı.

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

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

  • 4xx (İstemci Hatası Yanıtları): Bu yanıtlar, isteğin kötü sözdizim içerdiğini veya sunucu tarafından karşılanamayacağını gösterir.

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

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

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

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

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

  • 486 Busy Here: Aranan kişi şu anda meşgul ve çağrıyı alamıyor.

  • 5xx (Sunucu Hatası Yanıtları): Bu yanıtlar, sunucunun geçerli bir isteği yerine getiremediğini 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 işleyemiyor.

  • 6xx (Genel Başarısızlık Yanıtları): Bu yanıtlar, isteğin hiçbir sunucu tarafından yerine getirilemeyeceğini gösterir.

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

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

  • 604 Does Not Exist Anywhere: İstenen 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 Bir Parametre Açıklaması
  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ığı, iletişim 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 yönlendiriciler tarafından sonsuz döngüleri önlemek için kaç kez iletilmesine izin verileceğini sınırlar.

  4. To: To: John Doe <sip:jdoe@example.com> - To başlığı, aramanın alıcısını, görüntü adları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öndericisini, görüntü adlarını (Jane Smith) ve SIP URI'sini (sip:jsmith@example.org) belirtir. "tag" parametresi, göndericinin rolünü benzersiz şekilde tanımlamak için kullanılır.

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

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

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

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

  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - Allow başlığı, gönderici 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ığı, ileti gövdesinin ortam türünü belirtir, bu durumda SDP (Session Description Protocol).

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

  13. İleti Gövdesi: İleti gövdesi, önerilen oturum için ortam türleri, kodekler ve taşıma protokolleri hakkında bilgiler içeren SDP oturum açıklamasını içerir.

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

  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Oluşturan ve oturum kimliği

  • s=- - Oturum adı (tek bir tire oturum adı olmadığını gösterir)

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

  • t=0 0 - Zamanlama bilgisi (başlangıç ve bitiş zamanları, 0 0 oturumun sınırlı olmadığını gösterir)

  • m=audio 49170 RTP/AVP 0 - Medya açıklaması (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) kodeke (PCMU) ve saat hızına (8000 Hz) eşleyen özellik.

SIP KAYIT Örneği

REGISTER yöntemi, bir Kullanıcı Aracısı'nın (UA) konumunu bir SIP kayıt sunucusuna kaydetmesine izin vermek için Session Initiation Protocol (SIP) içinde kullanılır. Bu süreç, sunucunun, kayıtlı kullanıcı için gelen SIP isteklerini nereye yönlendireceğini bilmesini sağlar. Kayıt sunucusu genellikle bir SIP proxy sunucusunun bir parçası veya ayrılmış bir kayıt sunucusudur.

İşte bir KAYIT kimlik doğrulama sürecinde yer alan SIP iletilerinin detaylı bir örneği:

  1. UA'dan kayıt sunucusuna ilk KAYIT 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 ilk KAYIT mesajı, UA (Alice) tarafından kayıt sunucusuna gönderilir. İstenen kayıt süresi (Süresi Dolan), kullanıcının SIP URI'sı (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. Kayıt sunucusundan gelen 401 Yetkisiz yanıtı:

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 sunucusu, "401 Yetkisiz" mesajı ile yanıt verir, bu mesaj bir "WWW-Authenticate" başlığı içerir. Bu başlık, UA'nın kendini doğrulaması için gereken bilgileri içerir, örneğin kimlik doğrulama alanı, nonce ve algoritma.

  1. Kimlik doğrulama bilgileri ile KAYIT 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: 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 bilgileriyle birlikte "Authorization" başlığını içeren bir BAŞVURU isteği gönderir, örneğin kullanıcı adı, alan, nonce ve sağlanan bilgiler ve kullanıcının şifresi kullanılarak hesaplanan bir yanıt değeri.

Yetkilendirme yanıtı şu ş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. Kayıt başarılı 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

Registrar sunucusu sağlanan kimlik bilgilerini doğruladıktan sonra, kaydın 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 registrar sunucusuna başarılı bir şekilde kaydedilmiştir ve Alice için gelen SIP istekleri uygun iletişim adresine yönlendirilebilir.

Çağrı Örneği

Belirtilmemiş olsa da, Kullanıcı B'nin aramaları alabilmesi için PROXY 2'ye bir KAYIT mesajı göndermesi gerekmektedir.

Last updated