SIP (Session Initiation Protocol)
Reading time: 14 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
SIP (Session Initiation Protocol) est un protocole de signalisation et de contrÎle des appels largement utilisé pour établir, modifier et terminer des sessions multimédias, y compris la voix, la vidéo et la messagerie instantanée, sur des réseaux IP. Développé par l'Internet Engineering Task Force (IETF), SIP est défini dans le RFC 3261 et est devenu la norme de facto pour la VoIP et les communications unifiées.
Certaines caractéristiques clés de SIP incluent :
- Protocole basĂ© sur du texte : SIP est un protocole basĂ© sur du texte, ce qui le rend lisible par l'homme et plus facile Ă dĂ©boguer. Il est basĂ© sur un modĂšle de requĂȘte-rĂ©ponse, similaire Ă HTTP, et utilise des mĂ©thodes comme INVITE, ACK, BYE et CANCEL pour contrĂŽler les sessions d'appel.
- ScalabilitĂ© et flexibilitĂ© : SIP est hautement Ă©volutif et peut ĂȘtre utilisĂ© dans des dĂ©ploiements Ă petite Ă©chelle ainsi que dans des environnements d'entreprise et de niveau opĂ©rateur. Il peut ĂȘtre facilement Ă©tendu avec de nouvelles fonctionnalitĂ©s, le rendant adaptable Ă divers cas d'utilisation et exigences.
- Interopérabilité : L'adoption et la normalisation généralisées de SIP garantissent une meilleure interopérabilité entre différents appareils, applications et fournisseurs de services, favorisant une communication fluide sur diverses plateformes.
- Conception modulaire : SIP fonctionne avec d'autres protocoles comme le RTP (Real-time Transport Protocol) pour la transmission multimédia et le SDP (Session Description Protocol) pour décrire les sessions multimédias. Cette conception modulaire permet une plus grande flexibilité et compatibilité avec différents types de médias et codecs.
- Serveurs proxy et de redirection : SIP peut utiliser des serveurs proxy et de redirection pour faciliter le routage des appels et fournir des fonctionnalités avancées comme le renvoi d'appels, le transfert d'appels et les services de messagerie vocale.
- Présence et messagerie instantanée : SIP n'est pas limité à la communication vocale et vidéo. Il prend également en charge la présence et la messagerie instantanée, permettant une large gamme d'applications de communication unifiée.
MalgrĂ© ses nombreux avantages, SIP peut ĂȘtre complexe Ă configurer et Ă gĂ©rer, en particulier lorsqu'il s'agit de la traversĂ©e NAT et des problĂšmes de pare-feu. Cependant, sa polyvalence, sa scalabilitĂ© et son large soutien dans l'industrie en font un choix populaire pour la VoIP et la communication multimĂ©dia.
MĂ©thodes SIP
Les méthodes SIP de base définies dans le RFC 3261 incluent :
- INVITE : Utilisé pour initier une nouvelle session (appel) ou modifier une session existante. La méthode INVITE transporte la description de la session (généralement en utilisant SDP) pour informer le destinataire des détails de la session proposée, tels que les types de médias, les codecs et les protocoles de transport.
- ACK : Envoyé pour confirmer la réception d'une réponse finale à une demande INVITE. La méthode ACK garantit la fiabilité des transactions INVITE en fournissant une reconnaissance de bout en bout.
- BYE : Utilisé pour terminer une session établie (appel). La méthode BYE est envoyée par l'une ou l'autre des parties dans la session pour indiquer qu'elles souhaitent mettre fin à la communication.
- CANCEL : Envoyé pour annuler une demande INVITE en attente avant que la session ne soit établie. La méthode CANCEL permet à l'expéditeur d'abandonner une transaction INVITE s'il change d'avis ou s'il n'y a pas de réponse du destinataire.
- OPTIONS : UtilisĂ© pour interroger les capacitĂ©s d'un serveur SIP ou d'un agent utilisateur. La mĂ©thode OPTIONS peut ĂȘtre envoyĂ©e pour demander des informations sur les mĂ©thodes prises en charge, les types de mĂ©dias ou d'autres extensions sans Ă©tablir rĂ©ellement une session.
- REGISTER : Utilisé par un agent utilisateur pour enregistrer sa position actuelle auprÚs d'un serveur d'enregistrement SIP. La méthode REGISTER aide à maintenir une correspondance à jour entre l'URI SIP d'un utilisateur et son adresse IP actuelle, permettant le routage et la livraison des appels.
warning
Notez que pour appeler quelqu'un, il n'est pas nécessaire d'utiliser le REGISTER pour quoi que ce soit.
Cependant, il est possible que pour effectuer un INVITE, l'appelant doive d'abord s'authentifier ou il recevra une réponse 401 Unauthorized
.
En plus de ces méthodes de base, il existe plusieurs méthodes d'extension SIP définies dans d'autres RFC, telles que :
- SUBSCRIBE : Définie dans le RFC 6665, la méthode SUBSCRIBE est utilisée pour demander des notifications sur l'état d'une ressource spécifique, comme la présence d'un utilisateur ou l'état d'un appel.
- NOTIFY : Ăgalement dĂ©finie dans le RFC 6665, la mĂ©thode NOTIFY est envoyĂ©e par un serveur pour informer un agent utilisateur abonnĂ© des changements dans l'Ă©tat d'une ressource surveillĂ©e.
- REFER : Définie dans le RFC 3515, la méthode REFER est utilisée pour demander que le destinataire effectue un transfert ou se réfÚre à un tiers. Cela est généralement utilisé pour des scénarios de transfert d'appel.
- MESSAGE : Définie dans le RFC 3428, la méthode MESSAGE est utilisée pour envoyer des messages instantanés entre des agents utilisateurs SIP, permettant une communication textuelle au sein du cadre SIP.
- UPDATE : Définie dans le RFC 3311, la méthode UPDATE permet de modifier une session sans affecter l'état du dialogue existant. Cela est utile pour mettre à jour les paramÚtres de session, tels que les codecs ou les types de médias, pendant un appel en cours.
- PUBLISH : Définie dans le RFC 3903, la méthode PUBLISH est utilisée par un agent utilisateur pour publier des informations d'état d'événement sur un serveur, les rendant disponibles à d'autres parties intéressées.
Codes de réponse SIP
- 1xx (Réponses provisoires) : Ces réponses indiquent que la demande a été reçue et que le serveur continue de la traiter.
- 100 Trying : La demande a été reçue et le serveur y travaille.
- 180 Ringing : Le destinataire est alerté et va prendre l'appel.
- 183 Session Progress : Fournit des informations sur l'avancement de l'appel.
- 2xx (Réponses réussies) : Ces réponses indiquent que la demande a été reçue, comprise et acceptée avec succÚs.
- 200 OK : La demande a été réussie et le serveur l'a remplie.
- 202 Accepted : La demande a été acceptée pour traitement, mais elle n'est pas encore terminée.
- 3xx (Réponses de redirection) : Ces réponses indiquent qu'une action supplémentaire est requise pour satisfaire la demande, généralement en contactant une ressource alternative.
- 300 Multiple Choices : Il existe plusieurs options disponibles, et l'utilisateur ou le client doit en choisir une.
- 301 Moved Permanently : La ressource demandée a été assignée à un nouvel URI permanent.
- 302 Moved Temporarily : La ressource demandée est temporairement disponible à un URI différent.
- 305 Use Proxy : La demande doit ĂȘtre envoyĂ©e Ă un proxy spĂ©cifiĂ©.
- 4xx (RĂ©ponses d'erreur client) : Ces rĂ©ponses indiquent que la demande contient une mauvaise syntaxe ou ne peut pas ĂȘtre satisfaite par le serveur.
- 400 Bad Request : La demande était mal formée ou invalide.
- 401 Unauthorized : La demande nécessite une authentification de l'utilisateur.
- 403 Forbidden : Le serveur a compris la demande mais refuse de la satisfaire.
- 404 Not Found : La ressource demandée n'a pas été trouvée sur le serveur.
- 408 Request Timeout : Le serveur n'a pas reçu une demande complĂšte dans le temps qu'il Ă©tait prĂȘt Ă attendre.
- 486 Busy Here : Le destinataire est actuellement occupé et ne peut pas prendre l'appel.
- 5xx (Réponses d'erreur serveur) : Ces réponses indiquent que le serveur a échoué à satisfaire une demande valide.
- 500 Internal Server Error : Le serveur a rencontré une erreur lors du traitement de la demande.
- 501 Not Implemented : Le serveur ne prend pas en charge la fonctionnalité requise pour satisfaire la demande.
- 503 Service Unavailable : Le serveur est actuellement incapable de traiter la demande en raison de maintenance ou de surcharge.
- 6xx (RĂ©ponses d'Ă©chec global) : Ces rĂ©ponses indiquent que la demande ne peut pas ĂȘtre satisfaite par aucun serveur.
- 600 Busy Everywhere : Tous les destinations possibles pour l'appel sont occupées.
- 603 Decline : Le destinataire ne souhaite pas participer Ă l'appel.
- 604 Does Not Exist Anywhere : La ressource demandée n'est disponible nulle part dans le réseau.
Exemples
Exemple 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
Chaque ParamÚtre Expliqué
- Request-Line:
INVITE sip:jdoe@example.com SIP/2.0
- Cette ligne indique la mĂ©thode (INVITE), l'URI de la requĂȘte (sip:jdoe@example.com), et la version SIP (SIP/2.0). - Via:
Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds
- L'en-tĂȘte Via spĂ©cifie le protocole de transport (UDP) et l'adresse du client (pc33.example.com). Le paramĂštre "branch" est utilisĂ© pour la dĂ©tection de boucle et la correspondance des transactions. - Max-Forwards:
Max-Forwards: 70
- Ce champ d'en-tĂȘte limite le nombre de fois que la requĂȘte peut ĂȘtre transfĂ©rĂ©e par des proxies pour Ă©viter des boucles infinies. - To:
To: John Doe <sip:jdoe@example.com>
- L'en-tĂȘte To spĂ©cifie le destinataire de l'appel, y compris son nom d'affichage (John Doe) et l'URI SIP (sip:jdoe@example.com). - From:
From: Jane Smith <sip:jsmith@example.org>;tag=1928301774
- L'en-tĂȘte From spĂ©cifie l'expĂ©diteur de l'appel, y compris son nom d'affichage (Jane Smith) et l'URI SIP (sip:jsmith@example.org). Le paramĂštre "tag" est utilisĂ© pour identifier de maniĂšre unique le rĂŽle de l'expĂ©diteur dans le dialogue. - Call-ID:
Call-ID: a84b4c76e66710
- L'en-tĂȘte Call-ID identifie de maniĂšre unique une session d'appel entre deux agents utilisateurs. - CSeq:
CSeq: 314159 INVITE
- L'en-tĂȘte CSeq contient un numĂ©ro de sĂ©quence et la mĂ©thode utilisĂ©e dans la requĂȘte. Il est utilisĂ© pour faire correspondre les rĂ©ponses aux requĂȘtes et dĂ©tecter les messages hors ordre. - Contact:
Contact: <sip:jsmith@pc33.example.com>
- L'en-tĂȘte Contact fournit un chemin direct vers l'expĂ©diteur, qui peut ĂȘtre utilisĂ© pour des requĂȘtes et rĂ©ponses ultĂ©rieures. - User-Agent:
User-Agent: ExampleSIPClient/1.0
- L'en-tĂȘte User-Agent fournit des informations sur le logiciel ou le matĂ©riel de l'expĂ©diteur, y compris son nom et sa version. - Allow:
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
- L'en-tĂȘte Allow liste les mĂ©thodes SIP prises en charge par l'expĂ©diteur. Cela aide le destinataire Ă comprendre quelles mĂ©thodes peuvent ĂȘtre utilisĂ©es lors de la communication. - Content-Type:
Content-Type: application/sdp
- L'en-tĂȘte Content-Type spĂ©cifie le type de mĂ©dia du corps du message, dans ce cas, SDP (Session Description Protocol). - Content-Length:
Content-Length: 142
- L'en-tĂȘte Content-Length indique la taille du corps du message en octets. - Message Body: Le corps du message contient la description de session SDP, qui inclut des informations sur les types de mĂ©dias, les codecs et les protocoles de transport pour la session proposĂ©e.
v=0
- Version du protocole (0 pour SDP)o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com
- Originateur et identifiant de sessions=-
- Nom de session (un seul tiret indique qu'il n'y a pas de nom de session)c=IN IP4 pc33.example.com
- Informations de connexion (type de réseau, type d'adresse et adresse)t=0 0
- Informations de timing (heures de début et de fin, 0 0 signifie que la session n'est pas limitée)m=audio 49170 RTP/AVP 0
- Description du média (type de média, numéro de port, protocole de transport et liste de formats). Dans ce cas, cela spécifie un flux audio utilisant RTP/AVP (Real-time Transport Protocol / Audio Video Profile) et le format 0 (PCMU/8000).a=rtpmap:0 PCMU/8000
- Attribut mappant le format (0) au codec (PCMU) et son taux d'horloge (8000 Hz).
Exemple SIP REGISTER
La mĂ©thode REGISTER est utilisĂ©e dans le protocole d'initiation de session (SIP) pour permettre Ă un agent utilisateur (UA), tel qu'un tĂ©lĂ©phone VoIP ou un softphone, de s'enregistrer auprĂšs d'un serveur d'enregistrement SIP. Ce processus permet au serveur de savoir oĂč acheminer les requĂȘtes SIP entrantes destinĂ©es Ă l'utilisateur enregistrĂ©. Le serveur d'enregistrement fait gĂ©nĂ©ralement partie d'un serveur proxy SIP ou d'un serveur d'enregistrement dĂ©diĂ©.
Voici un exemple détaillé des messages SIP impliqués dans un processus d'authentification REGISTER :
- RequĂȘte initiale REGISTER de l'UA au serveur d'enregistrement :
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
Ce message REGISTER initial est envoyé par l'UA (Alice) au serveur d'enregistrement. Il inclut des informations importantes telles que la durée d'enregistrement souhaitée (Expires), l'URI SIP de l'utilisateur (sip:alice@example.com), et l'adresse de contact de l'utilisateur (sip:alice@192.168.1.100:5060).
- 401 Unauthorized réponse du serveur d'enregistrement :
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
Le serveur d'enregistrement rĂ©pond avec un message "401 Unauthorized", qui inclut un en-tĂȘte "WWW-Authenticate". Cet en-tĂȘte contient des informations nĂ©cessaires pour que l'UA s'authentifie, telles que le domaine d'authentification, le nonce et l'algorithme.
- Demande REGISTER avec des informations d'identification d'authentification :
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
L'UA envoie une autre requĂȘte REGISTER, cette fois en incluant l'en-tĂȘte "Authorization" avec les informations d'identification nĂ©cessaires, telles que le nom d'utilisateur, le domaine, le nonce et une valeur de rĂ©ponse calculĂ©e en utilisant les informations fournies et le mot de passe de l'utilisateur.
Voici comment la réponse d'Authorization est calculée :
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}")
- Réponse de registration réussie du serveur d'enregistrement :
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
AprĂšs que le serveur d'enregistrement a vĂ©rifiĂ© les informations d'identification fournies, il envoie une rĂ©ponse "200 OK" pour indiquer que l'enregistrement a rĂ©ussi. La rĂ©ponse inclut les informations de contact enregistrĂ©es et le temps d'expiration de l'enregistrement. Ă ce stade, l'agent utilisateur (Alice) est correctement enregistrĂ© auprĂšs du serveur d'enregistrement SIP, et les demandes SIP entrantes pour Alice peuvent ĂȘtre acheminĂ©es vers l'adresse de contact appropriĂ©e.
Exemple d'appel
.png)
note
Il n'est pas mentionné, mais l'utilisateur B doit avoir envoyé un message REGISTER à Proxy 2 avant de pouvoir recevoir des appels.
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.