hacktricks/network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md
2023-07-07 23:42:27 +00:00

22 KiB
Raw Blame History

SIPセッション開始プロトコル

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

基本情報

SIPセッション開始プロトコルは、IPネットワーク上で音声、ビデオ、インスタントメッセージングなどのマルチメディアセッションを確立、変更、終了するために広く使用されるシグナリングおよびコール制御プロトコルです。SIPは**Internet Engineering Task ForceIETF**によって開発され、RFC 3261で定義され、VoIPおよび統合コミュニケーションの事実上の標準となっています。

SIPの主な特徴は次のとおりです。

  1. テキストベースのプロトコルSIPはテキストベースのプロトコルであり、人間が読みやすくデバッグしやすい特徴があります。HTTPと同様の要求-応答モデルに基づき、INVITE、ACK、BYE、CANCELなどのメソッドを使用して通話セッションを制御します。
  2. スケーラビリティと柔軟性SIPは非常にスケーラブルであり、小規模な展開から大企業やキャリアグレードの環境まで使用することができます。新機能を簡単に追加できるため、さまざまなユースケースや要件に適応することができます。
  3. 相互運用性SIPの広範な採用と標準化により、さまざまなデバイス、アプリケーション、サービスプロバイダ間での相互運用性が向上し、さまざまなプラットフォーム間でのシームレスな通信が促進されます。
  4. モジュラーデザインSIPは、メディアの送信に**RTPリアルタイムトランスポートプロトコルやマルチメディアセッションの説明にSDPセッション記述プロトコル**などの他のプロトコルと連携します。このモジュラーデザインにより、さまざまなメディアタイプやコーデックとの互換性と柔軟性が向上します。
  5. プロキシおよびリダイレクトサーバーSIPはプロキシおよびリダイレクトサーバーを使用して通話ルーティングを容易にし、通話転送、通話転送、ボイスメールサービスなどの高度な機能を提供することができます。
  6. プレゼンスおよびインスタントメッセージングSIPは音声およびビデオ通信に限定されません。プレゼンスおよびインスタントメッセージングもサポートしており、さまざまな統合コミュニケーションアプリケーションを可能にします。

多くの利点があるにもかかわらず、SIPはNATトラバーサルやファイアウォールの問題に対処する際に複雑になる場合があります。ただし、その汎用性、スケーラビリティ、業界全体での広範なサポートにより、VoIPおよびマルチメディア通信において人気のある選択肢となっています。

SIPメソッド

RFC 3261で定義されているSIPの主要なメソッドは次のとおりです。

  1. INVITE:新しいセッション(通話)を開始または既存のセッションを変更するために使用されます。INVITEメソッドはセッションの詳細通常はSDPを使用を受信者に通知するためにセッションの説明を運びます。メディアタイプ、コーデック、トランスポートプロトコルなどの詳細が含まれます。
  2. ACKINVITEリクエストへの最終応答の受信を確認するために送信されます。ACKメソッドは、エンドツーエンドの確認を提供することにより、INVITEトランザクションの信頼性を確保します。
  3. BYE:確立されたセッション(通話)を終了するために使用されます。BYEメソッドは、セッションのいずれかのパーティが通信を終了したいことを示すために送信されます。
  4. CANCELセッションが確立される前に保留中のINVITEリクエストをキャンセルするために送信されます。CANCELメソッドは、送信者が考えを変えた場合や受信者からの応答がない場合にINVITEトランザクションを中止するために使用されます。
  5. OPTIONSSIPサーバーまたはユーザーエージェントの機能をクエリするために使用されます。OPTIONSメソッドは、セッションを確立せずに、サポートされているメソッド、メディアタイプ、または他の拡張機能に関する情報をリクエストするために送信されることがあります。
  6. REGISTERユーザーエージェントが現在の場所をSIPレジストラサーバーに登録するために使用されます。REGISTERメソッドは、ユーザーのSIP URIと現在のIPアドレスの最新のマッピングを維持するのに役立ち、通話のルーティングと配信を可能にします。

