SIP (Session Initiation Protocol)

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!

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 (실시간 전송 프로토콜) 및 멀티미디어 세션을 설명하기 위해 **SDP (세션 설명 프로토콜)**와 같은 다른 프로토콜과 함께 작동합니다. 이 모듈식 설계는 다양한 미디어 유형 및 코덱과의 더 큰 유연성과 호환성을 제공합니다.

  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 (임시 응답): 이러한 응답은 요청이 수신되었으며 서버가 계속 처리 중임을 나타냅니다.

    • 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 (Session Description Protocol)를 나타냅니다.

  12. Content-Length: Content-Length: 142 - Content-Length 헤더는 바이트 단위의 메시지 본문 크기를 나타냅니다.

  13. 메시지 본문: 메시지 본문에는 제안된 세션의 미디어 유형, 코덱 및 전송 프로토콜에 대한 정보를 포함하는 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(Real-time Transport Protocol / Audio Video Profile)를 사용하는 오디오 스트림을 지정하며 형식 0 (PCMU/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 메시지는 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가 자체를 인증하기 위해 필요한 정보인 인증 realm, nonce 및 알고리즘이 포함됩니다.

  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 요청을 보내는데, 이번에는 사용자 이름, realm, 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 메시지를 보내야 합니다.

Last updated