22 KiB
SIP(セッション開始プロトコル)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはテレグラムグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
基本情報
SIP(セッション開始プロトコル)は、IPネットワーク上で音声、ビデオ、インスタントメッセージングなどのマルチメディアセッションを確立、変更、終了するために広く使用されるシグナリングおよびコール制御プロトコルです。SIPは**Internet Engineering Task Force(IETF)**によって開発され、RFC 3261で定義され、VoIPおよび統合コミュニケーションの事実上の標準となっています。
SIPの主な特徴は次のとおりです。
- テキストベースのプロトコル:SIPはテキストベースのプロトコルであり、人間が読みやすくデバッグしやすい特徴があります。HTTPと同様の要求-応答モデルに基づき、INVITE、ACK、BYE、CANCELなどのメソッドを使用して通話セッションを制御します。
- スケーラビリティと柔軟性:SIPは非常にスケーラブルであり、小規模な展開から大企業やキャリアグレードの環境まで使用することができます。新機能を簡単に追加できるため、さまざまなユースケースや要件に適応することができます。
- 相互運用性:SIPの広範な採用と標準化により、さまざまなデバイス、アプリケーション、サービスプロバイダ間での相互運用性が向上し、さまざまなプラットフォーム間でのシームレスな通信が促進されます。
- モジュラーデザイン:SIPは、メディアの送信に**RTP(リアルタイムトランスポートプロトコル)やマルチメディアセッションの説明にSDP(セッション記述プロトコル)**などの他のプロトコルと連携します。このモジュラーデザインにより、さまざまなメディアタイプやコーデックとの互換性と柔軟性が向上します。
- プロキシおよびリダイレクトサーバー:SIPはプロキシおよびリダイレクトサーバーを使用して通話ルーティングを容易にし、通話転送、通話転送、ボイスメールサービスなどの高度な機能を提供することができます。
- プレゼンスおよびインスタントメッセージング:SIPは音声およびビデオ通信に限定されません。プレゼンスおよびインスタントメッセージングもサポートしており、さまざまな統合コミュニケーションアプリケーションを可能にします。
多くの利点があるにもかかわらず、SIPはNATトラバーサルやファイアウォールの問題に対処する際に複雑になる場合があります。ただし、その汎用性、スケーラビリティ、業界全体での広範なサポートにより、VoIPおよびマルチメディア通信において人気のある選択肢となっています。
SIPメソッド
RFC 3261で定義されているSIPの主要なメソッドは次のとおりです。
- INVITE:新しいセッション(通話)を開始または既存のセッションを変更するために使用されます。INVITEメソッドはセッションの詳細(通常はSDPを使用)を受信者に通知するためにセッションの説明を運びます。メディアタイプ、コーデック、トランスポートプロトコルなどの詳細が含まれます。
- ACK:INVITEリクエストへの最終応答の受信を確認するために送信されます。ACKメソッドは、エンドツーエンドの確認を提供することにより、INVITEトランザクションの信頼性を確保します。
- BYE:確立されたセッション(通話)を終了するために使用されます。BYEメソッドは、セッションのいずれかのパーティが通信を終了したいことを示すために送信されます。
- CANCEL:セッションが確立される前に保留中のINVITEリクエストをキャンセルするために送信されます。CANCELメソッドは、送信者が考えを変えた場合や受信者からの応答がない場合にINVITEトランザクションを中止するために使用されます。
- OPTIONS:SIPサーバーまたはユーザーエージェントの機能をクエリするために使用されます。OPTIONSメソッドは、セッションを確立せずに、サポートされているメソッド、メディアタイプ、または他の拡張機能に関する情報をリクエストするために送信されることがあります。
- 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
各パラメータの説明
- Request-Line:
INVITE sip:jdoe@example.com SIP/2.0
- この行はメソッド(INVITE)、リクエストURI(sip:jdoe@example.com)、およびSIPバージョン(SIP/2.0)を示しています。 - Via:
Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds
- Viaヘッダーはトランスポートプロトコル(UDP)とクライアントのアドレス(pc33.example.com)を指定します。"branch"パラメータはループ検出とトランザクションのマッチングに使用されます。 - Max-Forwards:
Max-Forwards: 70
- このヘッダーフィールドは、無限ループを避けるためにプロキシによってリクエストが転送される回数を制限します。 - To:
To: John Doe <sip:jdoe@example.com>
- Toヘッダーは、通話の受信者を指定します。表示名(John Doe)とSIP URI(sip:jdoe@example.com)が含まれます。 - From:
From: Jane Smith <sip:jsmith@example.org>;tag=1928301774
- Fromヘッダーは、通話の送信者を指定します。表示名(Jane Smith)とSIP URI(sip:jsmith@example.org)が含まれます。"tag"パラメータは、ダイアログ内で送信者の役割を一意に識別するために使用されます。 - Call-ID:
Call-ID: a84b4c76e66710
- Call-IDヘッダーは、2つのユーザーエージェント間の通話セッションを一意に識別します。 - CSeq:
CSeq: 314159 INVITE
- CSeqヘッダーにはシーケンス番号とリクエストで使用されるメソッドが含まれています。これは、応答をリクエストに一致させ、順序が逆になったメッセージを検出するために使用されます。 - Contact:
Contact: <sip:jsmith@pc33.example.com>
- Contactヘッダーは、送信者への直接ルートを提供し、後続のリクエストと応答に使用できます。 - User-Agent:
User-Agent: ExampleSIPClient/1.0
- User-Agentヘッダーは、送信者のソフトウェアまたはハードウェアに関する情報を提供します。名前とバージョンが含まれます。 - Allow:
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
- Allowヘッダーは、送信者がサポートするSIPメソッドのリストを示します。これにより、受信者は通信中に使用できるメソッドを理解するのに役立ちます。 - Content-Type:
Content-Type: application/sdp
- Content-Typeヘッダーは、メッセージボディのメディアタイプを指定します。この場合はSDP(セッション記述プロトコル)です。 - Content-Length:
Content-Length: 142
- Content-Lengthヘッダーは、メッセージボディのサイズをバイト単位で示します。 - メッセージボディ: メッセージボディには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(リアルタイムトランスポートプロトコル/オーディオビデオプロファイル)を使用したオーディオストリームを指定し、フォーマット0(PCMU/8000)を指定しています。a=rtpmap:0 PCMU/8000
- フォーマット(0)をコーデック(PCMU)とそのクロックレート(8000 Hz)にマッピングする属性。
SIP REGISTERの例
REGISTERメソッドは、セッション開始プロトコル(SIP)で使用され、VoIP電話やソフトフォンなどのユーザーエージェント(UA)がSIP登録サーバーに自分の場所を登録するために使用されます。このプロセスにより、サーバーは登録されたユーザー宛の着信SIPリクエストをどこにルーティングするかを知ることができます。登録サーバーは通常、SIPプロキシサーバーまたは専用の登録サーバーの一部です。
以下は、REGISTER認証プロセスに関与するSIPメッセージの詳細な例です:
- 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)などの重要な情報が含まれています。
- 登録サーバーからの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が自身を認証するために必要な情報が含まれています。具体的には、認証領域、ノンス、およびアルゴリズムです。
- 認証情報を含む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}")
- 登録成功 レジストラサーバーからの応答:
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リクエストは適切な連絡先アドレスにルーティングされます。
通話の例
![](/Mirrors/hacktricks/media/commit/d24d1f5a7c83f37063628cb777a7c95ac1edea23/.gitbook/assets/image%20%28666%29.png)
{% hint style="info" %} 言及されていませんが、ユーザーBは受信するためにはProxy 2に対してREGISTERメッセージを送信する必要があります。 {% endhint %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksであなたの会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけて、独占的なNFTのコレクションを発見してください。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。