{% hint style

SIPレスポンスコード

  • 1xx仮の応答:これらの応答は、リクエストが受信され、サーバーが処理を継続していることを示します。
  • 100 Tryingリクエストが受信され、サーバーが処理中です。
  • 180 Ringing呼び出し先が呼び出しに応答し、通話を受ける準備ができています。
  • 183 Session Progress通話の進行状況に関する情報を提供します。
  • 2xx成功の応答:これらの応答は、リクエストが正常に受信、理解、受け入れられたことを示します。
  • 200 OKリクエストが成功し、サーバーがそれを完了しました。
  • 202 Acceptedリクエストは処理のために受け入れられましたが、まだ完了していません。
  • 3xxリダイレクトの応答:これらの応答は、通常、別のリソースに連絡することでリクエストを完了するためにさらなる操作が必要であることを示します。
  • 300 Multiple Choices複数のオプションが利用可能であり、ユーザーまたはクライアントが1つを選択する必要があります。
  • 301 Moved Permanently要求されたリソースには新しい恒久的なURIが割り当てられました。
  • 302 Moved Temporarily要求されたリソースは一時的に別のURIで利用可能です。
  • 305 Use Proxyリクエストは指定されたプロキシに送信する必要があります。
  • 4xxクライアントエラーの応答:これらの応答は、リクエストに誤った構文が含まれているか、サーバーによって満たすことができないことを示します。
  • 400 Bad Requestリクエストが不正または無効です。
  • 401 Unauthorizedリクエストにはユーザー認証が必要です。
  • 403 Forbiddenサーバーはリクエストを理解しましたが、それを満たすことを拒否します。
  • 404 Not Found要求されたリソースはサーバー上で見つかりませんでした。
  • 408 Request Timeoutサーバーは準備された待機時間内に完全なリクエストを受信しませんでした。
  • 486 Busy Here呼び出し先は現在忙しく、通話を受けることができません。
  • 5xxサーバーエラーの応答:これらの応答は、サーバーが有効なリクエストを満たすことに失敗したことを示します。
  • 500 Internal Server Errorサーバーはリクエストの処理中にエラーが発生しました。
  • 501 Not Implementedサーバーはリクエストを満たすために必要な機能をサポートしていません。
  • 503 Service Unavailableサーバーは現在、メンテナンスまたは過負荷のためにリクエストを処理できません。
  • 6xxグローバルエラーの応答:これらの応答は、リクエストをどのサーバーでも満たすことができないことを示します。
  • 600 Busy Everywhere通話の可能なすべての宛先が使用中です。
  • 603 Decline呼び出し先は通話に参加したくありません。
  • 604 Does Not Exist Anywhere要求されたリソースはネットワーク上のどこにも存在しません。

SIP INVITEの例

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
各パラメータの説明
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - この行はメソッドINVITE、リクエストURIsip:jdoe@example.com、およびSIPバージョンSIP/2.0)を示しています。
  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - ViaヘッダーはトランスポートプロトコルUDPとクライアントのアドレスpc33.example.comを指定します。"branch"パラメータはループ検出とトランザクションのマッチングに使用されます。
  3. Max-Forwards: Max-Forwards: 70 - このヘッダーフィールドは、無限ループを避けるためにプロキシによってリクエストが転送される回数を制限します。
  4. To: To: John Doe <sip:jdoe@example.com> - Toヘッダーは、通話の受信者を指定します。表示名John DoeとSIP URIsip:jdoe@example.com)が含まれます。
  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - Fromヘッダーは、通話の送信者を指定します。表示名Jane SmithとSIP URIsip:jsmith@example.org)が含まれます。"tag"パラメータは、ダイアログ内で送信者の役割を一意に識別するために使用されます。
  6. Call-ID: Call-ID: a84b4c76e66710 - Call-IDヘッダーは、2つのユーザーエージェント間の通話セッションを一意に識別します。
  7. CSeq: CSeq: 314159 INVITE - CSeqヘッダーにはシーケンス番号とリクエストで使用されるメソッドが含まれています。これは、応答をリクエストに一致させ、順序が逆になったメッセージを検出するために使用されます。
  8. Contact: Contact: <sip:jsmith@pc33.example.com> - Contactヘッダーは、送信者への直接ルートを提供し、後続のリクエストと応答に使用できます。
  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - User-Agentヘッダーは、送信者のソフトウェアまたはハードウェアに関する情報を提供します。名前とバージョンが含まれます。
  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - Allowヘッダーは、送信者がサポートするSIPメソッドのリストを示します。これにより、受信者は通信中に使用できるメソッドを理解するのに役立ちます。
  11. Content-Type: Content-Type: application/sdp - Content-Typeヘッダーは、メッセージボディのメディアタイプを指定します。この場合はSDPセッション記述プロトコルです。
  12. Content-Length: Content-Length: 142 - Content-Lengthヘッダーは、メッセージボディのサイズをバイト単位で示します。
  13. メッセージボディ: メッセージボディにはSDPセッション記述が含まれており、提案されたセッションのメディアタイプ、コーデック、およびトランスポートプロトコルに関する情報が含まれています。
  • v=0 - プロトコルバージョンSDPの場合は0
  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - 発信者とセッション識別子
  • s=- - セッション名ハイフン1つはセッション名がないことを示します
  • c=IN IP4 pc33.example.com - 接続情報(ネットワークタイプ、アドレスタイプ、アドレス)
  • t=0 0 - タイミング情報開始時間と終了時間、0 0はセッションが制約されていないことを意味します
  • m=audio 49170 RTP/AVP 0 - メディアの説明メディアタイプ、ポート番号、トランスポートプロトコル、およびフォーマットリスト。この場合、RTP/AVPリアルタイムトランスポートプロトコル/オーディオビデオプロファイルを使用したオーディオストリームを指定し、フォーマット0PCMU/8000を指定しています。
  • a=rtpmap:0 PCMU/8000 - フォーマット0をコーデックPCMUとそのクロックレート8000 Hzにマッピングする属性。

