SIP (Session Initiation Protocol)

htARTE(HackTricks AWS Red Team Expert)を使用して、**ゼロからヒーローまでAWSハッキングを学ぶ**

HackTricksをサポートする他の方法:

基本情報

SIP(Session Initiation Protocol)は、音声、ビデオ、インスタントメッセージングを含むマルチメディアセッションを確立、変更、終了するために広く使用されるシグナリングおよびコール制御プロトコルです。Internet Engineering Task Force(IETF)によって開発され、SIPはRFC 3261で定義され、VoIPおよび統合通信の事実上の標準となっています。

SIPの主な特徴には次のものがあります:

  1. テキストベースのプロトコル:SIPはテキストベースのプロトコルであり、人間が読みやすくデバッグしやすい特徴があります。HTTPと同様のリクエスト-レスポンスモデルに基づき、呼び出しセッションを制御するためにINVITE、ACK、BYE、CANCELなどのメソッドを使用します。

  2. スケーラビリティと柔軟性:SIPは非常にスケーラブルであり、小規模な展開から大規模なエンタープライズおよびキャリアグレードの環境まで使用できます。新機能を簡単に追加できるため、さまざまなユースケースや要件に適応できます。

  3. 相互運用性:SIPの広範な採用と標準化により、異なるデバイス、アプリケーション、サービスプロバイダ間での相互運用性が向上し、さまざまなプラットフォーム間でのシームレスな通信が促進されます。

  4. モジュラーデザイン:SIPはメディア伝送のための**RTP(Real-time Transport Protocol)やマルチメディアセッションの記述のためのSDP(Session Description Protocol)**など、他のプロトコルと連携します。このモジュラーデザインにより、さまざまなメディアタイプやコーデックとの互換性が向上し、柔軟性が高まります。

  5. プロキシおよびリダイレクトサーバー:SIPはプロキシおよびリダイレクトサーバーを使用して通話ルーティングを容易にし、通話転送、通話転送、ボイスメールサービスなどの高度な機能を提供します。

  6. プレゼンスおよびインスタントメッセージング:SIPは音声およびビデオ通信に限定されません。プレゼンスおよびインスタントメッセージングもサポートし、幅広い統合通信アプリケーションを可能にします。

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

SIPメソッド

RFC 3261で定義されている主要なSIPメソッドには次のものがあります:

  1. INVITE:新しいセッション(通話)を開始するか、既存のセッションを変更するために使用されます。INVITEメソッドは、提案されたセッションの詳細(通常はSDPを使用)を受信者に通知するためにセッション記述を運びます。

  2. ACK:INVITEリクエストへの最終応答の受信を確認するために送信されます。ACKメソッドは、エンドツーエンドの確認を提供することでINVITEトランザクションの信頼性を確保します。

  3. BYE:確立されたセッション(通話)を終了するために使用されます。BYEメソッドは、通信を終了したいことを示すためにセッション内のどちらかのパーティによって送信されます。

  4. CANCEL:セッションが確立される前に保留中のINVITEリクエストをキャンセルするために送信されます。CANCELメソッドは、受信者からの応答がない場合や送信者が考えを変えた場合に、INVITEトランザクションを中止するために使用されます。

  5. OPTIONS:SIPサーバーまたはユーザーエージェントの機能をクエリするために使用されます。OPTIONSメソッドは、セッションを確立せずに、サポートされているメソッド、メディアタイプ、または他の拡張機能に関する情報をリクエストするために送信できます。

  6. REGISTER:ユーザーエージェントがSIPレジストラーサーバーに現在の場所を登録するために使用されます。REGISTERメソッドは、ユーザーのSIP URIと現在のIPアドレスのマッピングを最新の状態に保つのに役立ち、通話のルーティングと配信を可能にします。

誰かに電話をかけるためには、REGISTERを使用する必要はありません。 ただし、INVITEを実行するためには、発信者が最初に認証する必要があるか、そうしないと**401 Unauthorized**の応答を受け取る可能性があります。

これらの主要メソッドに加えて、他のRFCで定義されているいくつかのSIP拡張メソッドがあります:

  1. SUBSCRIBE:RFC 6665で定義されており、SUBSCRIBEメソッドは特定のリソース(ユーザーのプレゼンスや通話状態など)の状態に関する通知を要求するために使用されます。

  2. NOTIFY:RFC 6665でも定義されており、NOTIFYメソッドは、監視されているリソースの状態の変更について購読されたユーザーエージェントに通知するために送信されます。

  3. REFER:RFC 3515で定義されており、REFERメソッドは受信者に転送または第三者を参照するように要求するために使用されます。これは通常、通話転送シナリオで使用されます。

  4. MESSAGE:RFC 3428で定義されており、MESSAGEメソッドはSIPユーザーエージェント間でインスタントメッセージを送信するために使用され、SIPフレームワーク内でテキストベースの通信を可能にします。

  5. UPDATE:RFC 3311で定義されており、UPDATEメソッドは既存のダイアログの状態に影響を与えることなくセッションを変更することを可能にします。これは、通話中にコーデックやメディアタイプなどのセッションパラメータを更新するために役立ちます。

  6. PUBLISH:RFC 3903で定義されており、PUBLISHメソッドはユーザーエージェントがサーバーにイベント状態情報を公開するために使用され、他の関係者が利用できるようにします。

