# SIP (Session Initiation Protocol) {{#include ../../../banners/hacktricks-training.md}} ## 기본 정보 SIP (Session Initiation Protocol)는 **신호 및 통화 제어 프로토콜**로, IP 네트워크를 통해 음성, 비디오 및 인스턴트 메시징을 포함한 멀티미디어 세션을 설정, 수정 및 종료하는 데 널리 사용됩니다. **인터넷 엔지니어링 태스크 포스 (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 주소 간의 최신 매핑을 유지하는 데 도움을 주어 통화 라우팅 및 전달을 가능하게 합니다. > [!WARNING] > 누군가에게 전화를 걸기 위해서는 **REGISTER**를 사용할 필요가 **없습니다**.\ > 그러나 **INVITE**를 수행하기 위해 발신자가 먼저 **인증**해야 할 수도 있으며, 그렇지 않으면 **`401 Unauthorized`** 응답을 받을 수 있습니다. 이러한 핵심 메서드 외에도 다른 RFC에서 정의된 **여러 SIP 확장 메서드**가 있습니다: 1. **SUBSCRIBE**: RFC 6665에 정의된 SUBSCRIBE 메서드는 특정 리소스의 상태(예: 사용자의 프레즌스 또는 통화 상태)에 대한 **알림을 요청하기 위해** 사용됩니다. 2. **NOTIFY**: RFC 6665에 정의된 NOTIFY 메서드는 서버가 **구독된 사용자 에이전트**에게 모니터링된 리소스의 상태 변경에 대해 **알리기 위해** 전송됩니다. 3. **REFER**: RFC 3515에 정의된 REFER 메서드는 수신자에게 **전환을 수행하거나 제3자를 참조하도록 요청하기 위해** 사용됩니다. 이는 일반적으로 **통화 전환** 시나리오에 사용됩니다. 4. **MESSAGE**: RFC 3428에 정의된 MESSAGE 메서드는 SIP 사용자 에이전트 간에 **인스턴트 메시지를 전송하기 위해** 사용되며, SIP 프레임워크 내에서 텍스트 기반 통신을 가능하게 합니다. 5. **UPDATE**: RFC 3311에 정의된 UPDATE 메서드는 **기존 대화의 상태에 영향을 주지 않고 세션을 수정할 수 있게** 합니다. 이는 진행 중인 통화 중에 코덱이나 미디어 유형과 같은 세션 매개변수를 업데이트하는 데 유용합니다. 6. **PUBLISH**: RFC 3903에 정의된 PUBLISH 메서드는 사용자 에이전트가 **이벤트 상태 정보를 서버에 게시하여** 다른 관심 있는 당사자에게 제공할 수 있도록 합니다. ### SIP 응답 코드 - **1xx (임시 응답)**: 이러한 응답은 요청이 수신되었으며 서버가 계속 처리 중임을 나타냅니다. - 100 Trying: 요청이 수신되었으며 서버가 작업 중입니다. - 180 Ringing: 수신자가 알림을 받고 있으며 전화를 받을 것입니다. - 183 Session Progress: 통화 진행 상황에 대한 정보를 제공합니다. - **2xx (성공적인 응답)**: 이러한 응답은 요청이 성공적으로 수신, 이해 및 수락되었음을 나타냅니다. - 200 OK: 요청이 성공적이며 서버가 이를 이행했습니다. - 202 Accepted: 요청이 처리 중으로 수락되었지만 아직 완료되지 않았습니다. - **3xx (리디렉션 응답)**: 이러한 응답은 요청을 이행하기 위해 추가 조치가 필요함을 나타내며, 일반적으로 대체 리소스에 연락해야 합니다. - 300 Multiple Choices: 여러 옵션이 있으며 사용자가 하나를 선택해야 합니다. - 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 From: Jane Smith ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: 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](mailto: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 ` - To 헤더는 통화의 수신자를 지정하며, 표시 이름(John Doe)과 SIP URI(sip:[jdoe@example.com](mailto:jdoe@example.com))을 포함합니다. 5. **From**: `From: Jane Smith ;tag=1928301774` - From 헤더는 통화의 발신자를 지정하며, 표시 이름(Jane Smith)과 SIP URI(sip:[jsmith@example.org](mailto:jsmith@example.org))을 포함합니다. "tag" 매개변수는 대화에서 발신자의 역할을 고유하게 식별하는 데 사용됩니다. 6. **Call-ID**: `Call-ID: a84b4c76e66710` - Call-ID 헤더는 두 사용자 에이전트 간의 통화 세션을 고유하게 식별합니다. 7. **CSeq**: `CSeq: 314159 INVITE` - CSeq 헤더는 시퀀스 번호와 요청에 사용된 메서드를 포함합니다. 이는 응답을 요청과 일치시키고 순서가 뒤바뀐 메시지를 감지하는 데 사용됩니다. 8. **Contact**: `Contact: ` - 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. **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 메서드는 세션 시작 프로토콜(SIP)에서 사용자 에이전트(UA), 예를 들어 VoIP 전화기나 소프트폰이 **SIP 등록 서버에 자신의 위치를 등록할 수 있도록** 사용됩니다. 이 과정은 서버가 **등록된 사용자에게 도착하는 SIP 요청을 어디로 라우팅해야 하는지 알 수 있게 해줍니다**. 등록 서버는 일반적으로 SIP 프록시 서버 또는 전용 등록 서버의 일부입니다. 다음은 REGISTER 인증 프로세스에 관련된 SIP 메시지의 자세한 예입니다: 1. UA에서 등록 서버로의 초기 **REGISTER** 요청: ```yaml REGISTER sip:example.com SIP/2.0 Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds Max-Forwards: 70 From: Alice ;tag=565656 To: Alice Call-ID: 1234567890@192.168.1.100 CSeq: 1 REGISTER Contact: ;expires=3600 Expires: 3600 Content-Length: 0 ``` 이 초기 REGISTER 메시지는 UA(앨리스)가 등록 서버에 전송합니다. 여기에는 원하는 등록 기간(Expires), 사용자의 SIP URI (sip:[alice@example.com](mailto:alice@example.com)), 및 사용자의 연락처 주소(sip:alice@192.168.1.100:5060)와 같은 중요한 정보가 포함됩니다. 2. **401 Unauthorized** 등록 서버의 응답: ```css cssCopy codeSIP/2.0 401 Unauthorized Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds From: Alice ;tag=565656 To: Alice ;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가 자신을 인증하는 데 필요한 정보가 포함되어 있습니다. 예를 들어 **인증 영역, nonce 및 알고리즘**이 있습니다. 3. 인증 자격 증명 **이 포함된 REGISTER 요청**: ```vbnet REGISTER sip:example.com SIP/2.0 Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds Max-Forwards: 70 From: Alice ;tag=565656 To: Alice Call-ID: 1234567890@192.168.1.100 CSeq: 2 REGISTER Contact: ;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 요청을 보내며, 이번에는 **필요한 자격 증명(예: 사용자 이름, 영역, nonce 및 제공된 정보와 사용자의 비밀번호를 사용하여 계산된 응답 값)**이 포함된 **"Authorization" 헤더**를 포함합니다. 이것이 **Authorization 응답**이 계산되는 방법입니다: ```python 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}") ``` 4. **성공적인 등록** 응답은 등록 서버에서: ```yaml SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds From: Alice ;tag=565656 To: Alice ;tag=7878744 Call-ID: 1234567890@192.168.1.100 CSeq: 2 REGISTER Contact: ;expires=3600 Expires: 3600 Content-Length: 0 ``` 등록 서버가 제공된 자격 증명을 확인한 후, **등록이 성공했음을 나타내기 위해 "200 OK" 응답을 보냅니다**. 응답에는 등록된 연락처 정보와 등록 만료 시간이 포함됩니다. 이 시점에서 사용자 에이전트(앨리스)는 SIP 등록 서버에 성공적으로 등록되었으며, 앨리스를 위한 수신 SIP 요청은 적절한 연락처 주소로 라우팅될 수 있습니다. ### 통화 예시
> [!NOTE] > 언급되지는 않았지만, 사용자 B는 전화를 받을 수 있기 전에 **Proxy 2에 REGISTER 메시지를 전송해야 합니다**. {{#include ../../../banners/hacktricks-training.md}}