SIP REGISTERの例

REGISTERメソッドは、セッション開始プロトコルSIPで使用され、VoIP電話やソフトフォンなどのユーザーエージェントUAがSIP登録サーバーに自分の場所を登録するために使用されます。このプロセスにより、サーバーは登録されたユーザー宛の着信SIPリクエストをどこにルーティングするかを知ることができます。登録サーバーは通常、SIPプロキシサーバーまたは専用の登録サーバーの一部です。

以下は、REGISTER認証プロセスに関与するSIPメッセージの詳細な例です

  1. UAから登録サーバーへの最初のREGISTERリクエスト:
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

この最初のREGISTERメッセージは、UAAliceから登録サーバーに送信されます。これには、希望する登録期間Expires、ユーザーのSIP URIsip:alice@example.com、およびユーザーの連絡先アドレスsip:alice@192.168.1.100:5060などの重要な情報が含まれています。

  1. 登録サーバーからの401 Unauthorized応答:
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

レジストラサーバーは「401 Unauthorized」メッセージで応答し、その中に「WWW-Authenticate」ヘッダーが含まれます。このヘッダーには、UAが自身を認証するために必要な情報が含まれています。具体的には、認証領域、ノンス、およびアルゴリズムです。

  1. 認証情報を含むREGISTERリクエスト:
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は、この時にはユーザ名、レルム、ンス、およびユーザのパスワードを使用して計算された応答値など、必要な資格情報を含む「Authorization」ヘッダを含めた別のREGISTERリクエストを送信します。

以下は、Authorization応答が計算される方法です

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. 登録成功 レジストラサーバーからの応答:
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

レジストラサーバーが提供された認証情報を確認した後、「200 OK」の応答を送信して登録が成功したことを示します。応答には登録された連絡先情報と登録の有効期限が含まれます。この時点で、ユーザーエージェントAliceはSIPレジストラサーバーに正常に登録され、Aliceへの着信SIPリクエストは適切な連絡先アドレスにルーティングされます。

通話の例

{% hint style="info" %} 言及されていませんが、ユーザーBは受信するためにはProxy 2に対してREGISTERメッセージを送信する必要があります。 {% endhint %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