SIPレスポンスコード

  • 1xx(Provisional Responses):これらの応答はリクエストが受信され、サーバーが引き続き処理していることを示します。

    • 100 Trying:リクエストが受信され、サーバーが処理中です。

    • 180 Ringing:被呼者が警告され、通話を受けます。

    • 183 Session Progress:通話の進行状況に関する情報を提供します。

  • 2xx(Successful Responses):これらの応答はリクエストが正常に受信、理解、および受け入れられたことを示します。

    • 200 OK:リクエストが成功し、サーバーがそれを達成しました。

    • 202 Accepted:リクエストは処理のために受け入れられましたが、まだ完了していません。

  • 3xx(Redirection Responses):これらの応答は、リクエストを達成するために追加のアクションが必要であり、通常は別のリソースに連絡することによって行われます。

    • 300 Multiple Choices:複数のオプションが利用可能であり、ユーザーまたはクライアントが1つを選択する必要があります。

    • 301 Moved Permanently:要求されたリソースには新しい恒久的URIが割り当てられています。

    • 302 Moved Temporarily:要求されたリソースは一時的に別のURIで利用可能です。

    • 305 Use Proxy:リクエストを指定されたプロキシに送信する必要があります。

  • 4xx(Client Error Responses):これらの応答は、リクエストに悪い構文が含まれているか、サーバーによって達成できないことを示します。

    • 400 Bad Request:リクエストが誤って形成されたか無効です。

    • 401 Unauthorized:リクエストにはユーザー認証が必要です。

    • 403 Forbidden:サーバーはリクエストを理解しましたが、それを達成することを拒否します。

    • 404 Not Found:要求されたリソースがサーバー上で見つかりませんでした。

    • 408 Request Timeout:サーバーは、待機する時間内に完全なリクエストを受信しませんでした。

    • 486 Busy Here:被呼者は現在忙しく、通話を受けることができません。

  • 5xx(Server Error Responses):これらの応答は、サーバーが有効なリクエストを達成できなかったことを示します。

    • 500 Internal Server Error:サーバーはリクエストの処理中にエラーが発生しました。

    • 501 Not Implemented:サーバーはリクエストを達成するために必要な機能をサポートしていません。

    • 503 Service Unavailable:サーバーは現在、メンテナンスまたは過負荷のためにリクエストを処理できません。

  • 6xx(Global Failure Responses):これらの応答は、リクエストをどのサーバーも達成できないことを示します。

    • 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)、リクエストURI(sip: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 URI(sip:jdoe@example.com)を含みます。

  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - Fromヘッダーは、通話の送信者を指定し、表示名(Jane Smith)とSIP URI(sip: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(Session Description Protocol)です。

  12. Content-Length: Content-Length: 142 - Content-Lengthヘッダーは、メッセージボディのサイズをバイト単位で示します。

  13. Message Body: メッセージボディには、提案されたセッションのメディアタイプ、コーデック、およびトランスポートプロトコルに関する情報を含むSDPセッション記述が含まれています。

  • v=0 - プロトコルバージョン(SDPの場合は0)

  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - 発信者およびセッション識別子

  • s=- - セッション名(単一のハイフンはセッション名がないことを示します)

  • c=IN IP4 pc33.example.com - 接続情報(ネットワークタイプ、アドレスタイプ、アドレス)

  • t=0 0 - タイミング情報(開始時刻と終了時刻、0 0はセッションが境界を持たないことを意味します)

  • m=audio 49170 RTP/AVP 0 - メディアの説明(メディアタイプ、ポート番号、トランスポートプロトコル、およびフォーマットリスト)。この場合、RTP/AVP(リアルタイムトランスポートプロトコル/オーディオビデオプロファイル)を使用したオーディオストリームとフォーマット0(PCMU/8000)を指定しています。

  • a=rtpmap:0 PCMU/8000 - フォーマット(0)をコーデック(PCMU)およびそのクロックレート(8000 Hz)にマッピングする属性。

SIP REGISTERの例

REGISTERメソッドは、Session Initiation Protocol(SIP)で使用され、ユーザーエージェント(UA)(例:VoIP電話またはソフトフォン)が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メッセージは、UA(Alice)から登録サーバーに送信されます。これには、希望する登録期間(Expires)、ユーザーのSIP URI(sip: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

Registrarサーバーは、「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は別のREGISTERリクエストを送信し、今回はユーザー名、レルム、ノンス、およびユーザーのパスワードを使用して計算された応答値など、必要な資格情報を含む**"Authorization"ヘッダー**を含めます。

これがAuthorizarion応答が計算される方法です:

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リクエストは適切な連絡先アドレスにルーティングされます。

通話の例

言及されていませんが、User B はProxy 2 に REGISTER メッセージを送信してから通話を受けることができます。

Last updated