SIP (Session Initiation Protocol)

Support HackTricks

기본 정보

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 주소 간의 최신 매핑을 유지하는 데 도움을 주어 통화 라우팅 및 전달을 가능하게 합니다.

누군가에게 전화를 걸기 위해서는 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 <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 헤더는 두 사용자 에이전트 간의 통화 세션을 고유하게 식별합니다.

  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. 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 요청:

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(앨리스)가 등록 서버에 전송합니다. 여기에는 원하는 등록 기간(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

The registrar server responds with a "401 Unauthorized" message, which includes a "WWW-Authenticate" header. This header contains information required for the UA to authenticate itself, such as the authentication realm, nonce, and algorithm.

  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 요청을 보냅니다. 이번에는 필요한 자격 증명, 즉 사용자 이름, 영역, nonce 및 제공된 정보와 사용자의 비밀번호를 사용하여 계산된 응답 값을 포함한 "Authorization" 헤더를 포함합니다.

이것이 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" 응답을 보냅니다. 응답에는 등록된 연락처 정보와 등록의 만료 시간이 포함됩니다. 이 시점에서 사용자 에이전트(앨리스)는 SIP 등록 서버에 성공적으로 등록되었으며, 앨리스를 위한 수신 SIP 요청은 적절한 연락처 주소로 라우팅될 수 있습니다.

통화 예시

언급되지는 않았지만, 사용자 B는 전화를 받을 수 있기 전에 Proxy 2에 REGISTER 메시지를 전송해야 합니다.

HackTricks 지원하기

Last updated